SQL注入与XSS攻击

sql注入

以下以Yii2.0为例

SQL注入是属于注入式攻击,这种攻击是因为在项目中没有将代码与数据(比如用户敏感数据)隔离,在读取数据的时候,错误的将数据作为代码的一部分执行而导致的。

典型的例子就是当对SQL语句进行字符串拼接的时候,直接使用未转义的用户输入内容作为变量。这时,只要在sql语句的中间做修改,比如加上drop、delete等关键字,执行之后后果不堪设想。
如何处理:
1、过滤用户输入参数中的特殊字符,降低风险。(前、后端)
2、禁止通过字符串拼接sql语句,要严格使用 参数绑定 来传入参数。
3、合理使用数据库框架提供的机制。就比如Mybatis提供的传入参数的方式 #{},禁止使用${},后者相当于是字符串拼接sql,要使用参数化的语句。

总结下,就是要正确使用【参数化绑定sql变量】。

后台注入代码示例:

1
2
3
4
5
6
7
8
9
10
$data=[
'str'=>'hello world <script>alert(1)</script>',
]

sql注入 or 1=1或 ';drop table user;--'
控制器 访问数据库 占位符‘:‘
$id=1
$sql='select * from article where id=:id';
$r=Article::findBySql($sql,[':id'=>$id])->all();
dd($r);

Yii2.0-advanced绑定变量

1
2
$this->pageinfo=$pageinfo->find()->select(['title','keywords','description'])->where('file_name =:file_name and is_delete=:is_delete')
->addParams([':file_name'=>'cate',':is_delete'=>0])->asArray()->one();

xss攻击与sql注入

想用sql查询请尽量用占位去操作

yii中纯文本输出,对要输出的内容 CHtml::encode() 即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?= Html::a('text', 'url', [
'data' => [
'method' => 'post',
'params' => [
'params_key' => 'params_val'
]
]
])?>

1.use yii\helpers\Html;
<?php echo Html::a('编辑',['edit','id'=>$info['goods_id']])?>
2.有确认框的删除操作提示信息(其中delete为该控制器中对应的删除的方法)
<?php echo Html::a('删除',['delete','id'=>$info['goods_id']],['onclick'=>'return confirm("aaaaa")'])?>a

$purifier = new CHtmlPurifier;echo $purifier->purify($content);

防止XSS攻击

XSS:跨站脚本攻击,Cross-Site Scripting,为了和前端的css避免重名,简称为XSS,是指通过技术手段,向正常用户请求的HTML页面中插入恶意脚本,执行。

这种攻击主要是用于信息窃取和破坏等目的。比如2011年的微博XSS攻击事件,攻击者利用了微博发布功能中未对action-data漏洞做有效的过滤,在发布微博信息的时候带上了包含攻击脚本的URL,用户访问就会加载恶意脚本,导致大量用户被攻击。

关于防范XSS上,主要就是通过对用户输入的数据做过滤或者是转义,可以使用框架提供的工具类HtmlUtil。另外前端在浏览器展示数据的时候,要使用安全的API展示数据。比如使用innerText而不是innerHTML。

输出的内容包含脚本,从而对请求的用户进行攻击破坏或窃取信息。
主要预防方式是:通过对用户输入的数据做过滤或者是转义

例如视图输出:字符串过滤

1
2
3
4
5
6
7
8
9
<?php
use \yii\helpers\Html;
user \yii\helpers\HtmlPurifier;
?>

<P><?=Html::encode($user->name)?></P> 实体化
<?=HtmlPurifier::process($post->text)?> 去除标签,html显示的文本,更好
<?= Html::encode("{$country->name} ({$country->code})") ?>:
<?= $country->population ?>

CSRF

跨站请求伪造,在用户并不知情的情况下,冒充用户发送请求,在当前已经登录的web网站上执行恶意操作,比如恶意发帖,修改密码等。

大致来看,与XSS有重合的地方,前者是黑客盗用用户浏览器中的登录信息,冒充用户去执行操作。后者是在正常用户请求的HTML中放入恶意代码,XSS问题出在用户数据没有转义,过滤;CSRF问题出现在HTTP接口没有防范不守信用的调用。

防范CSRF的漏洞方式:
1、CSRF Token验证,利用浏览器的同源限制,在HTTP接口执行前验证Cookie中的Token,验证通过才会继续执行请求
2、人机交互,例如短信验证码、界面的滑块