【问题标题】:Ajax Security Question: JQuery ajax() + PHP scandir() = Security Issue?Ajax 安全问题:JQuery ajax() + PHP scandir() = 安全问题?
【发布时间】:2009-06-26 11:55:59
【问题描述】:

我是 PHP 安全问题的初学者。有人报告了我的代码存在安全问题,但从未提供详细信息。

以下是代码的精简版。我正在使用 JQuery AJAX 函数将一些数据发送到 PHP scandir() 函数使用的服务器。

您是否发现任何安全问题?

HTML 文档

 <script 
   src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js">
 </script>
 <script>
$.ajax({
    type: "POST",
    url: "example.php",
    cache: false,
    data: {
        foo: "images",
        bar: "something else",
            },
    success: function(html){
    alert(html);
    }
});
</script>

PHP 文档

<?php

$foo = filter_var($_POST["foo"], FILTER_SANITIZE_STRING);
$bar = filter_var($_POST["bar"], FILTER_SANITIZE_STRING);

$foo = scandir($foo);
$bar = (explode(",",$bar));

foreach ($foo as $a) {
    echo "<img src='$foo/$a'>";
}

?>

【问题讨论】:

    标签: php jquery ajax security file


    【解决方案1】:

    是的,我可以枚举您机器上的每个文件。可能还有您的服务器可以通过fopen wrappers 访问的其他机器。这些信息可以帮助识别其他正在运行的易受攻击的软件或敏感文件,以帮助我定位进一步的攻击。

    FILTER_SANITIZE_STRING 旨在保护 HTML,而不是文件路径引用,因此在这里它真的对您没有帮助。您应该只将其用作生成的 HTML 的输出过滤器,而不是在使用后端函数时。

    您希望限制使用危险的路径标记,例如 :、@、..、\ 和 /。但是通过将您认为安全的字符或值列入白名单来做到这一点,就像在 Tom Haigh 的示例代码中一样。

    【讨论】:

      【解决方案2】:

      您可能会通过发布名为“foo”的恶意值来获取文件系统上所有文件的列表 - 如果发送了值“/”,您将能够在 HTML 源代码中看到文件系统中的所有文件根。由于诸如 open_basedir 的限制,这可能并不总是有效,但这仍然不是一个好主意。

      一个可能的解决方案是首先清理 'foo' 参数 - 例如只允许某些字符,或者您只能允许存在于允许目录名称白名单中的 'foo' 值,例如:

      $foo = filter_var($_POST["foo"], FILTER_SANITIZE_STRING);
      
      if (!in_array($foo, array('allowed_dir1', 'allowed_dir2'))) {
          //not valid, not in whitelist
      }
      
      //or
      
      if (!preg_match('/^[a-zA-Z0-9+]+$/', $foo)) {
         //not valid, contains more than just letters and numbers
      }
      

      【讨论】:

      • 我希望“foo”值包含“/”甚至是 URL 的绝对路径。这样,图像可以从任何地方获取。例如,我希望能够使 foo 等于“somesite.com/directory/directory”。有没有安全的方法来做到这一点?如果没有,我可能会从 JavaScript 对象和 php 文档中删除 foo,并要求将所需目录直接编码到 getdir 函数。我真的很想避免这种情况,因为它可能需要为使用我的程序的每个页面创建单独的 php 文件。
      • “这样,图像可以从任何地方获取” - 你真的不想让任何远程用户能够查看你机器上“任何地方”的任何文件。即使只有图像文件。请记住,仅仅因为文件具有图像扩展名,例如“jpg”,并不意味着它包含图像数据。恶意攻击者可能通过其他漏洞将代码留在那里。我强烈建议您重新考虑您的设计和要求。
      猜你喜欢
      • 2016-12-10
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-19
      相关资源
      最近更新 更多