防止PHP Web应用程序中的JavaScript注入

Ale*_*rty 10 javascript php javascript-injection

在PHP Web应用程序中阻止或阻止JavaScript注入所需的措施是什么,以便不提供敏感信息(PHP,HTML/XHTML和JavaScript中的最佳实践)?

Jef*_*ake 8

一个好的第一步是应用Gert G链接问题中列出的方法.这包括在详细各种可以在不同情况下用来清洁输入功能,包括mysql_real_escape_string,htmlentities(),htmlspecialchars(),strip_tags()addslashes()

只要有可能,更好的方法是避免将用户输入直接插入数据库.使用白名单输入验证:在您只有有限范围的选项的任何情况下,从插入的硬编码值中选择,而不是从任何面向客户端的表单中获取输入.基本上,这意味着只接受您接受的某些值,而不是试图消除/抵制邪恶/错误形成/恶意输入.

例如:如果您有一个带有项目下拉列表的表单,请不要使用此下拉列表中的输入进行插入.请记住,恶意客户端可以编辑随表单提交发送的信息,即使您认为它们只有有限的选项.相反,让下拉引用服务器端代码中的数组中的索引.然后使用该数组选择要插入的内容.这样,即使攻击者试图向您发送恶意代码,它也从未真正命中您的数据库.

显然,这不适用于论坛或博客等自由格式应用程序.对于那些人,你必须依靠"第一步"技术.尽管如此,还是有很多选项可以通过白名单输入验证来改进.

您也可以使用参数化查询(也称为带有绑定变量的预处理语句)进行sql交互.这将告诉您的数据库服务器所有输入都只是一个值,因此它可以缓解注入攻击带来的许多潜在问题.在许多情况下,这甚至可以涵盖自由格式的应用程序.


Kam*_*zot 6

对待任何你输出,以HTML值用htmlspecialchars()默认.

只有当你需要输出到本身包含html的html字符串时,只有不使用htmlspecialchars()的借口.在这种情况下,您必须确保此字符串来自完全安全的来源.如果您没有这种信心,那么您必须通过白名单html过滤器传递它,该过滤器仅允许精心限制的标签,属性和属性值集.您应该特别注意属性值.您永远不应该允许所有内容作为属性值传递,特别是对于src,hef,style等属性.

你应该知道你的webapp中你输出任何内容到html而不使用htmspeciachars()的所有地方,确保你真的需要那些地方并且要注意尽管你有信心这些地方都是潜在的漏洞.

如果您认为这太过谨慎:"为什么我需要htmlspecialchar()这个变量,我知道它只包含整数并且松散了所有宝贵的CPU周期?"

记住这一点:你不知道,你只知道你知道,CPU周期是世界上最便宜的东西,几乎所有这些都会被等待数据库或文件系统甚至内存访问所浪费.

也永远不要使用黑名单html过滤器.Youtube犯了这个错误,有人突然发现只有第一个<script>被删除,如果你在评论中输入第二个,你可以将任何Javascript注入访问者浏览器.

类似于避免SQL Injections使用mysql_real_escape_string()处理您粘贴到SQL查询的所有值,或者更好地使用PDO Prepared语句.