什么是最好的,Escape然后存储或商店然后逃脱输出?

时间:2010-04-01 23:47:25

标签: php mysql security xss sql-injection

在stackoverflow上进行了长时间的搜索后,我没有发现任何人谈到这个,即使它是一个很大的选择,问题是什么是最好的,以防止XSS和SQL注入,逃避数据然后存储它在数据库中或按原样存储它并在输出时转义它?

注意:如果可能的话,最好提供一些实践的例子。

由于

4 个答案:

答案 0 :(得分:5)

数据必须正确地进行SQL转义(或与其他人建议的SQL分开发送)进行存储, HTML转义以供显示。

答案 1 :(得分:4)

按顺序,您应该执行以下操作 -

  1. 验证输入是否符合您的期望。如果没有,拒绝输入并停止。如果满足,请继续执行下一步而不更改输入。

  2. 将输入绑定到参数化查询,或在形成查询时转义输入。请注意,转义输入不会更改输入。数据库将始终包含用户输入的确切字符串。

  3. 向用户显示时,必须根据上下文对其进行转义。大约有5种不同的方法可以转义相同的字符串 - 具体取决于您是以HTML元素,HTML属性,Javascript,CSS还是URL显示它。见http://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet。再次,请记住,转义不会改变字符串。用户必须始终看到他输入的确切字符串。

  4. 您可能想在数据库中存储已修改的字符串 - 但请不要这样做。如果你为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注入其他用户可以查看的页面中。