我对许多AJAX调用运行安全检查,以查看我记录的请求是否有相同的IP.
我使用以下一组类函数来建立IP(可以通过负载平衡器来实现,因此是长时间的方法.
private function IPMask_Match ($network, $ip) {
$ip_arr = explode('/', $network);
if (count($ip_arr) < 2) {
$ip_arr = array($ip_arr[0], null);
}
$network_long = ip2long($ip_arr[0]);
$x = ip2long($ip_arr[1]);
$mask = long2ip($x) == $ip_arr[1] ? $x : 0xffffffff << (32 - $ip_arr[1]);
$ip_long = ip2long($ip);
return ($ip_long & $mask) == ($network_long & $mask);
}
private function IPCheck_RFC1918 ($IP) {
$PrivateIP = false;
if (!$PrivateIP) {
$PrivateIP = $this->IPMask_Match('127.0.0.0/8', $IP);
}
if (!$PrivateIP) {
$PrivateIP = $this->IPMask_Match('10.0.0.0/8', $IP);
}
if (!$PrivateIP) {
$PrivateIP = $this->IPMask_Match('172.16.0.0/12', $IP);
}
if (!$PrivateIP) {
$PrivateIP = $this->IPMask_Match('192.168.0.0/16', $IP);
}
return $PrivateIP;
}
public function getIP () {
$UsesProxy = (!empty($_SERVER['HTTP_X_FORWARDED_FOR']) || !empty($_SERVER['HTTP_CLIENT_IP'])) ? true : false;
if ($UsesProxy && !empty($_SERVER['HTTP_CLIENT_IP'])) {
$UserIP = $_SERVER['HTTP_CLIENT_IP'];
}
elseif ($UsesProxy && !empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$UserIP = $_SERVER['HTTP_X_FORWARDED_FOR'];
if (strstr($UserIP, ',')) {
$UserIPArray = explode(',', $UserIP);
foreach ($UserIPArray as $IPtoCheck) {
if (!$this->IPCheck_RFC1918($IPtoCheck)) {
$UserIP = $IPtoCheck;
break;
}
}
if ($UserIP == $_SERVER['HTTP_X_FORWARDED_FOR']) {
$UserIP = $_SERVER['REMOTE_ADDR'];
}
}
}
else{
$UserIP = $_SERVER['REMOTE_ADDR'];
}
return $UserIP;
}
Run Code Online (Sandbox Code Playgroud)
问题是我一直在通过代理操作的用户遇到问题.任何人都可以说明为什么会这样吗?我已经使用基本的免费代理在线尝试和模拟,但它看起来并没有获得可变的IP或任何东西 - 所以我不知道为什么这会说这两个IP不匹配.
我将首先解释什么是代理,以便我们都在同一页面上。
什么是代理
代理通常是代表用户访问互联网的一台计算机,然后代理将结果发送回用户。当可能有数百甚至数千其他人也在使用该一台计算机时,就会出现问题 - 并且他们都具有相同的 IP 地址,但通常标头表明用户是通过代理进行的。
我假设你的脚本(没有正确查看)将 IP 和标头混淆了。
不同的解决方案
有一个更好的办法。使用会话并在会话中保存密钥,确保他们在访问 ajax 页面之前首先访问过主站点。例子:
索引.php
session_start();
$_SESSION['ajax_ok'] = true;
Run Code Online (Sandbox Code Playgroud)
ajax/username_check.php
session_start();
if (empty($_SESSION['ajax_ok'])) {
die("You can not access this page...");
}
Run Code Online (Sandbox Code Playgroud)
这将强制他们必须首先访问您的主站点,并且客户端还必须支持大多数浏览器都会支持的会话,这有助于防止机器人等滥用您的 ajax 脚本。
比使用上面的代码更可靠、更简单的解决方案><
如果不能使用会话怎么办?
如果您无法在您所在的特定计算机上使用会话,您可以设置另一台计算机,重写会话处理程序(使用 php 提供的回调),或者不使用文件系统,而是使用其他内容(例如会话数据库) ?您的网站必须使用一些会话也可以使用的东西。例如,如果您有一个基于负载均衡器文件的会话,那么通常无论如何都无法工作,因此通常最好将会话更改为使用我上面提到的其他内容。
归档时间: |
|
查看次数: |
1770 次 |
最近记录: |