1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
---
title: '[Yii]Yii下防守CSRF与XSS[一]'
author: hujiulin
type: post
date: 2015-07-19T02:59:44+00:00
url: /web开发-888.html
post_views_count:
- 2243
categories:
- Web开发
tags:
- CSRF
- PHP
- XSS
- Yii
---
CSRF即跨站伪造请求,XSS即跨站脚本攻击,说实话我也是最近才第一次接触。 编写了一个Yii的网站,用测试软件(比如,IBM APP Scan)扫描之后发现比较多以及比较严重的两个问题,一个是CSRF,另一个是XSS。 那么如何解决呢?
– CSRF
参考链接:<http://www.crarun.com/article-7.html>
Yii在配置文件中,支持csrf配置,一旦配置之后,会在表单中嵌入一个隐藏的value为hash key的token,服务器通过token验证当次请求是否被授权。
```php
'components'=>array(
'request'=>array(
// Enable Yii Validate CSRF Token
'enableCsrfValidation' => true,
),
),
|
实际上,因为我用的Yii框架版本比较低,所以在form表单中,框架并没有为我自己创建input,所以被逼无奈,只能自己创建,插入一下代码即可:
1
|
<input type="hidden" value="<?php echo Yii::app()->getRequest()->getCsrfToken(); ?>" name="YII_CSRF_TOKEN" />
|
另一个问题来了,因为是fix csrf,前期考虑得不是很周详,但是整个系统中含有大量的ajax创建的post提交,这导致了很多js代码中含有post提交,但是Yii的view输出并不能影响到js的代码里面,即.js文件里面就算是加了上述代码,php也不会有任何输出。 此时我想了一个折中的办法:
在js的post提交中加入以下代码:
1
|
$("input[name='YII_CSRF_TOKEN']").val()
|
然后在php view里面加入隐藏的代码即可。 但是这也看出一个问题,这并不能完备的防止csrf,最优的解决办法,还是应该将授权嵌入每个用户的session中。
– XSS
在搜寻该问题的解决方案时,经常有人会问:在提交、保存、显示那个阶段做字符串过滤比较好。 在segmentfault上看到一个人的答案是,确认不可。一个防止入库,一个防止生效。
我认为, 首先提交时前端的用户验证必不可少,这会给用户一个比较好的体验。 但是服务器端的提交验证还是必须做的,因为程序是可以绕过前端的。
最后,显示的时候做么?我建议做,这样更加的保险,防止问题生效。
如何做?Yii下自己提供了CHtml以及CHTMLPurity供做一些过滤工作。 在GitHub上有很多人开源一个前台比较好的库用于做过滤,just search it.