我正在编写一个脚本,其中php会伪造,并在< / file>之后广告它标签,它不包括在内。主要目的是记录此.htaccess文件中的每个IP,以便无法访问此特定文件。这是我的代码:(在google& php.net上搜索大约3个多小时)。我想是否有办法从文件.htaccess中读取“word”< / file>在它之前添加$ ip。或者在< file forum.php中获取$ badpersonip的其他方法 *(我不能使用数据库,因此只需要从PHP和.htaccess完成)
<?php
$badpersonip = $_SERVER['REMOTE_ADDR'];
echo "You have been banned $badpersonip , dont spam!! <br> ";
$ip = "deny from $badpersonip \n";
$banip = '.htaccess';
$fp = fopen($banip, "a");
$write = fputs($fp, $ip);
?>
此处还有我的.htaccess代码:
<files forum.php>
Order Allow,Deny
Allow from all
deny from 127.0.2.1
deny from 127.1.2.1
</files>
deny from 127.0.0.3
正如您所看到的那样,广告新IP,但在文件标签关闭后的底部。 :(
感谢您的帮助,非常感谢。
答案 0 :(得分:3)
如果不是使用fwrite()
而是将整个内容读入包含file_get_contents()
的字符串,您可以轻松地str_replace()
用新行代替现有的</files>
</files>
// Read the while file into a string $htaccess
$htaccess = file_get_contents('.htaccess');
// Stick the new IP just before the closing </files>
$new_htaccess = str_replace('</files>', "deny from $badpersonip\n</files>", $htaccess);
// And write the new string back to the file
file_put_contents('.htaccess', $new_htaccess);
如果您希望文件变得非常大,则不建议这样做,但对于几十或几百个IP,它应该可以正常工作。如果在.htaccess文件中有多个</files>
,这将无法正常工作。这需要更仔细的解析才能找到正确的结束标记。
如果保留空格(如果在</files>
之前有缩进)对您很重要,那么您可以使用preg_replace()
代替更简单的str_replace()
。
另一种方法是使用file()
将.htaccess读入其行数组,找到包含</files>
的行并在它之前插入一个新的数组元素然后再加入行一起把它写到文件中。