Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php,读取文件代码问题_Php_File_Preg Match - Fatal编程技术网

php,读取文件代码问题

php,读取文件代码问题,php,file,preg-match,Php,File,Preg Match,我在一个网站上使用了这段php代码。 现在它老了,我最近也有几次发作。脚本用于包含来自其他地方的另一个文件并发送垃圾邮件。显然,这使我的脚本成为垃圾邮件发送者 内容 $htm = ".htm"; $pid = "$details$htm"; function show_details($pid) { if (!preg_match("/http/", $pid)) { require($pid); } else { die; } } 以及标题、描述、关键字等 $txt = ".txt";

我在一个网站上使用了这段php代码。 现在它老了,我最近也有几次发作。脚本用于包含来自其他地方的另一个文件并发送垃圾邮件。显然,这使我的脚本成为垃圾邮件发送者

内容

$htm = ".htm";
$pid = "$details$htm";
function show_details($pid)
{
if (!preg_match("/http/", $pid)) {
require($pid);
} else {
   die;
}
}
以及标题、描述、关键字等

$txt = ".txt";
$title = "$details$txt";
function show_title($title)
{
if (!preg_match("/http/", $title)) {
if (file_exists($title)) {
require($title);
} else {
   die;
}
}
}
以及一个display.php文件,其中包含

print '
<!-- CONTENT -->
';
show_details("$pid");
print '
打印'
';
显示详细信息($pid);
印刷品
通过这段代码,ı能够通过“/display.php?details=mycontentpage”调用任何内容

mycontentpage.htm mycontentpage.txt

现在必须重新编码此代码。。我不能改变建筑,因为场地太大了。 所以我想我必须坚持这一点


有人能帮忙吗?有什么意见吗?

要使这样的脚本更安全,您必须确保register\u globals设置为OFF。这意味着您必须添加一行,如:

php\u标志寄存器\u全局关闭

…到.htaccess。然后,在第一次使用时声明所有用户变量,如下所示:

$details=$\u获取['details']

…它将URI片段“details”中的数据分配给PHP变量$details

我可以很清楚地看到攻击者是如何通过代码进入并将_globals设置为on的——他们只需要创建一个包含PHP代码的.htm文件,该文件将重新分配其他变量,包括它,然后是viola

有关详细信息,请参阅:


希望这有帮助

如果他们可能在某个地方包含一个文件,那么您的整个站点都会受到威胁。即使你对此进行修补,他们可能会打开数千个后门。认真对待这件事话虽如此,您对您尝试执行的操作的描述过于混乱,以至于我无法理解您的实际问题所在。如果您允许用户创建.htm和.txt文件,您可能还需要一个类来清理这些文件的内容——至少,通过htmlentities()运行它;——看:谢谢。。。但问题是我不能改变所有网站的代码,它太大了。我们已经在准备一个新网站。我不需要找到一个暂时的解决办法。如果get地址上有“http”(这意味着它不在该站点),那么die。。否则就跑。。但我还需要包括“ftp”、“ftp/”、“/”、“/”、“:”。。如果我能把这些也包括进去,应该可以为我争取到足够的时间。有什么想法吗?我看不出大小和它有什么关系(除非你在每一页上都复制上面的代码——如果是这样的话,那就是你做错了……);最终,通过声明变量,您根本不会改变代码的工作方式——您只需以稍微更安全的方式使用它们。可能值得使用is_file();而不是preg_match,如果仅在后一种情况下,它会阻止您将文件命名为“http”或其任何衍生物。也许可以尝试以下内容:if(is_file($_SERVER{'DOCUMENT_ROOT'}./my_images/abc.jpg)){}