YII Framework框架教程之安全方案详解


Posted in PHP onMarch 14, 2016

本文讲述了YII Framework框架的安全方案。分享给大家供大家参考,具体如下:

web应用的安全问题是很重要的,在“黑客”盛行的年代,你的网站可能明天都遭受着攻击,为了从某种程度上防止被攻击,YII提供了防止攻击的几种解决方案。当然这里讲的安全是片面的,但是值得一看。

官方提供的解决方案有:如下

1. 跨站脚本攻击的防范

跨站脚本攻击(简称 XSS),即web应用从用户收集用户数据。 攻击者常常向易受攻击的web应用注入JavaScript,VBScript,ActiveX,HTML或 Flash来迷惑访问者以收集访问者的信息。 举个例子,一个未经良好设计的论坛系统可能不经检查就显示用户所输入的内容。 攻击者可以在帖子内容中注入一段恶意的JavaScript代码。 这样,当其他访客在阅读这个帖子的时候,这些JavaScript代码就可以在访客的电脑上运行了。

一个防范XSS攻击的最重要的措施之一就是:在显示用户输入的内容之前进行内容检查。 比如,你可以对内容中的HTML进行转义处理。但是在某些情况下这种方法就不可取了,因为这种方法禁用了所有的HTML标签。

Yii集成了HTMLPurifier并且为开发者提供了一个很有用的组件CHtmlPurifier, 这个组件封装了HTMLPurifier类。它可以将通过有效的审查、安全和白名单功能来把所审核的内容中的所有的恶意代码清除掉,并且确保过滤之后的内容过滤符合标准。

CHtmlPurifier组件可以作为一个widget或者filter来使用。 当作为一个widget来使用的时候,CHtmlPurifier可以对在视图中显示的内容进行安全过滤。 以下是代码示例:

<?php $this->beginWidget('CHtmlPurifier'); ?>
//...这里显示用户输入的内容...
<?php $this->endWidget(); ?>

2. 跨站请求伪造攻击的防范

跨站请求伪造(简称CSRF)攻击,即攻击者在用户浏览器在访问恶意网站的时候,让用户的浏览器向一个受信任的网站发起攻击者指定的请求。 举个例子,一个恶意网站有一个图片,这个图片的src地址指向一个银行网站:http://bank.example/withdraw?transfer=10000&to=someone。 如果用户在登陆银行的网站之后访问了这个恶意网页,那么用户的浏览器会向银行网站发送一个指令,这个指令的内容可能是“向攻击者的帐号转账10000元”。 跨站攻击方式利用用户信任的某个特定网站,而CSRF攻击正相反,它利用用户在某个网站中的特定用户身份。

要防范CSRF攻击,必须谨记一条:GET请求只允许检索数据而不能修改服务器上的任何数据。 而POST请求应当含有一些可以被服务器识别的随机数值,用来保证表单数据的来源和运行结果发送的去向是相同的。

Yii实现了一个CSRF防范机制,用来帮助防范基于POST的攻击。 这个机制的核心就是在cookie中设定一个随机数据,然后把它同表单提交的POST数据中的相应值进行比较。

默认情况下,CSRF防范是禁用的。如果你要启用它,可以编辑应用配置 中的组件中的CHttpRequest部分。

代码示例:

return array(
  'components'=>array(
    'request'=>array(
      'enableCsrfValidation'=>true,
    ),
  ),
);

要显示一个表单,请使用CHtml::form而不要自己写HTML代码。因为CHtml::form可以自动地在表单中嵌入一个隐藏项,这个隐藏项储存着验证所需的随机数据,这些数据可在表单提交的时候发送到服务器进行验证。

3. Cookie攻击的防范

保护cookie免受攻击是非常重要的。因为session ID通常存储在Cookie中。 如果攻击者窃取到了一个有效的session ID,他就可以使用这个session ID对应的session信息。

这里有几条防范对策:

您可以使用SSL来产生一个安全通道,并且只通过HTTPS连接来传送验证cookie。这样攻击者是无法解密所传送的cookie的。

设置cookie的过期时间,对所有的cookie和seesion令牌也这样做。这样可以减少被攻击的机会。

防范跨站代码攻击,因为它可以在用户的浏览器触发任意代码,这些代码可能会泄露用户的cookie。

在cookie有变动的时候验证cookie的内容。

Yii实现了一个cookie验证机制,可以防止cookie被修改。启用之后可以对cookie的值进行HMAC检查。

Cookie验证在默认情况下是禁用的。如果你要启用它,可以编辑应用配置 中的组件中的CHttpRequest部分。

