安全类

最后更新于:2022-04-01 03:54:52

# 安全类 安全类包含了一些方法,用于安全的处理输入数据,帮助你创建一个安全的应用。 * [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 的令牌。 注解 输出并不能保证绝对安全,只是尽量做到更安全。
';