# 安全类
安全类包含了一些方法,用于安全的处理输入数据,帮助你创建一个安全的应用。
* [XSS 过滤](http://codeigniter.org.cn/user_guide/libraries/security.html#xss)
* [跨站请求伪造(CSRF)](http://codeigniter.org.cn/user_guide/libraries/security.html#csrf)
* [类参考](http://codeigniter.org.cn/user_guide/libraries/security.html#id2)
## [XSS 过滤](http://codeigniter.org.cn/user_guide/libraries/security.html#id3)
CodeIgniter 自带了一个 XSS 过滤器来防御攻击,它可以设置为自动运行过滤 所有遇到的 POST 和 COOKIE 数据,也可以针对某一条数据进行过滤。默认情况下 它不是全局运行的,因为它会有相当的开销,况且你并不是在所有地方都需要它。
XSS 过滤器会查找那些常被用来触发 JavaScript 脚本或者其他类型的企图劫持 Cookie 或者其它恶意行为的代码。如果发现任何不允许的内容,它将把那些内容 转换为字符实体,以确保安全。
注意:这个函数只应该用来处理那些提交过来的数据,它不适合在一般情况下使用, 因为它的执行会有相当大的开销。
使用 XSS 过滤器过滤数据可以使用 xss_clean() 方法:
~~~
$data = $this->security->xss_clean($data);
~~~
它还有一个可选的第二个参数 is_image ,允许此函数对图片进行检测以发现那些潜在的 XSS 攻击, 这对于保证文件上传的安全非常有用。当此参数被设置为 TRUE 时, 函数的返回值将是一个布尔值,而不是一个修改过的字符串。如果图片是安全的则返回 TRUE , 相反, 如果图片中包含有潜在的、可能会被浏览器尝试运行的恶意信息,函数将返回 FALSE 。
~~~
if ($this->security->xss_clean($file, TRUE) === FALSE)
{
// file failed the XSS test
}
~~~
## [跨站请求伪造(CSRF)](http://codeigniter.org.cn/user_guide/libraries/security.html#id4)
打开你的 application/config/config.php 文件,进行如下设置,即可启用 CSRF 保护:
~~~
$config['csrf_protection'] = TRUE;
~~~
如果你使用 [表单辅助函数](http://codeigniter.org.cn/user_guide/helpers/form_helper.html) ,form_open() 函数将会自动地在你的表单中插入一个隐藏的 CSRF 字段。如果没有插入这个字段, 你可以手工调用get_csrf_token_name() 和 get_csrf_hash() 这两个函数。
~~~
$csrf = array(
'name' => $this->security->get_csrf_token_name(),
'hash' => $this->security->get_csrf_hash()
);
...
<input type="hidden" name="<?=$csrf['name'];?>" value="<?=$csrf['hash'];?>" />
~~~
令牌(tokens)默认会在每一次提交时重新生成,或者你也可以设置成在 CSRF cookie 的生命周期内一直有效。默认情况下令牌重新生成提供了更严格的安全机制,但可能会对 可用性带来一定的影响,因为令牌很可能会变得失效(譬如使用浏览器的返回前进按钮、 使用多窗口或多标签页浏览、异步调用等等)。你可以修改下面这个参数来改变这一点。
~~~
$config['csrf_regenerate'] = TRUE;
~~~
另外,你可以添加一个 URI 的白名单,跳过 CSRF 保护(例如某个 API 接口希望接受 原始的 POST 数据),将这些 URI 添加到 'csrf_exclude_uris' 配置参数中:
~~~
$config['csrf_exclude_uris'] = array('api/person/add');
~~~
URI 中也支持使用正则表达式(不区分大小写):
~~~
$config['csrf_exclude_uris'] = array(
'api/record/[0-9]+',
'api/title/[a-z]+'
);
~~~
## [类参考](http://codeigniter.org.cn/user_guide/libraries/security.html#id5)
classCI_Security
xss_clean($str[, $is_image = FALSE])
参数:
* **$str** (mixed) -- Input string or an array of strings
返回: XSS-clean data
返回类型: mixed
尝试移除输入数据中的 XSS 代码,并返回过滤后的数据。 如果第二个参数设置为 TRUE ,将检查图片中是否含有恶意数据,是的话返回 TRUE ,否则返回 FALSE 。
sanitize_filename($str[, $relative_path = FALSE])
参数:
* **$str** (string) -- File name/path
* **$relative_path** (bool) -- Whether to preserve any directories in the file path
返回: Sanitized file name/path
返回类型: string
尝试对文件名进行净化,防止目录遍历尝试以及其他的安全威胁,当文件名作为用户输入的参数时格外有用。
~~~
$filename = $this->security->sanitize_filename($this->input->post('filename'));
~~~
如果允许用户提交相对路径,譬如 file/in/some/approved/folder.txt ,你可以将第二个参数 $relative_path 设置为 TRUE 。
~~~
$filename = $this->security->sanitize_filename($this->input->post('filename'), TRUE);
~~~
get_csrf_token_name()
返回: CSRF token name
返回类型: string
返回 CSRF 的令牌名(token name),也就是 $config['csrf_token_name'] 的值。
get_csrf_hash()
返回: CSRF hash
返回类型: string
返回 CSRF 哈希值(hash value),在和 get_csrf_token_name() 函数一起使用时很有用,用于生成表单里的 CSRF 字段 以及发送有效的 AJAX POST 请求。
entity_decode($str[, $charset = NULL])
参数:
* **$str** (string) -- Input string
* **$charset** (string) -- Character set of the input string
返回: Entity-decoded string
返回类型: string
该方法和 ENT_COMPAT 模式下的 PHP 原生函数 html_entity_decode() 差不多,只是它除此之外,还会检测不以分号结尾的 HTML 实体,因为有些浏览器允许这样。
如果没有设置 $charset 参数,则使用你配置的 $config['charset'] 参数作为编码格式。
get_random_bytes($length)
参数:
* **$length** (int) -- Output length
返回: A binary stream of random bytes or FALSE on failure
返回类型: string
这是一种生成随机字符串的简易方法,该方法通过按顺序调用 mcrypt_create_iv(), /dev/urandom 和 openssl_random_pseudo_bytes() 这三个函数,只要有一个函数是可用的,都可以返回随机字符串。
用于生成 CSRF 和 XSS 的令牌。
注解
输出并不能保证绝对安全,只是尽量做到更安全。
- 欢迎使用 CodeIgniter
- 安装说明
- 下载 CodeIgniter
- 安装说明
- 从老版本升级
- 疑难解答
- CodeIgniter 概览
- CodeIgniter 将从这里开始
- CodeIgniter 是什么?
- 支持特性
- 应用程序流程图
- 模型-视图-控制器
- 设计与架构目标
- 教程 - 内容提要
- 加载静态内容
- 读取新闻条目
- 创建新闻条目
- 结束语
- 常规主题
- CodeIgniter URL
- 控制器
- 保留名称
- 视图
- 模型
- 辅助函数
- 使用 CodeIgniter 类库
- 创建类库
- 使用 CodeIgniter 驱动器
- 创建驱动器
- 创建核心系统类
- 创建附属类
- 钩子 - 扩展框架核心
- 自动加载资源
- 公共函数
- 兼容性函数
- URI 路由
- 错误处理
- 网页缓存
- 程序分析
- 以 CLI 方式运行
- 管理你的应用程序
- 处理多环境
- 在视图文件中使用 PHP 替代语法
- 安全
- PHP 开发规范
- 类库参考
- 基准测试类
- 缓存驱动器
- 日历类
- 购物车类
- 配置类
- Email 类
- 加密类
- 加密类(新版)
- 文件上传类
- 表单验证类
- FTP 类
- 图像处理类
- 输入类
- Javascript 类
- 语言类
- 加载器类
- 迁移类
- 输出类
- 分页类
- 模板解析类
- 安全类
- Session 类
- HTML 表格类
- 引用通告类
- 排版类
- 单元测试类
- URI 类
- 用户代理类
- XML-RPC 与 XML-RPC 服务器类
- Zip 编码类
- 数据库参考
- 数据库快速入门: 示例代码
- 数据库配置
- 连接你的数据库
- 查询
- 生成查询结果
- 查询辅助函数
- 查询构造器类
- 事务
- 数据库元数据
- 自定义函数调用
- 数据库缓存类
- 数据库工厂类
- 数据库工具类
- 数据库驱动器参考
- 辅助函数参考
- 数组辅助函数
- 验证码辅助函数
- Cookie 辅助函数
- 日期辅助函数
- 目录辅助函数
- 下载辅助函数
- 邮件辅助函数
- 文件辅助函数
- 表单辅助函数
- HTML 辅助函数
- 语言辅助函数
- Inflector 辅助函数
- 数字辅助函数
- 路径辅助函数
- 安全辅助函数
- 表情辅助函数
- 字符串辅助函数
- 文本辅助函数
- 排版辅助函数
- URL 辅助函数
- XML 辅助函数
- 向 CodeIgniter 贡献你的力量