我的用户可以在我的数据库中插入任何内容。
因此,使用白名单/黑名单字符不是一种选择。
我并不担心(覆盖它)关于数据库端(SQL注入),而是在我的页面中注入代码。
是否有htmlspecialchars()
不足以阻止代码注入的情况?
答案 0 :(得分:2)
在HTML代码中插入时,使用htmlspecialchars
就足够了。它对字符进行编码的方式使得结果文本无法“突破”当前元素的。这样它既不能创建其他元素,也不能创建脚本段等。
然而,在所有其他情况下,htmlspecialchars
不够自动。例如,当您使用它在某些JavaScript区域中插入代码时,例如当您使用它填充JavaScript字符串时,您将需要其他方法来使其安全。在这种情况下,addslashes
可以提供帮助。
因此,根据您插入结果文本的位置,htmlspecialchars
会为您提供足够的安全性。正如函数名称已经建议的那样,它只是承诺HTML的安全性。
答案 1 :(得分:2)
不,在所有情况下都不够。它在很大程度上取决于您的代码库。例如,如果您使用JavaScript向数据库发出某些AJAX请求,htmlspecialchars()
有时是不够的(取决于您使用它的位置)。如果您想保护JavaScript XSS中的Cookie,htmlspecialchars()
也不够好。
以下是htmlspecialchars()
可能失败的一些示例:https://www.owasp.org/index.php/Interpreter_Injection#Why_htmlspecialchars_is_not_always_enough。您的问题也高度依赖于您正在使用的数据库(并非所有人都使用MySQL)。如果你正在编写一个复杂的应用程序,我强烈建议使用其中一个框架来抽象这些恼人的小特性,让你担心应用程序代码。
答案 2 :(得分:2)
普通htmlspecialchars
是不够的。在这种情况下,您需要添加ENT_QUOTES
,并且需要传递编码。
<tag attr='<?php echo htmlspecialchars($usertext);?>'> //dangerous if ENT_QUOTES is not used
将用户文本作为字符串插入javascript / json时,您需要进行额外的转义。
我认为它也不适用于stange字符集。但是,如果您使用通常的字符集UTF-8,Latin1,...它将按预期工作。
答案 3 :(得分:0)
htmlspecialchars就足够了。将<
和>
转换为<
和>
后,您将无法再包含脚本。