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:

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen





Mit der Entwicklung der Netzwerktechnologie ist PHP zu einem wichtigen Werkzeug für die Webentwicklung geworden. Eines der beliebtesten PHP-Frameworks – CodeIgniter (im Folgenden als CI bezeichnet) hat ebenfalls immer mehr Aufmerksamkeit und Verwendung gefunden. Heute werfen wir einen Blick auf die Verwendung des CI-Frameworks. 1. Installieren Sie das CI-Framework. Zuerst müssen wir das CI-Framework herunterladen und installieren. Laden Sie die neueste Version des komprimierten CI-Framework-Pakets von der offiziellen Website von CI herunter (https://codeigniter.com/). Nachdem der Download abgeschlossen ist, entpacken Sie ihn

PHP ist eine beliebte Programmiersprache, die in der Webentwicklung weit verbreitet ist. Das CI-Framework (CodeIgniter) ist eines der beliebtesten Frameworks in PHP. Es bietet einen vollständigen Satz vorgefertigter Tools und Funktionsbibliotheken sowie einige beliebte Designmuster, mit denen Entwickler Webanwendungen effizienter entwickeln können. In diesem Artikel werden die grundlegenden Schritte und Methoden zur Entwicklung von PHP-Anwendungen mithilfe des CI-Frameworks vorgestellt. Verstehen Sie die grundlegenden Konzepte und Strukturen des CI-Frameworks. Bevor wir das CI-Framework verwenden, müssen wir einige grundlegende Konzepte und Strukturen verstehen. Runter

PHP ist eine weit verbreitete serverseitige Skriptsprache und CodeIgniter4 (CI4) ist ein beliebtes PHP-Framework, das eine schnelle und hervorragende Möglichkeit zum Erstellen von Webanwendungen bietet. In diesem Artikel machen wir Sie mit dem CI4-Framework vertraut, um herausragende Webanwendungen zu entwickeln, indem wir Sie durch die Verwendung führen. 1. Laden Sie CI4 herunter und installieren Sie es. Zuerst müssen Sie es von der offiziellen Website herunterladen (https://codeigniter.com/downloa).

Mit der Entwicklung des Internets und seiner kontinuierlichen Integration in das Leben der Menschen hat die Entwicklung von Netzwerkanwendungen immer mehr an Bedeutung gewonnen. Als bekannte Programmiersprache hat sich PHP zu einer der bevorzugten Sprachen für die Entwicklung von Internetanwendungen entwickelt. Entwickler können zahlreiche PHP-Frameworks verwenden, um den Entwicklungsprozess zu vereinfachen. Eines der beliebtesten ist das CodeIgniter (CI)-Framework. CI ist ein leistungsstarkes PHP-Webanwendungs-Framework, das sich durch geringes Gewicht, Benutzerfreundlichkeit und optimierte Leistung auszeichnet und es Entwicklern ermöglicht, schnell zu erstellen

Die Schritte zum Einführen von CSS-Stilen in das CI-Framework sind wie folgt: 1. CSS-Dateien vorbereiten; 2. CSS-Dateien am entsprechenden Speicherort des CI-Framework-Projekts speichern; 3. CSS auf den Seiten einführen, die CSS-Stile verwenden müssen über die HTML-<link>-Tag-Datei 4. Verwenden Sie den CSS-Klassen- oder ID-Namen im HTML-Element, um den entsprechenden Stil anzuwenden.

Tutorial: Detaillierte Schritte zur Einführung von CSS-Stilen im CI-Framework, spezifische Codebeispiele sind erforderlich. Einführung: Stil ist ein entscheidender Bestandteil bei der Entwicklung von Webanwendungen. Verwenden Sie CSS (Cascading Style Sheets), um Webseiten zu verschönern und ein besseres Benutzererlebnis zu bieten. Bei der Entwicklung mit dem CodeIgniter (CI)-Framework ist die korrekte Einführung von CSS-Stilen besonders wichtig. In diesem Artikel werden die detaillierten Schritte zur Einführung von CSS-Stilen im CI-Framework vorgestellt und Ihnen spezifische Codebeispiele bereitgestellt. Schritt 1: Erstellen Sie zuerst eine CSS-Datei.

Die Schritte zur Einführung von CSS-Stilen im CI-Framework erfordern spezifische Codebeispiele. Das CI-Framework (CodeIgniter) ist ein beliebtes PHP-Entwicklungsframework, das häufig zum Erstellen effizienter Webanwendungen verwendet wird. Bei der Entwicklung von Webanwendungen ist eine schöne Benutzeroberfläche ein wichtiger Gesichtspunkt. Die Verwendung von CSS-Stilen kann die Benutzeroberfläche der Webanwendung optimieren und personalisieren und den Benutzern ein besseres Erlebnis bieten. In einem CI-Framework erfordert die Einführung von CSS-Stilen normalerweise die folgenden Schritte, begleitet von spezifischen Codebeispielen. Schritt 1:

PHP ist eine sehr beliebte Webentwicklungssprache und CodeIgniter (CI) ist ein sehr beliebtes PHP-Framework. CodeIgniter bietet viele nützliche Funktionen und Features und bietet Entwicklern großen Komfort. In diesem Artikel erfahren Sie, wie Sie das CI6-Framework verwenden. CI6 installieren Bevor Sie CI6 verwenden können, müssen Sie zunächst den Installationsvorgang abschließen. Sie müssen zunächst das komprimierte CI6-Paket von der offiziellen CodeIgniter-Website herunterladen. Dann entpacken Sie diese Datei und legen Sie sie ab
