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注入的问题发生。