我在做
index.php?letter=1&show=cat.jpg
文件我不包含,但仅将其用作<img src="$_GET['show']">
安全吗?
答案 0 :(得分:2)
是的,使用安全。但是你想要处理XSS攻击。
实际上,现在您正在显示html页面中参数show
附带的内容。如果用户编辑了'cat.jpg'并在其中插入了一些脚本内容,请考虑一个场景。
this见example简单Arjun Sreedharan。
对您网址的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。 PHP中的HtmlEntities。
答案 1 :(得分:2)
验证输入的简单代码。
// 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 :(得分:1)
是的,它是安全的,但是传递/显示该文件的机制应该适合仅处理授权的请求。
如果你想要,那么你可以通过POST来完成它,但是当你刷新页面并且浏览器要求确认先前发布的数据再次发送回服务器时,它有时候占有欲。
以上是我个人的观点。
答案 3 :(得分:1)
我想从URL中获取类似image_id
的内容,然后从数据库中检索相关数据并在标记中输出您自己的数据(例如文件名)。
即使您考虑了验证或过滤用户输入的不同方法,您仍可能会遇到某些攻击或可能是错误。为了避免这种情况,我建议再次从用户那里获取key
,然后根据该键输出数据。验证密钥更容易,而且你不会再输出它 - 你只在后端使用它,所以它不会成为XSS攻击的安全漏洞。
答案 4 :(得分:1)
<img src="/images/<?php echo basename(preg_replace('/[^a-z0-9\.-]/i','',$_GET['show'])); ?>">
即使传递了路径或网址,这也只会返回文件的名称。