Skip to content

20. SQL中的安全问题

1. SQL 注入

SQL Injection 就是利用某些数据库的外部接口将用户数据插入到实际的数据库操作语言(SQL)当中,从而达到入侵数据库乃至操作系统的目的。它的产生主要是由于程序对用户输入的数据没有进行严格的 过滤,导致非法数据库查询语句的执行。

1.1 应对措施

1.1.1 PrepareStatement+Bind-variable

对 Java、JSP 开发的应用,可以使用该方式,不要使用拼接的SQL。

String sql = "select * from users u where u.id = ? and u.password = ?";
Preparedstatement ps = connection.preparestatement(sql);
ps.setint(1,id);
ps.setstring(2,pwd);
resultset rs = ps.executequery(); 

1.1.2 使用应用程序提供的转换函数

很多应用程序接口都提供了对特殊字符进行转换的函数,恰当地使用这些函数,可以防止应用程序用户输入使应用程序生成不期望的语句。

  • MySQL C API:使用 mysql_real_escape_string() API 调用。
  • MySQL++:使用 escape 和 quote 修饰符。

1.1.3 自己定义函数进行校验

输入验证的途径可以分为以下几种:

  • 整理数据使之变得有效;
  • 拒绝已知的非法输入;
  • 只接受已知的合法输入。

过滤特殊符号的同时也要过滤它们的十六进制表示“%XX”。