SQL注入与JDBC PreparedStatement类

发布时间 2023-08-30 11:15:24作者: 方云

《Java Tutorial》中是这样介绍JDBC PreparedStatement类对SQL注入的防止。

PreparedStatement最重要的优点是它们有助于防止SQL注入攻击。SQL注入是一种恶意利用在SQL语句中使用客户端提供的数据的应用程序的技术。攻击者通过提供特制的字符串输入来欺骗SQL引擎执行非预期命令,从而获得对数据库的未经授权的访问权限以查看或操作受限制的数据。SQL注入技术都利用应用程序中的一个漏洞:未正确验证或未验证的字符串文字被连接到动态构建的SQL语句中,并由SQL引擎解释为代码。PreparedSatement始终将客户端提供的数据视为参数的内容,而不是SQL语句的一部分。

对于SQL注入的实例和简单防止方法,举个来自《MySQL 8.0 Reference Manual》的例子:

一个常见的错误是仅保护字符串数据值。还要记住检查数字数据。如果当用户输入值 234 时应用程序生成诸如 SELECT * FROM table WHERE ID=234 之类的查询,则用户可以输入值 234 OR 1=1 以使应用程序生成查询 SELECT * FROM table WHERE ID= 234 OR 1=1。结果,服务器检索表中的每一行。这会暴露每一行并导致服务器负载过大。防止此类攻击的最简单方法是在数字常量两边使用单引号:SELECT * FROM table WHERE ID=’234’。 如果用户输入额外的信息,它将全部成为字符串的一部分。 在数字上下文中,MySQL 会自动将此字符串转换为数字,并从中删除任何尾随的非数字字符。