繁体   English   中英

什么必须在SQL中转义?

[英]What must be escaped in SQL?

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

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

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

例如在伪代码中:

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

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

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

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

给出如下查询:

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

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

' or '1'='1

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


您应该查看OWASP SQL注入指南 他们对如何防止这些情况以及处理它的各种方法有了很好的概述。

我也认为这在很大程度上取决于你认为“用户数据”是什么或者确实是从哪个角度出发。 我个人认为用户数据是公共领域的可用数据(即使这只是通过开发),即使用户不是“用户”也可以改变用户数据。

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

我要注意的是,关于直接用户输入(即来自Web表单等),在数据甚至接近sql查询之前,你应该总是有一个额外的层服务器端验证。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM