在stackoverflow上进行了长时间的搜索后,我没有发现任何人谈到这个,即使它是一个很大的选择,问题是什么是最好的,以防止XSS和SQL注入,逃避数据然后存储它在数据库中或按原样存储它并在输出时转义它?
注意:如果可能的话,最好提供一些实践的例子。
由于
答案 0 :(得分:5)
数据必须正确地进行SQL转义(或与其他人建议的SQL分开发送)进行存储,和 HTML转义以供显示。
答案 1 :(得分:4)
按顺序,您应该执行以下操作 -
验证输入是否符合您的期望。如果没有,拒绝输入并停止。如果满足,请继续执行下一步而不更改输入。
将输入绑定到参数化查询,或在形成查询时转义输入。请注意,转义输入不会更改输入。数据库将始终包含用户输入的确切字符串。
向用户显示时,必须根据上下文对其进行转义。大约有5种不同的方法可以转义相同的字符串 - 具体取决于您是以HTML元素,HTML属性,Javascript,CSS还是URL显示它。见http://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet。再次,请记住,转义不会改变字符串。用户必须始终看到他输入的确切字符串。
您可能想在数据库中存储已修改的字符串 - 但请不要这样做。如果你为HTML转义它,你永远不能在javascript中使用该字符串。如果你必须进行后端处理,你必须撤销字符串。你很快就会到达一个不能做正确事情的阶段。
请记住,转义只是将数据从一个层传输到另一个层的一种方式。在静止(数据库或屏幕)时,数据应该与用户输入的方式完全相同。
答案 2 :(得分:2)
您的问题没有多大意义,因为尝试存储包含SQL注入的数据的行为是导致 SQL注入的行为。
无论哪种方式,您都应该使用Parameterized queries来阻止SQL注入。
对于XSS / HTML转义,我个人宁愿在插入时执行此操作,因为这样您只需要执行一次处理,而不是每次都显示。一个小优化,但很容易。
答案 3 :(得分:1)
转义输入,存储,然后转义输出。
如果您在没有转义的情况下存储,则很容易受到SQL注入的攻击。</ p>
示例:您有一个查询:
mysql_query("SELECT * FROM `table` WHERE `abc`= '{$_POST['def']}';
假设$ _POST ['def']等于
blah'; DROP TABLE `table`; SELECT * FROM `table` WHERE 'abc' = '123
如果你的表没有被转义,那么这将导致你的表被删除。
如果输出没有转义,则您很容易受到XSS的攻击。
否则,用户可以将有害的Javascript注入其他用户可以查看的页面中。