什么必须在SQL中转义?

时间:2012-05-18 00:24:54

标签: sql escaping code-injection

将SQL与其他语言结合使用时,必须转义哪些数据?我刚刚阅读了question here,我的理解是,只有来自用户的数据必须被转义。

还必须转义所有SQL语句吗?例如INSERT,UPDATE和SELECT

4 个答案:

答案 0 :(得分:1)

必须正确转义SQL中的每种类型的查询。而且不仅仅是“用户”数据。如果你不小心的话,完全有可能注射自己。

e.g。在伪代码中:

$name = sql_get_query("SELECT lastname FROM sometable");
sql_query("INSERT INTO othertable (badguy) VALUES ('$name')");

该数据从未触及“用户”,用户从未提交过,但它仍然是一个漏洞 - 请考虑如果用户的姓氏为O'Brien会发生什么。

答案 1 :(得分:1)

大多数编程语言都提供了以统一方式连接数据库的代码(例如Java中的JDBC和Perl中的DBI)。这些提供了使用Prepared Statements进行任何必要转义的自动技术。

答案 2 :(得分:1)

所有SQL查询都应该正确清理,并且有多种方法可以执行此操作。 您需要阻止用户尝试使用SQL注入来利用您的代码。 可以通过各种方式进行注射,例如通过用户输入,服务器变量和cookie修改。

给出如下查询:

"SELECT * FROM tablename WHERE username= <user input> "

如果未转义用户输入,则用户可以执行类似

的操作
' or '1'='1

使用此输入执行查询实际上会使其始终为真,可能会将敏感数据暴露给攻击者。但是还有许多其他更糟糕的情况可以使用注射。


你应该看一下OWASP SQL Injection Guide。他们对如何防止这些情况以及处理它的各种方法进行了很好的概述。

答案 3 :(得分:0)

我还认为这在很大程度上取决于您认为'用户数据'是或确实是从中调出来的。我个人认为用户数据是公共领域的可用数据(即使只是通过开发),即使用户不是'用户',也可以被'a'用户更改。

Marc B提出了一个很好的观点,但是在某些情况下你可能会弄脏你自己的数据,所以我想在sql数据方面总是比对不起更安全。

我会注意到,对于直接用户输入(即来自Web表单等),在数据甚至接近sql查询之前,您应该始终进行额外的层服务器端验证。