基本上,我想创建一个网站,向人们展示如何通过模拟它们来防止PHP漏洞。但是,我不能让他们自己工作。
我想看看变量是否等于有效页面(我只有两个用于测试),如果有,则加载该页面。否则,我看它是否包含“../”。如果这些都不是真的,那就简单地说“找不到页面”。
到目前为止,这是我的代码:
<?php
if($page=="LOLone.php" || $page=="LOLtwo.php"){
echo "Welcome, look at the LOL cats!";
include($page);
}else if(strlen(strstr($page,"../"))>0){
echo "Congrats, you found the transversal attack vulnerability!";
}else{
echo "Page not found!";
}
?>
每当我尝试使用page=LOLone.php
(或LOLtwo.php
甚至../
)时,都会显示“找不到页面!”我不能像我一样比较变量,或者这可能是我的网络主机安全吗?我有点困惑,但我对PHP比较新,所以我觉得我错过了一些简单的东西......
好的,我犯了一个简单的错误。一个非常大的。抱歉。 感谢所有的回复,我会非常小心自己的服务器被黑客入侵。在这个例子中我应该是干净的,因为我只有在它等于指定值时才包含页面。再次感谢。
答案 0 :(得分:1)
尝试
$webPath = "/home/www/somesite/userpages" ;
$pages = array(
"page1.php",
"page2.php"
);
//http://testing.com?page=xxx
$_GET['page'] = "../../etc/passwd" ; //Sample Hack
//Prepare Include
$page = realpath($_GET['page']);
$dirName = dirname($page);
$baseName = basename($page) . ".php";
if($dirName != $webPath)
{
die("Die! Die! Die!");
}
if(!in_array($baseName, $pages))
{
die("Kill! Kill! Kill!");
}
echo "Welcome" ;
答案 1 :(得分:0)
替换
if(strlen(strstr($page,"../"))>0)
使用
if( strpos($page, '../') !=== false )
现在,您正在检查strstr()
来电的长度,这不是正确的方法。现在它改为检查../
的位置 - 如果它不是假的 - 我们确定该字符串有它。
但是,您应该从另一个更简单的项目开始 - 因为只会确保您的服务器因为您忘记停止的漏洞而被黑客攻击。