drodata / blog

A test project used for learning the Yii Framework
0 stars 0 forks source link

Leran Security: XXS + the `filter` validation rule #14

Open drodata opened 9 years ago

drodata commented 9 years ago

读完 Security - Cross-site Scripting Prevention 后,发现之前根本没在意这方面。随便找了一个页面(clip/create ),在 "Content" 栏输入下面的内容并提交:

<script>alert('OMG');</script>

clip/view 页面,弹窗出现,一个最简单的 XSS 实例就这么诞生了。

Resolution

CHtmlPurifier API 中说由于 HTML Purifier Package 体积大,因此会影响到性能。API 中建议的正确使用方法是——在数据存入 DB 前进行 purify 工作,而不是将含有恶意代码的内容存入 DB, 每次读取前进行一次 purify 工作。

CHtmlPurifier 可以以 validation rule 的形式使用,下面是一个例子:

array('title, content','filter','filter'=>array($obj=new CHtmlPurifier(),'purify')),

套用到其它 Models 时,仅需修改第一个参数即可。


:bulb: filter 的值类型为 Callback, 如果对 array($obj=new CHtmlPurifier(),'purify') 表示疑惑,表明对 Callback 的基础知识欠缺。Callback 的本质是函数,而函数有多种形式:普通自定义函数、类中的方法等。对于前者,直接用 String 类型的函数名表示即可,后者需要用特殊的数组来表示:Index 0 表示实例化的类,Index 1 表示方法的名称。


此外,filter validation rule 实际上不是 validator, 而是 data processor. 它的作用和函数 trim() 的作用很类似。以上面这个 rule 为例,假设 content 栏输入内容如下:

Hello<script>alert('OMG');</script>

经过 filter validator “验证”(实际上是处理)后,content 的值已经变成:

Hello

本次 commit 以 clip model 为例,演示了如何避免 XSS 攻击,以后凡是使用文本框(<input type="text">, <textarea>)搜集数据的 attributes, 都要加上 filter validation rule.

drodata commented 9 years ago

array($obj=new CHtmlPurifier(),'purify')

表示 Callback 没看懂,参考 Callback 基础内容后明白,这个 callback 实际上是 $obj->purify() method.