所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。
上面是在百度百科中搜到的一段话,这里主要是想具体演示一下这个过程。
1. 准备数据库,在MySQL的test数据库中执行如下SQL语句:
CREATE TABLE `test`.`admin_user` ( `login` VARCHAR( 20 ) NOT NULL , `password` VARCHAR( 20 ) NOT NULL ) ENGINE = InnoDB; INSERT INTO admin_user(login, password) VALUES('admin', 'admin'); INSERT INTO admin_user(login, password) VALUES('user1', 'pass1'); INSERT INTO admin_user(login, password) VALUES('user2', 'pass2'); INSERT INTO admin_user(login, password) VALUES('user3', 'pass3');
2. 建立测试用PHP文件test.php:
<?php if (isset($_REQUEST['submit'])) { $login = $_REQUEST['login']; $sql = "SELECT login, password FROM admin_user WHERE login = '$login'"; print_r($sql); $db = mysql_connect('localhost', 'root', ''); mysql_select_db('test', $db); $result = mysql_query($sql, $db); echo '<table border=3><tr><td>Login</td><td>Password</td></tr>'; while ($row = mysql_fetch_assoc($result)) { echo '<tr>'; echo '<td>' . $row['login'] . '</td>'; echo '<td>' . $row['password'] . '</td>'; echo '</tr>'; } echo '</table>'; ?> <?php } else { ?> <form method="post"> Login: <input type="text" name="login" value="" /><br/> <input type="submit" name="submit" value="Submit" /><br/> </form> <?php }
PHP文件test.php的本意是当使用者在HTML表单中输入login后,服务器在后台数据库中查询到满足条件的一笔资料然后返回给浏览器。比如我们正常的输入$login="user1",则组合后的SQL语句是:
SELECT login, password FROM admin_user WHERE login = 'user1'
这个时候结果是正确的,没有问题。
那SQL注入式攻击是怎样的呢? 我们尝试这样输入:$name="a' or '1'='1"(注意单引号),那生成的SQL语句就变成了:
SELECT login, password FROM admin_user WHERE login = 'a' or '1'='1'
结果将admin_user这个表里面的所有数据显示了出来。
那如何解决这个问题呢?简单,看这篇文章http://www.nextphp.com/article.php?id=114,使用mysql_escape_string()或者addslashes()就可以了。修改上面的取值代码:
$login = mysql_escape_string$_REQUEST['login']);
再次输入$name="a' or '1'='1",这个时候生成的SQL语句就没有问题了:
SELECT login, password FROM admin_user WHERE login = 'a\' or \'1\'=\'1'