在img src中授予对用户输出的访问权限会有危险吗


Can it be dangerous to give access to user output in img src

情况如下。我正在构建一个小网站,其中没有任何文件是机密的。在许多页面中,我需要为用户隔离并打印图像。所以,我用这种方式制作了一个小脚本:

<?php
    echo '<img src="'. $_GET['src'] .'" />';
?>

我喜欢URL中的图像源,所以我很容易重用。我想知道是否有人可以尝试访问服务器中的其他文件(例如mysite.com?src=../../SECRET_FILE.txt)。我试着自己打破它,用它不能做任何危险的事情,但我想知道它是否有任何缺陷?(从这个网站上没有任何图片是秘密的角度来看,它们都是公开的,如果他们能找到这些图片,我一点也不担心)

请注意,代码无论如何都没有保存,这里是这个页面的完整脚本(实际上只是用来为想要在网站上打印图像的用户节省时间)

<?php
    echo '<img src="'. $_GET['src'] .'" />';
?>
<script>
    window.print();
</script>

永远不要相信用户输入。如果您公开的每个文件或脚本都可以安全运行,那么就不会有不安全的服务器端代码运行的危险。但是你允许用户以任何他们想要的方式修改你的HTML,这是不安全的。

我会检查他们是否输入了有效的内容,例如:

echo '<img src="/path/to/images/'. basename($_GET['src']) .'" />';

这将确认他们只是从您的图像目录中请求一个文件。更好的办法是确认文件存在:

$image = '/path/to/images/' . basename($_GET['src']);
if (file_exists($image)) {
     echo '<img src="'. $image .'" />';
} else {
     header("HTTP/1.0 404 Not Found");
}

从服务器端来看,这是安全的,但您的用户可能会使用跨站点脚本攻击在其中注入html。可以考虑插入脚本标记,将您站点的cookie发送到攻击者网站。

https://www.owasp.org/index.php/Testing_for_Cross_site_scripting

我建议在实现此类方法时要格外小心。在这种情况下,我会将实现更改为

  1. 检查输入是否在有效/允许的范围内:将允许的图像的文件名存储在数组中。使用该数组中的索引作为用户参数。指数非常容易检查和验证。因此,没有外部用户可以访问他不被允许访问的图像。

  2. 将参数检查为(1.)数字,(2.)在允许的范围内(0-数组长度-1)

我强烈建议永远不要实现允许用户扫描服务器目录的功能。