【问题标题】:PHP: prevent folder hacking - if path has ../ in it?PHP:防止文件夹黑客攻击-如果路径中有../?
【发布时间】:2011-03-21 12:22:48
【问题描述】:

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

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

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

问候马特

【问题讨论】:

  • 你使用这样的路径是为了什么目的?
  • @mathi 我很困惑为什么您要发送?path=url 而不仅仅是链接中的实际 URL。我告诉你,它打开的安全蠕虫罐头。
  • 因为我正在构建一种 filbrowser,它可以在我的服务器上读取我的文件。一个文件包含整个用户界面。 $path 设置当前在我的文件浏览器中查看的文件夹的文件夹路径。我不能只设置实际的 URL,对我的项目没有意义。

标签: php path


【解决方案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 语句并包含相关文件(或您必须做的任何事情)。

【讨论】:

  • @RobertPitt:我不想冒犯别人——我希望现在好多了;)
  • 用 + 代替否决票,这不会冒犯我自己,但其他人会发现该帖子不需要它:),快乐的日子
  • 谢谢。我如何测试 $path 是否以斜杠开头?像 ?path=/anything。实际上在这种情况下,我想调用 die();但是,如果 ?path=anything/anything 它应该可以工作。
  • egads.. 我正在想象大多数 CMS 系统上每个路径的 switch 语句.. 多么噩梦...RewriteMap 更容易。
  • 我现在这样做: if (substr($path, 0, 1) == "/" || substr($path, 0, 1) == "" || substr($path, 0, 2) == "./" || substr($path, 0, 3) == "../") { ...也许有更简单的方法,但它有效。
【解决方案2】:

一种更简单的方法是强化您的php.ini 配置,特别是open_basedir directive。请记住,某些 CMS 系统实际上确实在代码中大量使用了..\,并且当根文件夹之外存在包含时,这可能会产生问题。 (即梨模块)

另一种方法是使用mod_rewrite

除非您使用包含文件来检查每个 URL 以从 $_GET$_SERVER['request_uri'] 变量中注入,否则您将为这种攻击打开大门。例如,您可以保护index.php,但不能保护submit.php。这就是为什么强化php.ini.htaccess 是首选方法的原因。

【讨论】:

  • index.php?arr=?>DROP TABLE 和 /item/DROP TABLE/ 之间没有区别。去图
【解决方案3】:

我是另一种解决方案,可让您自定义 url....

<?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 将被包括在内....

【讨论】:

  • 如果你使用 index.php?arr[ihack]=../../../&path=ihack
  • 不是真的.. 因为(如果 php 配置良好)index.php?arr[ihack]=.... 只能通过 php 访问 $_GET['arr']... 并且 php 脚本中的 $arr 不会被替换... .
  • 维护这样的列表将是一团糟
  • 抱歉,但请告诉我 SQL 是如何一针见血的……我真的不明白……
  • 放松,这只是一个无知的评论
【解决方案4】:

您可以直接调用 realpath() 并检查它应该位于的路径是否是该路径的前缀,而不是这样做。

更好的是,为什么不保留白名单并拒绝任何不在其中的内容?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    相关资源
    最近更新 更多