将 SQL 与另一种语言结合使用时,必须转义哪些数据?我只是在这里阅读问题,据我了解,只有来自用户的数据必须被转义。
还必须转义所有 SQL 语句吗?例如插入、更新和选择
将 SQL 与另一种语言结合使用时,必须转义哪些数据?我只是在这里阅读问题,据我了解,只有来自用户的数据必须被转义。
还必须转义所有 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 注入指南。他们对如何防止这些情况以及处理它的各种方法有很好的概述。
我还认为这在很大程度上取决于您认为“用户数据”是什么或确实源自什么。我个人认为用户数据是公共领域中可用的数据(即使这只是通过利用),即可以由“a”用户更改,即使它不是“the”用户。
Marc B 提出了一个很好的观点,但是在某些情况下您可能会弄脏自己的数据,所以我想对于 sql 数据而言,安全总比抱歉要好。
我会注意到,关于直接用户输入(即来自 Web 表单等),您应该始终在数据接近 sql 查询之前进行额外的服务器端验证。