我在php中做了一个简单的事情,我想知道如何测试变量$ path是否包含以下结构../
所以我在我的网址中只有一个?path = somepath结构,如果有人进入../它允许他进入一个目录。我当然知道这不是最好的解决方案,但是对于我的小东西来说,如果我只是在其中测试一个“../”字符串的$ path变量就足够了。如果是这样死();
我不确定测试它的最佳方法是什么!
关于亚光
答案 0 :(得分:12)
而不是这样做,你可以只在它上面调用realpath()
并检查它应该在的路径是否是它的前缀。
更好的是,为什么不保留白名单并拒绝任何不在其中的内容?
答案 1 :(得分:1)
回答你的问题:
if(strpos($path,'../') !== false){
// looks like someone 's trying to hack here - simply
// do nothing (or send an email-notification to yourself
// to be informed and see how often this happens)
}else{
// here comes the magic
}
但是:你真的不应该这样做。如果你想要一个简单的解决方案,请为每个可能的$ path使用switch语句并包含相关文件(或者你必须做的任何事情)。
答案 2 :(得分:0)
我是一个替代解决方案,允许您自定义网址....
<?php
$arr= array(
"register" => "register.php",
"login" => "userlogin.php",
"admin" => "adminlogin.php",
"etc" => "otherpage.php",
);
if ( isset ( $_GET['path'] )
if ( array_key_exists( $_GET['path'] , $arr) ){
//do some stuff...
include( $arr[$_GET['path']] );
}
else
echo 'Page Not Found!';
else
echo 'Required Field Empty!';
?>
因此,我们会调用index.php?path=admin
页面adminlogin.php
....
答案 3 :(得分:0)
其中一种更简单的方法是强化php.ini
配置,特别是open_basedir directive。请记住,某些CMS系统实际上在代码中实际使用..\
,并且当根文件夹外部包含这些时,可能会产生问题。 (即梨模块)
另一种方法是使用mod_rewrite。
除非您使用包含文件检查来自$_GET
和$_SERVER['request_uri']
变量的每个网址以进行注入,否则您将为这种攻击打开大门。例如,您可以保护index.php
但不保护submit.php
。这就是强化php.ini
和.htaccess
是首选方法的原因。