[Yii]Yii下防守CSRF与XSS[二]

之前已经写过Yii下防守CSRF与XSS[一] 但是真正面临测试的时候,有一个需求是说希望过滤掉特殊的字符,比如:,:,”,<,>,%等。

Yii中的CHtml::purifier实际上只针对html的过滤,CHtml::encode本质上调用的是htmlspecialchars:

  • htmlspecialchars只转化<、>、 单引号、双引号、&符号
  • htmlentities会转化所有的html符号

可以看到PHP内置的函数都不能过滤全部的特殊字符,此时采用的方式是在Yii框架下,新建一个Filter类,自己重写specialchar函数,可以随心所欲的替换字符。为了提高性能,可以定义成public static调用。

1
2
3
4
5
6
7
class Filter {
    public static function ReplaceSpecialChar($str) {
        $str=str_replace(":",$str); //TODO: replace other chars
        $str = htmlspecialchars($str);
        return $str;
    }
}