数据库库之安全篇(一)

20 篇文章 0 订阅
2 篇文章 0 订阅

在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 函数

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明雨星云

感谢,我会继续创作更优质作品

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值