代码示例:

return array(
  'components'=>array(
    'request'=>array(
      'enableCookieValidation'=>true,
    ),
  ),
);

一定要使用经过Yii验证过的cookie数据。使用Yii内置的cookies组件来进行cookie操作,不要使用$_COOKIES。

// 检索一个名为$name的cookie值
$cookie=Yii::app()->request->cookies[$name];
$value=$cookie->value;
......
// 设置一个cookie
$cookie=new CHttpCookie($name,$value);
Yii::app()->request->cookies[$name]=$cookie;

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
php牛逼的面试题分享
Jan 18 PHP
深入理解php的MySQL连接类
Jun 07 PHP
PHP设计模式之命令模式的深入解析
Jun 13 PHP
解析PHP处理换行符的问题 \r\n
Jun 13 PHP
header导出Excel应用示例
Jan 24 PHP
php+highchats生成动态统计图
May 21 PHP
php实现的简单美国商品税计算函数
Jul 13 PHP
PHP实现二维数组去重功能示例
Jan 12 PHP
php中时间函数date及常用的时间计算
May 12 PHP
PHP编程快速实现数组去重的方法详解
Jul 22 PHP
php统计数组不同元素的个数的实例方法
Sep 26 PHP
浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
Oct 21 PHP
YII Framework框架教程之日志用法详解
Mar 14 #PHP
YII Framework教程之异常处理详解
Mar 14 #PHP
Zend Framework教程之Application用法实例详解
Mar 14 #PHP
Zend Framework自定义Helper类相关注意事项总结
Mar 14 #PHP
Zend Framework教程之Bootstrap类用法概述
Mar 14 #PHP
如何解决PHP使用mysql_query查询超大结果集超内存问题
Mar 14 #PHP
Zend Framework教程之资源(Resources)用法实例详解
Mar 14 #PHP
You might like
PHP获取网址的顶级域名函数代码
2012/09/24 PHP
PHP文件及文件夹操作之创建、删除、移动、复制
2016/07/13 PHP
详解php框架Yaf路由重写
2017/06/20 PHP
如何实现浏览器上的右键菜单
2006/07/10 Javascript
jquery 实现checkbox全选,反选,全不选等功能代码(奇数)
2012/10/24 Javascript
js形成页面的一种遮罩效果实例代码
2014/01/04 Javascript
jQuery+html5+css3实现圆角无刷新表单带输入验证功能代码
2015/08/21 Javascript
jQuery实现无限往下滚动效果代码
2016/04/16 Javascript
Bootstrap实现弹性搜索框
2016/07/11 Javascript
微信端开发--登录小程序步骤
2017/01/11 Javascript
Node.js实现文件上传的示例
2017/06/28 Javascript
对于Javascript 执行上下文的全面了解
2017/09/05 Javascript
JavaScript实现JSON合并操作示例【递归深度合并】
2018/09/07 Javascript
React如何解决fetch跨域请求时session失效问题
2018/11/02 Javascript
vue 动态组件用法示例小结
2020/03/06 Javascript
python通过pil模块获得图片exif信息的方法
2015/03/16 Python
python字符串string的内置方法实例详解
2018/05/14 Python
Python基于xlrd模块操作Excel的方法示例
2018/06/21 Python
python用线性回归预测股票价格的实现代码
2019/09/04 Python
python机器学习库xgboost的使用
2020/01/20 Python
解决django FileFIELD的编码问题
2020/03/30 Python
Python图片处理模块PIL操作方法(pillow)
2020/04/07 Python
Python猫眼电影最近上映的电影票房信息
2020/09/18 Python
python 爬虫如何实现百度翻译
2020/11/16 Python
html5 学习简单的拾色器
2010/09/03 HTML / CSS
html5 canvas实现给图片添加平铺水印
2019/08/20 HTML / CSS
html5使用window.postMessage进行跨域实现数据交互的一次实战
2021/02/24 HTML / CSS
美国瑜伽品牌:Gaiam
2017/10/31 全球购物
斯巴达比赛商店:Spartan Race
2019/01/08 全球购物
希腊香水和化妆品购物网站:Parfimo.gr
2019/10/03 全球购物
《威尼斯的小艇》教学反思
2014/02/17 职场文书
优秀护士先进事迹
2014/05/08 职场文书
公司领导九九重阳节发言稿2014
2014/09/25 职场文书
开展党的群众路线教育实践活动总结报告
2014/10/31 职场文书
优秀班组申报材料
2014/12/25 职场文书
走进科学观后感
2015/06/18 职场文书