这是情况。我正在建立一个小网站,其中没有任何文件是保密的。在许多页面中,我需要为用户隔离和打印图像。所以,我用这样的方式编写了一个小脚本:
<?php
echo '<img src="'. $_GET['src'] .'" />';
?>
我喜欢URL中的图像源,因此我很容易重复使用。我想知道是否有人可以尝试访问服务器中的其他文件(例如mysite.com?src=../../SECRET_FILE.txt
)。我试图打破它自己,不能做任何危险,但我想知道它是否有任何缺陷? (在这个网站上没有图像是秘密的观点,它们都是公开的,如果他们能找到任何这些图片,它根本不会打扰我)
请注意,代码不会以任何方式保存,这是此页面的完整脚本(实际上只是用于为想要在网站上打印图像的用户节省时间)
<?php
echo '<img src="'. $_GET['src'] .'" />';
?>
<script>
window.print();
</script>
答案 0 :(得分:2)
永远不要相信用户输入。如果您公开的每个文件或脚本都可以安全运行,则不存在运行不安全的服务器端代码的危险。但是,您允许用户以他们想要的任何方式更改HTML,这是不安全的。
我会检查他们输入有效的内容,例如:
def __init__(self, a, arg1):
self.__dict__ = dict(a.__dict__)
self.attr3 = arg1
这将确认他们只是从您的images目录中请求一个文件。更好的方法是确认文件存在:
echo '<img src="/path/to/images/'. basename($_GET['src']) .'" />';
答案 1 :(得分:1)
它是安全的服务器方面,但您的用户可以使用跨站点脚本攻击来在其中注入html。考虑插入脚本标记以将您网站的cookie发送到攻击者网站。
https://www.owasp.org/index.php/Testing_for_Cross_site_scripting
答案 2 :(得分:1)
我建议在实施这些方法时要非常小心。在这种情况下,我会将实现更改为
检查输入是否在有效/允许的范围内:将允许的图像的文件名存储在数组中。将索引作为用户参数处理到该数组中。指数很容易检查和验证。因此,没有外部用户可以访问他不被允许访问的图像。
检查参数为(1.)数字和(2.)在允许范围内(0 - 数组长度-1)
我强烈建议永远不要实现使用户能够扫描服务器目录的功能。