保护XSS - 用户提供部分网址

时间:2013-02-05 09:34:59

标签: php mysql xss

我知道为什么下面的内容很糟糕,并且必须使用htmlspecialchars来防止某些xss漏洞:

<?php $url = '<plaintext>';
echo $url;?>
像这样:

<?php $url = '<plaintext>';
htmlspecialchars($url, ENT_QUOTES, "UTF-8");
echo $url;?>

在我的数据库中,我只存储用户提供的文件名。 (我确定这会随着我对这个主题的了解而改变)

我想知道的是,如果下面的内容实际上是在做什么来防范XSS?与之前的案例相比,它是不是一个漏洞?

我尝试使用和不使用htmlspecialchars注入脚本标记 在任何一种情况下似乎都无能为力。脚本代码不会执行。

安全吗? htmlspecialchars是适合这项工作的工具吗?我怎样才能让它变得更好?

$ sql ['image']从我的数据库中获取,下面是显示图像的代码。

<?php $url = "/images/" . $sql['image'] . ".jpg";
$url = htmlspecialchars($url, ENT_QUOTES, "UTF-8");?>
<img src="<?php echo $url;?>">

输出:

<img src="/images/test.jpg">

1 个答案:

答案 0 :(得分:1)

原则上,您无法信任任何用户输入。如果用户直接或间接提供$sql['image'],那么如果将常量添加到该字符串的开头和结尾,则无关紧要。无论哪种方式,您都必须依赖htmlspecialchars()不包含任何允许脚本注入的错误。

为了在这种情况下实际提高安全性,您必须采取更严厉的措施。一种流行的方法是简单地自己分配文件名,例如通过对文件内容进行散列并使用该散列而不是原始文件名来存储文件。 md5()sha1()往往会派上用场。

此外,假设用户提供了您要存储的文件名的图像,您也必须确保无法使用这些图像来完成工作。例如,用户可能会上传带有嵌入式脚本而不是JPEG的SVG,因此可能完全避免对文件名本身进行任何验证或修改。