【问题标题】:Is it safe to pass filename in GET? [closed]在 GET 中传递文件名是否安全? [关闭]
【发布时间】:2013-12-04 05:15:04
【问题描述】:

我在做

index.php?letter=1&show=cat.jpg

我不包含文件,但仅将其用作<img src="$_GET['show']">

安全吗?

【问题讨论】:

  • 传递文件名是安全的,但在服务器端处理它的方式并不安全。
  • index.php?letter=1&show=/some/protected/folder/somefile
  • 我不包括它。我使用 它是通过 brouser 加载的,而不是通过服务器加载的。如果用户没有访问权限,那么这样的请求就会失败,不是吗?
  • @bansi 您的关注仅与包含东西服务器端有关。在这种情况下,服务器只负责生成将由客户端(浏览器)执行的请求标记。即使 show 参数被操纵以访问受保护的资源,这与发出直接请求没有任何不同,除非图像文件夹位于 DocumentRoot 之上。
  • 你必须小心 xss 攻击。通过show=/some/protected/folder/somefile 不会产生任何安全问题。请阅读我的回答。

标签: php html security web


【解决方案1】:

验证输入的简单代码。

// Check File Param provided
$filename  = (isset($_GET['show']) ? $_GET['show'] : '');
if (strlen($filename) == 0) {
    die('File Not Provided');
}

// remove leading '/' or double slashes (will also hack out http:// injections)
$filename = trim($filename);
$filename = str_replace('//', '/', $filename);
while (strlen($filename) > 0 && strcmp(substr($filename,0,1), '/') == 0) {
    $filename = substr($filename, 1);
}

// Check filename exists
if (file_exists('./' . $filename)) {  // Note the "./", also will to prevent cross site injections; if using a sub-directory, add in here
    die ('file does not exist');
}

// Check file actually is an image
if (!@getImageSize('./' . $filename)) {
    die ('file is not an image');
}

// Should be safe at this point.

如果你知道文件名的模式,你也可以 preg_match 模式,例如总是期待一个.png)。

您可能还想以不同的方式处理错误,但这应该会给您一个想法。

【讨论】:

    【解决方案2】:

    是的,它可以安全使用。但是您想处理XSS 攻击。 实际上,现在您在 html 页面中显示附加到参数 show 的内容。想象一下,如果用户编辑了“cat.jpg”并在其中插入了一些脚本内容。

    this简单exampleArjun Sreedharan

    对你的 url 的 XSS 攻击如下所示

    index.php?letter=1&show=Path/To/some/other/Image"></img><h1>XSS Attack</h1><div> Showing False data in your website</div><img src="Some/Other/Image.jpg
    

    在您的页面中呈现的 Html 将是

    <img src="Path/To/some/other/Image"></img>
    <h1>XSS Attack</h1>
    <div> Showing False data in your website</div>
    <img src="Some/Other/Image.jpg">
    

    解决方案是对html进行编码。 HtmlEntities 在 PHP 中。

    【讨论】:

    • 在您的网站上试试这个网址。 index.php?letter=1&show=Path/To/some/other/Image">

      XSS 攻击

      在您的网站中显示虚假数据
    【解决方案3】:

    是的,它是安全的,但是传递/显示该文件的机制应该适合仅处理授权请求。

    如果你愿意,你可以通过 POST 来完成,但有时当你刷新页面和浏览器要求确认之前发布的数据再次发送回服务器时,它的占有性。

    以上是我个人的看法。

    【讨论】:

    • " 但是传递/显示该文件的机制应该适合仅处理授权请求" 这是什么?很好,当图片只放在一个文件夹中时?我不在乎,如果这个 img 文件夹可以访问。我希望没有人可以访问脚本。
    • 请阅读此内容。这样你就能明白他的意思了。 en.wikipedia.org/wiki/Cross-site_scripting
    • @Tigran 你说图像文件夹可以访问,没有人可以访问脚本。它是什么?我的意思是说,当你在 get 中传递文件名时,要执行的 PHP 文件应该有适当的机制,以便不需要的用户无法访问它。
    【解决方案4】:

    我会说从 URL 中获取类似 image_id 的内容,然后从数据库中检索相关数据并在标记中输出您自己的数据(例如文件名)。

    即使您考虑使用不同的方法来验证或过滤用户的输入,您仍然可能会受到一些攻击或错误的影响。为了避免这种情况,我再次建议从用户那里获取key,然后根据该键输出数据。验证该密钥要容易得多,而且您不会再次输出它 - 您只在后端使用它,因此它不会成为 XSS 攻击的安全漏洞。

    【讨论】:

      【解决方案5】:
      <img src="/images/<?php echo basename(preg_replace('/[^a-z0-9\.-]/i','',$_GET['show'])); ?>">
      

      这将只返回文件名,即使传递了路径或 url。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-07
        • 2011-07-02
        • 1970-01-01
        • 2015-12-25
        • 1970-01-01
        • 2014-02-07
        • 1970-01-01
        相关资源
        最近更新 更多