CI框架安全类Security.php源码分析
之前我们分析了CI框架的session类session.php,本文我们继续分析CI框架的安全类security.php文件,方便我们更详细的了解CI框架,从而更熟练的应用CI框架
CI安全类提供了全局防御CSRF攻击和XSS攻击策略,只需要在配置文件开启即可:
复制代码 代码如下:
$config['csrf_protection'] = TRUE;
$config['global_xss_filtering'] = TRUE;
并提供了实用方法:
复制代码 代码如下:
$this->security->xss_clean($data);//第二个参数为TRUE,验证图片安全
$this->security->sanitize_filename()//过滤文件名
CI也提供了安全函数:
xss_clean()//xss过滤
sanitize_filename()//净化文件名
do_hash()//md5或sha加密
strip_image_tags() //删除图片标签的不必要字符
encode_php_tags()//把PHP脚本标签强制转成实体对象
复制代码 代码如下:
/**
* 安全类
*/
class CI_Security {
//url的随机hash值
protected $_xss_hash = '';
//防csrf攻击的cookie标记的哈希值
protected $_csrf_hash = '';
//防csrf cookie过期时间
protected $_csrf_expire = 7200;
//防csrf的cookie名称
protected $_csrf_token_name = 'ci_csrf_token';
//防csrf的token名称
protected $_csrf_cookie_name = 'ci_csrf_token';
//不允许出现的字符串数组
protected $_never_allowed_str = array(
'document.cookie' => '[removed]',
'document.write' => '[removed]',
'.parentNode' => '[removed]',
'.innerHTML' => '[removed]',
'window.location' => '[removed]',
'-moz-binding' => '[removed]',
'' => '-->',
' '
'
);
//不允许出现的正则表达式数组
protected $_never_allowed_regex = array(
'javascript\s*:',
'expression\s*(\(|&\#40;)', // CSS and IE
'vbscript\s*:', // IE, surprise!
'Redirect\s+302',
"([\"'])?data\s*:[^\\1]*?base64[^\\1]*?,[^\\1]*?\\1?"
);
//构造函数
public function __construct()
{
// CSRF保护是否开启
if (config_item('csrf_protection') === TRUE)
{
// CSRF配置
foreach (array('csrf_expire', 'csrf_token_name', 'csrf_cookie_name') as $key)
{
if (FALSE !== ($val = config_item($key)))
{
$this->{'_'.$key} = $val;
}
}
// _csrf_cookie_name加上cookie前缀
if (config_item('cookie_prefix'))
{
$this->_csrf_cookie_name = config_item('cookie_prefix').$this->_csrf_cookie_name;
}
// 设置csrf的hash值
$this->_csrf_set_hash();
}
log_message('debug', "Security Class Initialized");
}
// --------------------------------------------------------------------
/**
* Verify Cross Site Request Forgery Protection
*
* @return object
*/
public function csrf_verify()
{
// 如果不是post请求,则设置csrf的cookie值
if (strtoupper($_SERVER['REQUEST_METHOD']) !== 'POST')
{
return $this->csrf_set_cookie();
}
// Do the tokens exist in both the _POST and _COOKIE arrays?
if ( ! isset($_POST[$this->_csrf_token_name], $_COOKIE[$this->_csrf_cookie_name]))
{
$this->csrf_show_error();
}
// token匹配吗
if ($_POST[$this->_csrf_token_name] != $_COOKIE[$this->_csrf_cookie_name])
{
$this->csrf_show_error();
}
// We kill this since we're done and we don't want to
// polute the _POST array
unset($_POST[$this->_csrf_token_name]);
// Nothing should last forever
unset($_COOKIE[$this->_csrf_cookie_name]);
$this->_csrf_set_hash();
$this->csrf_set_cookie();
log_message('debug', 'CSRF token verified');
return $this;
}
// --------------------------------------------------------------------
/**
* 设置csrf的cookie值
*/
public function csrf_set_cookie()
{
$expire = time() + $this->_csrf_expire;
$secure_cookie = (config_item('cookie_secure') === TRUE) ? 1 : 0;
if ($secure_cookie && (empty($_SERVER['HTTPS']) OR strtolower($_SERVER['HTTPS']) === 'off'))
{
return FALSE;
}
setcookie($this->_csrf_cookie_name, $this->_csrf_hash, $expire, config_item('cookie_path'), config_item('cookie_domain'), $secure_cookie);
log_message('debug', "CRSF cookie Set");
return $this;
}
//csrf保存
public function csrf_show_error()
{
show_error('The action you have requested is not allowed.');
}
//获取csrf的hash值
public function get_csrf_hash()
{
return $this->_csrf_hash;
}
//获取csrf的token值
public function get_csrf_token_name()
{
return $this->_csrf_token_name;
}
/**
* XSS 过滤
*/
public function xss_clean($str, $is_image = FALSE)
{
//是否是数组
if (is_array($str))
{
while (list($key) = each($str))
{
$str[$key] = $this->xss_clean($str[$key]);
}
return $str;
}
//去掉可见字符串
$str = remove_invisible_characters($str);
// 验证实体url
$str = $this->_validate_entities($str);
/*
* URL 解码
*
* Just in case stuff like this is submitted:
*
* Google
*
* Note: Use rawurldecode() so it does not remove plus signs
*
*/
$str = rawurldecode($str);
/*
* Convert character entities to ASCII
*
* This permits our tests below to work reliably.
* We only convert entities that are within tags since
* these are the ones that will pose security problems.
*
*/
$str = preg_replace_callback("/[a-z]+=([\'\"]).*?\\1/si", array($this, '_convert_attribute'), $str);
$str = preg_replace_callback("/|
/*
* Remove Invisible Characters Again!
*/
$str = remove_invisible_characters($str);
/*
* Convert all tabs to spaces
*
* This prevents strings like this: ja vascript
* NOTE: we deal with spaces between characters later.
* NOTE: preg_replace was found to be amazingly slow here on
* large blocks of data, so we use str_replace.
*/
if (strpos($str, "\t") !== FALSE)
{
$str = str_replace("\t", ' ', $str);
}
/*
* Capture converted string for later comparison
*/
$converted_string = $str;
// Remove Strings that are never allowed
$str = $this->_do_never_allowed($str);
/*
* Makes PHP tags safe
*
* Note: XML tags are inadvertently replaced too:
*
*
*
* But it doesn't seem to pose a problem.
*/
if ($is_image === TRUE)
{
// Images have a tendency to have the PHP short opening and
// closing tags every so often so we skip those and only
// do the long opening tags.
$str = preg_replace('/
}
else
{
$str = str_replace(array(''), array(''), $str);
}
/*
* Compact any exploded words
*
* This corrects words like: j a v a s c r i p t
* These words are compacted back to their correct state.
*/
$words = array(
'javascript', 'expression', 'vbscript', 'script', 'base64',
'applet', 'alert', 'document', 'write', 'cookie', 'window'
);
foreach ($words as $word)
{
$temp = '';
for ($i = 0, $wordlen = strlen($word); $i
{
$temp .= substr($word, $i, 1)."\s*";
}
// We only want to do this when it is followed by a non-word character
// That way valid stuff like "dealer to" does not become "dealerto"
$str = preg_replace_callback('#('.substr($temp, 0, -3).')(\W)#is', array($this, '_compact_exploded_words'), $str);
}
/*
* Remove disallowed Javascript in links or img tags
* We used to do some version comparisons and use of stripos for PHP5,
* but it is dog slow compared to these simplified non-capturing
* preg_match(), especially if the pattern exists in the string
*/
do
{
$original = $str;
if (preg_match("/
{
$str = preg_replace_callback("#]*?)(>|$)#si", array($this, '_js_link_removal'), $str);
}
if (preg_match("/
{
$str = preg_replace_callback("#]*?)(\s?/?>|$)#si", array($this, '_js_img_removal'), $str);
}
if (preg_match("/script/i", $str) OR preg_match("/xss/i", $str))
{
$str = preg_replace("##si", '[removed]', $str);
}
}
while($original != $str);
unset($original);
// Remove evil attributes such as style, onclick and xmlns
$str = $this->_remove_evil_attributes($str, $is_image);
/*
* Sanitize naughty HTML elements
*
* If a tag containing any of the words in the list
* below is found, the tag gets converted to entities.
*
* So this:

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











네트워크 기술의 발전으로 PHP는 웹 개발을 위한 중요한 도구 중 하나가 되었습니다. 인기 있는 PHP 프레임워크 중 하나인 CodeIgniter(이하 CI)도 점점 더 많은 관심과 사용을 받고 있습니다. 오늘은 CI 프레임워크를 활용하는 방법에 대해 살펴보겠습니다. 1. CI 프레임워크 설치 먼저 CI 프레임워크를 다운로드하여 설치해야 합니다. CI 공식 홈페이지(https://codeigniter.com/)에서 최신 버전의 CI 프레임워크 압축 패키지를 다운로드하세요. 다운로드가 완료되면 압축을 풀어주세요

PHP는 웹 개발에 널리 사용되는 인기 있는 프로그래밍 언어입니다. CI(CodeIgniter) 프레임워크는 PHP에서 가장 널리 사용되는 프레임워크 중 하나입니다. 이는 기성 도구 및 기능 라이브러리의 전체 세트는 물론 일부 인기 있는 디자인 패턴을 제공하여 개발자가 웹 애플리케이션을 보다 효율적으로 개발할 수 있도록 합니다. 이 기사에서는 CI 프레임워크를 사용하여 PHP 애플리케이션을 개발하는 기본 단계와 방법을 소개합니다. CI 프레임워크의 기본 개념과 구조를 이해합니다. CI 프레임워크를 사용하기 전에 몇 가지 기본 개념과 구조를 이해해야 합니다. 아래에

PHP는 널리 사용되는 서버측 스크립팅 언어이며 CodeIgniter4(CI4)는 웹 애플리케이션을 구축하는 빠르고 우수한 방법을 제공하는 인기 있는 PHP 프레임워크입니다. 이 기사에서는 CI4 프레임워크를 사용하여 뛰어난 웹 애플리케이션을 개발하는 방법을 단계별로 안내해 드립니다. 1. CI4 다운로드 및 설치 먼저 공식 웹사이트(https://codeigniter.com/downloa)에서 다운로드해야 합니다.

인터넷이 발전하고 인터넷이 사람들의 삶에 지속적으로 통합됨에 따라 네트워크 애플리케이션의 개발이 점점 더 중요해지고 있습니다. 잘 알려진 프로그래밍 언어인 PHP는 인터넷 애플리케이션 개발에 선호되는 언어 중 하나가 되었습니다. 개발자는 수많은 PHP 프레임워크를 사용하여 개발 프로세스를 단순화할 수 있으며, 가장 널리 사용되는 프레임워크 중 하나는 CodeIgniter(CI) 프레임워크입니다. CI는 강력한 PHP 웹 애플리케이션 프레임워크로, 가볍고 사용하기 쉬우며 성능이 최적화되어 개발자가 빠르게 구축할 수 있다는 특징을 가지고 있습니다.

CI 프레임워크에 CSS 스타일을 도입하는 단계는 다음과 같습니다. 1. CSS 파일을 준비합니다. 2. CSS 파일을 CI 프레임워크 프로젝트의 적절한 위치에 저장합니다. 3. CSS 스타일을 사용해야 하는 페이지에 CSS를 도입합니다. HTML <link> 태그 파일을 통해 4. HTML 요소에 CSS 클래스 또는 ID 이름을 사용하여 해당 스타일을 적용합니다.

튜토리얼: CI 프레임워크에 CSS 스타일을 도입하기 위한 세부 단계, 특정 코드 예제가 필요합니다. 소개: 스타일은 웹 애플리케이션 개발에 있어 중요한 부분입니다. CSS(Cascading Style Sheets)를 사용하여 웹페이지를 아름답게 만들고 더 나은 사용자 경험을 제공하세요. CodeIgniter(CI) 프레임워크를 사용하여 개발할 때 CSS 스타일을 올바르게 도입하는 방법은 특히 중요합니다. 이 문서에서는 CSS 스타일을 CI 프레임워크에 도입하는 자세한 단계를 소개하고 특정 코드 예제를 제공합니다. 1단계: 먼저 CSS 파일 만들기,

CI 프레임워크에 CSS 스타일을 도입하는 단계에는 특정 코드 예제가 필요합니다. CI(CodeIgniter) 프레임워크는 효율적인 웹 애플리케이션을 구축하는 데 널리 사용되는 인기 있는 PHP 개발 프레임워크입니다. 웹 애플리케이션을 개발할 때 아름다운 사용자 인터페이스는 중요한 고려 사항입니다. CSS 스타일을 사용하면 웹 애플리케이션 인터페이스를 최적화하고 개인화하여 사용자에게 더 나은 경험을 제공할 수 있습니다. CI 프레임워크에서 CSS 스타일을 도입하려면 일반적으로 특정 코드 예제와 함께 다음 단계가 필요합니다. 1 단계:

PHP는 매우 인기 있는 웹 개발 언어이고 CodeIgniter(CI)는 매우 인기 있는 PHP 프레임워크입니다. CodeIgniter는 많은 유용한 기능과 기능을 제공하여 개발자에게 큰 편의성을 제공합니다. 이번 글에서는 CI6 프레임워크를 사용하는 방법을 살펴보겠습니다. CI6 설치 CI6 사용을 시작하려면 먼저 설치 프로세스를 완료해야 합니다. 먼저 CodeIgniter 공식 웹사이트에서 CI6 압축 패키지를 다운로드해야 합니다. 그런 다음 이 파일의 압축을 풀고 다음 위치에 넣으세요.
