Php 针对XSS的安全保护-用户提供url的一部分
我明白了为什么这是不好的,并且必须使用htmlspecialchars来防止某些xss漏洞:Php 针对XSS的安全保护-用户提供url的一部分,php,mysql,xss,Php,Mysql,Xss,我明白了为什么这是不好的,并且必须使用htmlspecialchars来防止某些xss漏洞: <?php $url = '<plaintext>'; echo $url;?> 像这样: <?php $url = '<plaintext>'; htmlspecialchars($url, ENT_QUOTES, "UTF-8"); echo $url;?> 在我的数据库中,我只存储用户提供的文件名。(我相信随着我对这门学科的进一步了解,情
<?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">
原则上,您永远不能信任任何用户输入。如果
$sql['image']
将直接或间接由用户提供,则在该字符串的开头和结尾添加常量无关紧要。无论哪种方式,您都必须依赖htmlspecialchars()
不包含任何允许注入脚本的错误
在这种情况下,要真正提高安全性,您必须采取更严厉的措施。一种流行的方法是自己分配文件名,例如对文件内容进行哈希运算,并使用该哈希值而不是原始文件名来存储文件。md5()
和sha1()
在这方面很有用
此外,假设用户提供了您正在存储其文件名的图像,您也必须确保这些图像不能用于完成工作。例如,用户可能会上传带有嵌入式脚本的SVG,而不是JPEG,从而完全避免对文件名本身的任何验证或损坏