簡體   English   中英

PHP - 禁止 IP 使用 MySQL 中的數組?

[英]PHP - Ban IP's Using Array From MySQL?

我想要一個基本腳本,如果用戶 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!"); 
}

我的總體問題是,如何獲取獲取的數據並將其放入數組中?

使用ip2long()函數將IP地址轉換為整數。 將這些整數存儲在數據庫中,並改用以下查詢。 正如GolezTroll在注釋中指出的那樣,請確保整數字段為UNSIGNED

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

這樣, banned表對於索引編制非常友好,並且您最多只會從表檢索一個條目。 您當前的代碼每次都會獲取每個條目,這給您的Web和mysql服務器都帶來了相當大的負擔。

另外,由於ip列應作為主鍵發揮作用,因此您可能可以從被禁止的表中刪除id列。

別。 將所有這些地址查詢到一個數組中是一種浪費。 只需使用如下查詢:

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位帶符號的。 這意味着IP地址以128或更高版本開頭的問題。 它將使您的比較混亂。

您已經將獲取的數據放入數組中。

$rows = $stmt->fetchAll();

$ rows數組應包含所有禁止的IP。 您可以通過添加進行檢查

print_r($rows);

在獲取所有語句之后。

希望這對您有幫助,如果還有其他問題,請詢問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM