sql注入测试代码

先上测试代码:

<?php
error_reporting(0);
$show_name=$_GET['name'];
var_dump($show_name);
if(!get_magic_quotes_gpc()){
    $show_name = addslashes($show_name);
}
if(!empty($show_name)){
    $db = mysql_connect("127.0.0.1:3306","root","password");
    if(!$db){
        die('Could not connect: ' . mysql_error());
    }
    mysql_select_db("pdlc");
    mysql_query("set names utf8;");
    $sql = "select * from user where show_name='$show_name'";
    // echo $sql."<br />";
    $r = mysql_query($sql);
    $r = mysql_num_rows($r);
    var_dump($r);   
}else{
?> 
<html>
<head></head>
<body>
<form method="get">
    <input type="text" name="name" />
    <input type="submit" value="submit" />
</form>
</body>
</html>
<?php
}
?>

如果系统魔法引号处于关闭状态,服务端接收到的参数不用addslashes转意的话会很容易产生sql注入,比如输入:

苏俊杰' or 1='1

则服务端sql会是:

select * from user where show_name='苏俊杰' and 1='1';

输出结果会为:

string(18) "苏俊杰' or 1='1" int(926) 

可以看到这里查出了系统所有用户(总共926个用户)。

另外PDO和mysqli使用变量绑定的时候会自动对变量进行转意,同样会防止此类sql注入的问题发生。

posted @ 2013-06-13 18:08  soj  阅读(1308)  评论(0编辑  收藏  举报