2010-04-01 30 views
1

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

注意:如果可能的话给出一些实践例子会更好。

谢谢

+2

如果您正在转义SQL,那么您做错了。始终使用参数化查询。 – Nate 2010-04-02 17:29:48

回答

5

数据必须正确SQL转义(或从SQL单独发送,如其他人所暗示的那样)用于存储,用于显示的HTML转义。

+2

请注意转义为sql和转义为html之间的区别。 – goat 2010-04-02 05:00:15

+0

是的,转义是完全不同的,在每种情况下使用正确的转义是至关重要的。 – SamB 2010-04-02 19:06:32

1

退出输入,存储,然后转义输出。


如果您在没有转义的情况下存储,您很容易受到SQL注入的攻击。

例子:你有一个查询:

mysql_query("SELECT * FROM `table` WHERE `abc`= '{$_POST['def']}'; 

假设$ _POST [“高清”]等于

blah'; DROP TABLE `table`; SELECT * FROM `table` WHERE 'abc' = '123 

这将导致你的表被丢弃,如果它没有逃脱。


如果在不转义的情况下输出,则容易受到XSS的影响。

否则,用户可以向其他用户可以查看的页面注入有害的Javascript。

+0

那么,在具体的例子中并不完全正确。 'mysql_query()'不支持多个查询。 – 2010-04-01 23:58:25

2

你的问题并没有多大意义,因为非常行为试图存储包含SQL注入数据是什么原因 SQL注入。

无论哪种方式,您应该使用Parameterized queries来防止SQL注入。

对于XSS/HTML转义,我个人宁愿在插入时做它,因为那样你只需要处理一次,而不是每次显示。一个小优化,但很容易。

+5

它在插入时逃脱是错误的。在插入时,你不知道字符串将在哪里使用。例如,您可能希望将该字符串发送到HTML或JavaScript,或者您可能希望将该字符串用作URL中的查询参数。或者,您可能希望在字符串存储在数据库中后对其进行一些分析。这些用例中的每一个都有不同的转义方法。 – 2010-04-02 06:35:49

+0

在某些特定情况下,消毒(如剥离HTML)是适当的。例如,持有URL的字段不应存储HTML。另外,一个持有某人名字的字段不应该存储HTML。然而,一个拥有全名的字段可能有一天将其存储为XML来描述给定名称和姓氏,因此它可能不应该被剥离。必须考虑哪些格式可以存储在一个字段中。 – outis 2010-04-02 20:30:25

4

为了,你应该做到以下几点 -

  1. 验证输入,看它是否符合你的期望。如果不是,则拒绝输入并停止。如果符合,继续下一步而不改变的输入。

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

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

您可能会试图在数据库中存储修改过的字符串 - 但请不要这样做。如果你为HTML转义它,你永远不能在javascript中使用该字符串。如果你不得不做后端处理,你必须避开字符串。你很快就会到达一个你不能做正确的事情的阶段。

请记住,转义只是将数据从一个层传输到另一个层的一种方式。在休息时(数据库或屏幕),数据应与用户输入的方式完全一致。