PHP防止被爬虫模拟登录的安全方案

dafenqi
2023-12-29 / 0 评论 / 19 阅读 / 正在检测是否收录...

PHP防止被爬虫模拟登录的安全方案

随着互联网的不断发展,各种爬虫工具也应运而生。其中,模拟登录成为一种常见的技术手段。通过模拟登录,即可直接获取目标网站的数据,而不必单独爬取。然而,这也带来了一定的安全隐患。今天,我们介绍一种PHP的防爬虫模拟登录的安全方案,可有效保护目标网站的安全。

1. 验证码机制

验证码是防止爬虫模拟登录的最简单有效的方法之一。通过在登录页面中加入验证码,可以防止大部分的爬虫工具。具体实现方法如下:

1)在登录页面中加入验证码输入框和验证码图片

//login.php

<?php

session_start();

$code = rand(1000,9999);

$_SESSION["code"] = $code;

$im = imagecreate(60, 20);

$black = imagecolorallocate($im, 0, 0, 0);

$white = imagecolorallocate($im, 255, 255, 255);

imagestring($im, 5, 5, 2, $code, $white);

header("Content-type: image/png");

imagepng($im);

imagedestroy($im);

?>
//在表单中显示验证码图片和输入框

<form action="check_login.php" method="post">

    <label>用户名:<input type="text" name="username"></label>

    <br>

    <label>密 码:<input type="password" name="password"></label>

    <br>

    <label>验证码:<input type="text" name="code"></label>

    <img src="login.php" />

    <input type="submit" value="登录">

</form>

2)在后台验证验证码是否正确

//check_login.php

session_start();

if(strtoupper($_POST["code"]) != $_SESSION["code"]){

    echo "验证码错误";

}else{

    //验证码正确,进行其他验证或操作

}

值得注意的是,此方法防止不了爬虫工具通过OCR技术解析验证码的攻击。

2. 加密验证机制

通过加密验证,可以防止爬虫工具直接获取登录接口的URL和参数。具体实现方法如下:

1)获取加密密钥

//获取密钥

$rand_str = substr(md5(uniqid()), 0, 6);

$timestamp = time();

$key = md5($rand_str . $timestamp);

2)将密钥以及需要传递的参数进行加密处理

//加密

$param = array("username" => "xxxx", "password" => "xxxx");

$param_str = http_build_query($param);

$encrypted_str = bin2hex(openssl_encrypt($param_str, 'AES-128-ECB', $key));

3)将加密后的字符串以及密钥传递给后台验证

//传递

$url = "http://xxx.com/check_login.php";

$fields = array("param" => $encrypted_str, "key" => $key);

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, $url);

curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($curl, CURLOPT_POST, 1);

curl_setopt($curl, CURLOPT_POSTFIELDS, $fields);

$res = curl_exec($curl);

4)在后台进行解密验证

//check_login.php

$key = $_POST['key'];

$encrypted_str = $_POST['param'];

$param_str = openssl_decrypt(hex2bin($encrypted_str), 'AES-128-ECB', $key);

$param_arr = array();

parse_str($param_str, $param_arr);

$username = $param_arr['username'];

$password = $param_arr['password'];

此方法可以有效防止爬虫工具直接获取URL和参数,增加了攻击难度。

3. 动态令牌机制

通过动态令牌机制,可以防止爬虫工具通过抓包攻击获取登录接口的URL和参数。具体实现方法如下:

1)在登录页面中加入动态令牌输入框

//login.php

session_start();

$token = md5(uniqid());

$_SESSION['token'] = $token;
<form action="check_login.php" method="post">

    <label>用户名:<input type="text" name="username"></label>

    <br>

    <label>密 码:<input type="password" name="password"></label>

    <br>

    <label>动态令牌:<input type="text" name="token"></label>

    <input type="submit" value="登录">

</form>

2)在后台验证动态令牌是否正确

//check_login.php

session_start();

if($_POST['token'] != $_SESSION['token']){

    echo "动态令牌错误";

}else{

    //动态令牌正确,进行其他验证或操作

}

此方法可以防止爬虫工具通过抓包攻击获取登录接口的URL和参数,增加了攻击难度。

总结

通过以上三种方法,可以有效防止爬虫工具模拟登录,保护目标网站的安全。当然,防范措施可以更加细致和多样化,这需要根据实际情况进行调整和改进。

0

Deprecated: strtolower(): Passing null to parameter #1 ($string) of type string is deprecated in /www/wwwroot/testblog.58heshihu.com/var/Widget/Archive.php on line 1032

评论 (0)

取消