我正在为我正在处理的网站添加一些xss保护,平台是zendFrameWork 2,因此我使用Zend \ escaper。从zend文档我知道:
Zend \ Escaper仅用于转义要转义的数据 输出,因此不应该被误用于过滤输入数据。 对于此类任务,Zend \ Filter组件,HTMLPurifier。
但是如果我在将数据插入数据库之前将其转义,那么有什么风险呢?我这样做错了吗?请把我解释为我对这个话题的新手。 感谢
答案 0 :(得分:1)
在存储数据之前对数据进行编码时,您必须先对数据进行解码,然后才能输出数据。这就是为什么我不这样做的原因。
假设您有一个国际申请,并且您希望存储表单字段的转义值,该字段可能包含可能转义为HTML-Entities的任何非ASCII字符。那么如果你必须量化该领域的内容呢?喜欢计算人物?在计算内容之前,您始终必须取消内容。然后你必须再次逃脱它。做了很多工作但没有任何好处。
这同样适用于数据库中的搜索操作。您必须以与数据库输入相同的方式转义搜索短语,以了解您要查找的内容。
我在整个应用程序和数据库中使用一个字符集(我更喜欢UTF-8,要小心MySQL-Connection ....)并且只在输出中转义内容。然后,我可以随心所欲地处理数据并在输出上保证安全。并且在我的视图层中自动完成转义,因此我甚至不必每次处理数据时都要考虑它,因为它自动运行。这样你就不会忘记它。
这并不妨碍我过滤和消毒输入。并且它不会阻止我使用适当的数据库转义机制(如mysqli_real_escape_string
或类似机制)或使用预准备语句来转义数据库内容!
但这只是我的意见,其他人可能会另有想法!
答案 1 :(得分:1)
"输出"这里指的是网页。表单字段(HTML标记)是INPUT(来自网页),任何文本都是OUTPUT(到网页)。您需要确保任何输出(到网页)不包含可用于伪造XSS攻击媒介的危险字符。
这就是说,如果您有用户给出的DANGEROUS_INPUT_X,那么
$NOT_DANGEROUS_ANYMORE = ZED.HtmlPurifier(DANGEROUS_INPUT_X)
DBSave($NOT_DANGEROUS_ANYMORE)
和其他地方
$OUTPUT = DBLoad($NOT_DANGEROUS_ANYMORE)
echo $OUTPUT
我建议查看输出编码而不是验证:HtmlPurifier清除HTML,如果确保输出在页面中编码,则可以接受任何类型的错误字符。
这里https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet一些一般规则,这里是PHP示例
echo htmlspecialchars($DANGEROUS_INPUT_X_NOW_OUTPUT, ENT_QUOTES, "UTF-8");
请记住设置字符集,并在整个页面/脚本/二进制文件和数据库中与字符集保持一致。