PHP - 禁止IP从MySQL使用数组?

时间:2012-11-28 23:04:03

标签: php arrays

如果用户IP位于禁止IP的数据库中,我希望有一个基本脚本会死在页面顶部。我有一个脚本,到目前为止将插入一个具有自动递增ID和IP的IP。我正在使用PDO库,如何从数据库中获取返回的数组并检查in_array?

以下是我如何返回数据库信息。

$query = " 
    SELECT 
        id, 
        ip
    FROM banned 
"; 

try 
{ 

    $stmt = $db->prepare($query); 
    $stmt->execute(); 
} 
catch(PDOException $ex) 
{ 

    die("Failed to run query: " . $ex->getMessage()); 
} 


$rows = $stmt->fetchAll();

然后这里只是我写的一个快速脚本,只是死在页面顶部并重定向。

if(in_array($_SERVER['REMOTE_ADDR'], $row["ip"])) 
{ 
header("Location: banned.php")
die("Banned!"); 
}

我的整体问题是,如何获取获取的数据并将其放入数组?

3 个答案:

答案 0 :(得分:0)

使用ip2long()功能将IP地址转换为整数。将这些整数存储在数据库中,然后使用以下查询。正如GolezTroll在评论中指出的那样,请确保整数字段为UNSIGNED

$query = 'SELECT id, ip FROM banned WHERE ip = ';
$query .= ip2long($_SERVER['REMOTE_ADDR']);
$query .= ' LIMIT 1';

这样,您的banned表对索引非常友好,而您最多只能从表中检索一个条目。您当前的代码每次都会获得每个条目,在您的Web服务器和mysql服务器上都会产生相当大的负载。

此外,您可以从禁止的表中删除id列,因为ip列应该作为主键自行运行。

答案 1 :(得分:0)

别。将所有这些地址查询到数组中是一种浪费。只需使用这样的查询:

SELECT 
  CASE WHEN EXISTS
    (SELECT 
      'x' 
    FROM 
      banned 
    WHERE 
      ip = :ip) THEN
    'Y'
  ELSE
    'N'
  END AS IsBanned

当然,您必须填写正确的IP地址:IP。 此查询始终返回1个记录。如果IP地址被禁止,该记录总是包含'Y',如果不是,则包含'N'。 即使您不小心禁止IP两次,查询也会继续工作,尽管我会通过在该字段上添加唯一约束(唯一索引)来阻止它。

但请注意,IP禁止并不理想。许多人每天仍然拥有不同的IP地址。这意味着他们仍然可以访问您的网站,而无辜的其他人则无法访问您的网站。此外,整个家庭和公司使用相同的IP,因此阻止1个用户,可以阻止整个公司成千上万。

IP地址(IPv4,即)可以存储在整数字段中。但请注意,如果通过参数传递IP地址,则必须将其作为字符串传递,即使字段本身是整数也是如此。 MySQL整数参数是32位的符号。这意味着从128或更高的IP地址开始出现问题。它会搞砸你的比较。

答案 2 :(得分:0)

您已经将获取的数据放入数组中。

$rows = $stmt->fetchAll();

数组$ rows应该包含所有被禁止的IP。你可以通过添加

来检查它
print_r($rows);
在获取所有语句之后

希望这会有所帮助,如果还有其他任何问题,那就请问。