0

我明白为什么下面这样不好,并且必须使用 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">
4

1 回答 1

1

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

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

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

于 2013-02-05T09:48:23.657 回答