PHP:防止文件夹黑客攻击 - 如果路径中有../?

时间:2010-07-27 09:38:47

标签: php path

我在php中做了一个简单的事情,我想知道如何测试变量$ path是否包含以下结构../

所以我在我的网址中只有一个?path = somepath结构,如果有人进入../它允许他进入一个目录。我当然知道这不是最好的解决方案,但是对于我的小东西来说,如果我只是在其中测试一个“../”字符串的$ path变量就足够了。如果是这样死();

我不确定测试它的最佳方法是什么!

关于亚光

4 个答案:

答案 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是首选方法的原因。