[英]What must be escaped in SQL?
必须正确转义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.