Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php htmlspecialchars()和htmlspecialchars_decode()_Php - Fatal编程技术网

Php htmlspecialchars()和htmlspecialchars_decode()

Php htmlspecialchars()和htmlspecialchars_decode(),php,Php,如果我需要输出一个字符串,比如 <div><a>Some link</a></div> 一些链接 不是从数据库中检索到的,是否需要使用 echo htmlspecialchars_decode(htmlspecialchars('<div><a>Some link</a></div>')); echo htmlspecialchars_decode(htmlspecialchars('Some

如果我需要输出一个字符串,比如

<div><a>Some link</a></div>
一些链接
不是从数据库中检索到的,是否需要使用

echo htmlspecialchars_decode(htmlspecialchars('<div><a>Some link</a></div>'));
echo htmlspecialchars_decode(htmlspecialchars('Some link'));
或者直接回音已经安全了

echo '<div><a>Some link</a></div>';
echo“某些链接”;
防止XSS攻击

我应该在哪里清理文本在将其插入数据库之前,是否允许“{}[]$%#@!^&*()-|+=|?~”? 我的意思是,我应该在将特殊字符插入数据库之前转换它们吗


我使用的是PDO。

如果对特殊字符进行编码,然后立即对其进行解码,最终会返回到起始位置,因此这是毫无意义的

如果您接受用户输入,将其存储在数据库中,将其从数据库中取出并回显到页面,那么您很容易受到XSS攻击

如果你想防御它,那么:

  • 不允许用户编写HTML。在将数据插入页面之前,请对数据使用
    htmlspecialchars
  • 允许HTML,但通过HTML解析器和白名单元素和属性运行它,这些元素和属性都是安全的,并且是您可以接受的
如果数据库中的HTML来自可信来源(这意味着您必须对用户进行身份验证,抵御CSRF攻击,并相信此人不是恶意或白痴),那么您可以安全地只输出它而不进行修改

我的意思是,我应该在将特殊字符插入数据库之前转换它们吗

一般来说,对于任何给定的格式,在插入该格式之前应立即转义该格式的数据。如果以后需要以不同的格式显示相同的数据,则可以避免问题


这就是说,在数据上运行白名单HTML解析器是一项相对昂贵的操作,因此您可能希望创建一个经过清理的版本,并将其存储在数据库中未经清理的版本旁边。

如果您直接从PHP代码中回显它,则是安全的。因此HTML在您的代码中是硬编码的?那么无需转义。仅供参考:XSS攻击s是从客户端到服务器,而不是从服务器到服务器client@MartinKabanen,所以我可以直接以HTML格式回送,这样会安全吗?@lordkain-否。XSS攻击是从客户端到服务器再到客户端的。它们可以反映(在不涉及数据库的情况下)或存储(数据放在数据库中…并且可以向输入数据的用户以外的其他用户显示坏数据)