在MVC模式下,用户和服务之间的交互,总是会传输一些特殊字符,比如
输入以下
¿' OR 1 limit 1/*
select id,isDisplay from user where usname='縗' OR 1 limit 1/*' and passwd=''
就会看到有一个'就可以PASS掉,这样是可怕的事情
后果:加入;就可以做任何想做的事情了。。
在执行sql语句之前,还是mysql_real_escape_string来处理
还有一些特殊符号
$str = addslashes('Shanghai is the "biggest" city in China.');
echo($str);
运行结果
Shanghai is the \"biggest\" city in China.
举个例子
这是一个sql注入的
$con=mysql_connect($dbhostip,$username,$userpassword) or die("Unable to connect to the MySQL!");
$db = mysql_select_db($dbdatabasename,$con);
//执行语句
$name = '1 or 1 = 1';
$qres=mysql_query("SELECT * FROM brand where name = ".$name);
$row = mysql_fetch_row($qres);
print_r($row);exit;
居然可以查询一条记录,brand表都没有这条记录
解决办法很多
1 pdo预查询
2 mysqli
$dbh = new PDO('mysql:host=localhost;dbname=test', 'root', 'root');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->exec('set names utf8');
$login = '1 or 1 = 1%';
$sql = "SELECT * FROM `brand` WHERE `name` LIKE :login";
$stmt = $dbh->prepare($sql);
$stmt->execute(array(':login'=>$login));
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
print_r($row);
}
print_r( $stmt->fetchAll(PDO::FETCH_ASSOC));
这样就可以避免查询的sql注入
电脑版编辑器
可用 htmlspecialchars 函数