基础知识思考整理
http://blog.csdn.net/aganlengzi/article/details/51932826
原理:
- SQL Injection就是利用某些数据库的外部接口把用户数据插入到实际的数据库操作语言(SQL)当中,从而达到入侵数据库乃至操作系统的目的。它的产生主要是由于程序对用户输入 的数据没有进行严格的过滤,导致非法数据库查询语句的执行。
举例:
- 如下面的用户登陆验证程序:
$sql = “SELECT * FROM user WHERE username=’$username’ AND password=’$password’”;
$result = mysql_db_query($dbname, $sql);
如果我们提交如下url:
http://127.0.0.1/injection/user.php?username=angel’ or ‘1=1’
那么就可以成功登陆系统,但是很显然这并不是我们预期的,同样我们也可以利用sql的注释语句实现sql注入,如下面的例子:
http://127.0.0.1/injection/user.php?username=angel‘/*
http://127.0.0.1/injection/user.php?username=angel‘%23
这样就把后面的语句给注释掉了!第一句是利用逻辑运算,第二、三句是根据mysql的特性,mysql支持/*和#两种注释格式,所以提交的时候是把后面的代码注释掉,值得注意的是由于编码问题,在IE地址栏里提交#会变成空的,所以我们在地址栏提交的时候,应该提交%23,才会变成#,就成功注释了, 这个比逻辑运算简单得多了。
防注入方法:
prepareStatement + Bind-variable而尽量不要使用拼接的sql。
Java和Jsp:prepareStatement + Bind-variable
PHP +:mysqli中支持prepared statements使用应用程序提供的转换函数
MySQL C API:mysql_real_escape_string() API调用。
MySQL++:escape和quote 修饰符。
Perl DBI:使用placeholders或者quote()方法。
Ruby DBI:使用placeholders或者quote()方法。
Java JDBC:使用PreparedStatement和 placeholders。
PHP:使用mysql_real_escape_string()函数(适用于PHP 4.3.0,之前的版本请使用mysql_escape_string(), PHP 4.0.3之前的版本请使用addslashes())。从PHP 5开始,可以使用扩展的mysqli,这是对MYSQL新特性的一个扩展支持,其中的一个优点就是支持prepared statements。自己定义函数进行校验
如果现有的转换函数仍然不能满足要求,则需要自己编写函数进行输入校验。输入验证是一个很复杂的问题。输入验证的途径可以分为以下几种:
整理数据使之变得有效;
拒绝已知的非法输入;
只接受已知的合法的输入。