[英]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.