我正在尝试遍历被阻止的IP地址文件。
即使他们应该匹配,我似乎也无法做到这一点。
以下是检查的代码。
$blocked_ips = file("/home/block_list.txt");
for ( $i = 0; $i < count($blocked_ips); $i++) {
if ( $_SERVER["REMOTE_ADDR"] == $blocked_ips[$i] ) {
exit;
}
}
这是我用来将IP地址添加到文件中的代码。
if ( $_SESSION["LogInAttempts"] >= "10" ) {
$block_ip = $_SERVER["REMOTE_ADDR"];
$block_ip = $block_ip . "\r\n";
file_put_contents("/home/block_list.txt", $block_ip, FILE_APPEND);
}
这是文件中的IP地址列表。 (仅限示例)
169.254.51.183
192.168.0.1
192.168.10.84
我不确定我做错了什么。
答案 0 :(得分:1)
根本不需要循环。您可以使用in_array()
。
<?php
// Read in blocked ips list.
$blockedIps = file('/home/block_list.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
// Check if ip is blocked.
if(in_array($_SERVER['REMOTE_ADDR'], $blockedIps)) {
exit;
}
答案 1 :(得分:1)
确保在从文件读取或接收用户输入时考虑空白。 trim()
是您此类案件的朋友,但正如杰克在评论中指出的那样,使用file()
中的FILE_IGNORE_NEW_LINES
将为您解决这个问题。正如文档所说:
<强> FILE_IGNORE_NEW_LINES 强>
不要在每个数组元素的末尾添加换行符
此外,您可能会发现foreach
比for
循环更舒服,但这最终会成为个人品味的问题。以下是file()
和foreach
中附加参数的变体:
$blocked_ips = file("/home/block_list.txt", FILE_IGNORE_NEW_LINES);
foreach($blocked_ips as $ip) {
if ($_SERVER["REMOTE_ADDR"] == $ip) {
exit;
}
}
另请注意,下面的代码中不应该有10
的引号,当然,使用PHP的类型杂耍功能,您的代码也可以使用。但是,尽可能精确地总是一个好主意。如果没有别的,为了清楚起见:它将使您的代码的意图更容易理解 - 也适用于您在很长一段时间后查看代码。
您还可以将字符串附加到REMOTE_ADDR
而不会出现问题(同样,个人品味的问题)。最后,请注意,如果我们想要非常正确,那么获取用户的IP地址并不像简单地调用$_SERVER['REMOTE_ADDR']
那样简单,但是对于大多数用途来说,它就足够了。尽管如此,关于StackOverflow上的getting the IP address of a user in PHP还是有一个非常有趣的讨论我建议所有人阅读。
if ($_SESSION["LogInAttempts"] >= 10) {
$block_ip = $_SERVER["REMOTE_ADDR"] . "\r\n";
file_put_contents("/home/block_list.txt", $block_ip, FILE_APPEND);
}