検索
ホームページバックエンド開発PHPチュートリアルCI フレームワークのソース コードの読み取り----------Security.php_PHP チュートリアル

[php]  

/** 
* コードイグナイター
*
* PHP 5.1.6 以降用のオープンソース アプリケーション開発フレームワーク
*
* @package CodeIgniter
* @author ExpressionEngine 開発チーム
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
* @license http://codeigniter.com/user_guide/license.html
* @link http://codeigniter.com
* @since バージョン 1.0
* @filesource
 */
// ----------------------------------------------- ------------------------
/**
* セキュリティクラス
* このクラスには、安全なアプリケーションを作成し、入力データを安全に処理するのに役立ついくつかのメソッドが含まれています。
* このカテゴリの CI 公式マニュアルのアドレス: http://codeigniter.org.cn/user_guide/libraries/security.html
* @パッケージCodeIgniter
* @subpackage ライブラリ
* @category セキュリティ
* @author ExpressionEngine 開発チーム
* @link http://codeigniter.com/user_guide/libraries/security.html
*/
クラス CI_Security {
/**
* URLを保護するためのランダムハッシュ
* URLを保護するためのランダムなハッシュ値(クロスサイトスクリプティング攻撃)
* @var 文字列
* @access 保護されています
*/
protected $_xss_hash = '';  
/**
* クロスサイト リクエスト フォージェリ保護 Cookie のランダム ハッシュ
* クロスサイトリクエストによる Cookie の偽造を防ぐためのランダムハッシュ
* @var 文字列
* @access 保護されています
*/
protected $_csrf_hash = '';  
/**
* クロスサイトリクエストフォージェリープロテクションクッキーの有効期限
* デフォルトは 2 時間 (秒)
* クロスサイトリクエスト保護 Cookie の有効期限、デフォルトは 2 時間 (秒単位) です
* @var int
* @access 保護されています
*/
protected $_csrf_expire = 7200;  
/**
* クロスサイトリクエストフォージェリープロテクションクッキーのトークン名
*クロスサイト リクエスト フォージェリ保護のための Cookie トークン名
* @var 文字列
* @access 保護されています
*/
protected $_csrf_token_name = 'ci_csrf_token';  
/**
* クロスサイト リクエスト フォージェリー保護 Cookie の Cookie 名
*クロスサイト リクエスト フォージェリ保護のための Cookie の名前
* @var 文字列
* @access 保護されています
*/
protected $_csrf_cookie_name = 'ci_csrf_token';  
/**
* 決して許可されない文字列のリスト
* 決して許可されない文字列のリスト
* @var 配列
* @access 保護されています
*/
protected $_never_allowed_str = array(
'document.cookie' => '[削除されました]'、
'document.write' => '[削除されました]'、
'.parentNode' => '[削除されました]'、
'.innerHTML' => '[削除されました]'、
'window.location' => '[削除されました]'、
'-moz-binding' => '[削除されました]'、
'」                => 「-->」、
' '
''           => ''  
);  
/* 決して許可されません。正規表現の置換 */
/**
* 決して許可されない正規表現置換のリスト
* 許可されていない通常の置換文字列のリスト
* @var 配列
* @access 保護されています
*/
protected $_never_allowed_regex = array(
'javascripts*:',
'expressions*((|()', // CSS と IE
'vbscripts*:', // IE、びっくり!  
'リダイレクト+302'、
"(["'])?datas*:[^\1]*?base64[^\1]*?,[^\1]*?\1?"
);  
/** 
* コンストラクター
*
* @return void
     */
パブリック関数 __construct()
{
// CSRF 保護は有効ですか?  
// csrf 否か开启
if (config_item('csrf_protection') === TRUE)
{
// CSRF config 读取CSRF 構成并赋值给本クラス下の对应的プロパティ
foreach (array('csrf_expire', 'csrf_token_name', 'csrf_cookie_name') as $key)
{
if (FALSE !== ($val = config_item($key)))
{
$this->{'_'.$key} = $val;  
}
}
// アプリケーション固有の Cookie プレフィックスを追加します
// 追加应用指定のクッキー前缀
if (config_item('cookie_prefix'))
{
$this->_csrf_cookie_name = config_item('cookie_prefix').$this->_csrf_cookie_name;  
}
// CSRF ハッシュを設定します
// 設置CSRFハッシュ
$this->_csrf_set_hash();  
}
log_message('debug', "セキュリティ クラスが初期化されました");  
}
// ----------------------------------------------- ---------------------
/**
* クロスサイトリクエスト偽造防止を確認します
* 验证跨站请求伪造保护
* @return object
*/
パブリック関数 csrf_verify()
{
// POST リクエストではない場合、CSRF Coo​​kie を設定します
// 投稿リクエストではない場合、CSRF Coo​​kie を設定する必要があります
if (strtoupper($_SERVER['REQUEST_METHOD']) !== 'POST')
return $this->csrf_set_cookie();
}
// トークンは _POST 配列と _COOKIE 配列の両方に存在しますか?
// リクエスト トークンが存在しない場合は、csrf_show_error を呼び出してエラーを報告します
if ( ! isset($_POST[$this->_csrf_token_name], $_COOKIE[$this->_csrf_cookie_name]))
$this->csrf_show_error();
}
// トークンは一致しますか?
// トークンが間違っている場合は、エラーが報告されます。
if ($_POST[$this->_csrf_token_name] != $_COOKIE[$this->_csrf_cookie_name])
$this->csrf_show_error();
}
// 終わったので強制終了します
// _POST 配列を汚染します
// _POST 配列を汚したくないので、標識を破棄します
unset($_POST[$this->_csrf_token_name]);
// 永遠に続くものはないはずです
// Cookie 名を破棄し、ハッシュと Cookie をリセットします
unset($_COOKIE[$this->_csrf_cookie_name]);
$this->_csrf_set_hash();
$this->csrf_set_cookie();
Log_message('デバッグ', 'CSRF トークンが検証されました');
$this を返します。
}
// ----------------------------------------------- --- --------------------------
/**
* クロスサイトリクエストフォージェリプロテクションクッキーを設定します
* クロスサイトリクエストを保護するために偽の Cookie を設定します
* @return オブジェクト
*/
パブリック関数 csrf_set_cookie()
{
$expire = time() + $this->_csrf_expire;
$secure_cookie = (config_item('cookie_secure') === TRUE) 1 : 0;
// https が存在する場合に Cookie を設定します
if ($secure_cookie && (emptyempty($_SERVER['HTTPS']) OR strto lower($_SERVER['HTTPS']) === 'off'))
FALSE を返します。
}
を使用して
setcookie($this->_csrf_cookie_name, $this->_csrf_hash, $expire, config_item('cookie_path'), config_item('cookie_domain'), $secure_cookie);
Log_message('debug', "CRSF クッキー セット");
$this を返します。
}
// ----------------------------------------------- --- --------------------------
/**
* CSRFエラーを表示
* CSRFエラーを表示
* @return void
*/
パブリック関数 csrf_show_error()
{
show_error('要求されたアクションは許可されていません。');  
}
// ----------------------------------------------- ---------------------
/** 
* CSRF ハッシュを取得します
*获取CSRFハッシュ
* ゲッター メソッド
*
* @return string self::_csrf_hash
     */
パブリック関数 get_csrf_hash()
{
$this->_csrf_hash; を返す  
}
// ----------------------------------------------- ---------------------
/**
* CSRFトークン名を取得します
* CSRF注文ランキングを取得します
* ゲッターメソッド
*
* @return 文字列 self::csrf_token_name
*/
パブリック関数 get_csrf_token_name()
{
$this->_csrf_token_name; を返します。  
}
// ----------------------------------------------- ---------------------
/**
* XSSクリーン
*
* クロスサイト スクリプティング ハッキングを可能にするためにデータをサニタイズします
*Prevented.Prevent この関数はかなりの量の作業を行いますが、
* 非常に徹底されており、
* 最も不明瞭な XSS の試みには、100% 確実なものはありません。
* もちろんですが、何も合格できませんでした
* フィルター
* クロスサイト スクリプティング攻撃を防ぐためにデータをフィルターします。この関数はある程度の作業を行いますが、非常に徹底的です
* ほとんどのあいまいな XSS 試行も阻止します。もちろん、100% 安全なものはありません
* しかし、このフィルターで考えられることはすべて実行しました。
*
* 注: この関数はデータを処理する場合にのみ使用してください
* 送信する必要はありません
* 一般的なランタイム処理に使用されます。
* 注: この機能は、送信されたデータを処理するためにのみ使用できます。
※この機能は通常運用時には使用しないでください。
*
* この関数は、私がいくつかのコードとアイデアに部分的に基づいています
* Bitflux から取得: http://channel.bitflux.ch/wiki/XSS_Prevention
*
* このスクリプトの開発を支援するために、この素​​晴らしいリストを使用しました
* 脆弱性と私が行った他のいくつかのハッキング
* 他のプログラムの脆弱性を調査して収集:
* http://ha.ckers.org/xss.html
*
* @param 混合文字列または配列
* @param bool
* @戻り文字列
*/
パブリック関数 xss_clean($str, $is_image = FALSE)
{
/*
* 文字列は配列ですか? 
* 必要过滤的字符串是数组吗?
*
*/
if (is_array($str))
{
while (list($key) = each($str))
$str[$key] = $this->xss_clean($str[$key]);
}
$str; を返します。
}
/*
* 見えない文字を削除します
* 見えない文字を削除します
$str = 非表示文字を削除($str);
// URL 内のエンティティを検証する
out sput out use
$str = $this->_validate_entities($str);
/*
* URL デコード
* URL デコード
* このようなものが送信された場合に備えて:
が防止されました
*
* 注: プラス記号が削除されないように rawurldecode() を使用してください
* rawurldecode() はプラス記号 (「+」) をスペースにデコードしませんが、urldecode() はスペースにデコードします。
*
$str = rawurldecode($str);
/*
* 文字エンティティを ASCII に変換します
* 物理文字を ASCII コードに変換します
下* これにより、以下のテストの信頼性が高まります。これらはセキュリティ上の問題を引き起こすエンティティであるため、エンティティ内のラベルのみを変換します。
* これにより、以下のテストが確実に動作するようになります。
*
以来、タグ内のエンティティのみを変換します
* これらはセキュリティ上の問題を引き起こすものです
*
$str = preg_replace_callback("/[a-z]+=(['"]).*?\1/si", array($this, '_convert_attribute'), $str);
$str = preg_replace_callback("/|
/*
* 見えない文字を再度削除します
* 非表示の文字を再度削除します
$str = 非表示文字を削除($str);
/*
* すべてのタブをスペースに変換します
* すべてのタブ文字をスペースに変換します
* これにより、次のような文字列が防止されます: ja vascript
* これは、 java
* 注: 文字間のスペースについては後で扱います。 在* 注: 文字間のスペースは後で処理します
* 注: preg_replace はここで驚くほど遅いことが判明しました
* データのブロックが大きいため、str_replace を使用します。
* * 注: ここでの preg_replace は、データの塊が大きい場合は非常に遅いため、str_replace を使用してください
*
if (strpos($str, "t") !== FALSE)
$str = str_replace("t", ' ', $str);
}
/*
* 後で比較するために、キャプチャ変換された文字列をキャプチャします
* 後で比較するために変換された文字列をキャプチャします
$converted_string = $str;
// 決して許可されない文字列を削除します
️ // 許可されていない文字列を削除します
$str = $this->_do_never_allowed($str);
/*
* PHP タグを安全にします
* PHP タグを安全にする
* 注: XML タグも誤って置き換えられます:
M* 注: XML タグも意図せず置き換えられます
*
*
* でも問題はないようです。
※でも問題ないようです
if ($is_image === TRUE)
// 画像には PHP の短いオープニングと
が含まれる傾向があります。
// 終了タグは時々スキップするので、それらのみをスキップします
// 長い開始タグを実行します。
$str = preg_replace('/(php)/i', "\1", $str);
}
その他
$str = str_replace(array('', '?'.'>'), array('', '?>'), $str);
}
/*
* 展開された単語を圧縮します
* 分解されたすべての単語を圧縮します
* これは次のような単語を修正します: jav a c r i p t
* これらの単語は正しい状態に圧縮されます
$words = array(
'javascript'、'式'、'vbscript'、'スクリプト'、'base64'、
「アプレット」、「アラート」、「ドキュメント」、「書き込み」、「クッキー」、「ウィンドウ」
);
foreach ($words として $word)
$temp = '';
for ($i = 0, $wordlen = strlen($word); $i
$temp .= substr($word, $i, 1)."s*";
}
️ // これを行うのは、単語以外の文字が後に続く場合のみです
.
$str = preg_replace_callback('#('.substr($temp, 0, -3).')(W)#is', array($this, '_compact_exploded_words'), $str);
}
/*
链* リンクと画像ラベルで許可されていない JavaScript コードを削除してください
* 以前は PHP5 のバージョン比較と Stripos の使用を行っていました。
* 通常、バージョン比較を行うために PHP5 の Stripos を使用します。
* ただし、これらの単純化された非キャプチャと比較すると非常に遅いです
* ただし、特にパターンが文字列内に存在する場合、キャプチャしない preg_match() よりもはるかに遅くなります
* preg_match()、特にパターンが文字列に存在する場合
やります
$original = $str;
if (preg_match("/
$str = preg_replace_callback("#]*?)(>|$)#si", array($this, '_js_link_removal'), $str);
}
if (preg_match("/CI フレームワークのソース コードの読み取り----------Security.php_PHP チュートリアル
$str = preg_replace_callback("#CI フレームワークのソース コードの読み取り----------Security.php_PHP チュートリアル]*?)(s?/?>|$)#si", array($this, '_js_img_removal'), $str);
}
if (preg_match("/script/i", $str) OR preg_match("/xss/i", $str))
$str = preg_replace("##si", '[削除]', $str);
}
}
while($original != $str);
設定解除($original)
// style、onclick、xmlns などの有害な属性を削除します
// style、onclick、xmlns などの有害な属性を削除します
$str = $this->_remove_evil_attributes($str, $is_image);
* 不正な HTML 要素をサニタイズします
* 不適切な HTML 要素をクリーンアップします
* リスト内の単語のいずれかを含むタグの場合
* 以下が見つかると、タグがエンティティに変換されます。
* タグに以下のリストの単語が含まれている場合、このタグは文字エンティティに変換されます
* になります:
$naughty = 'alert|applet|audio|basefont|base|behavior|bgsound|blink|body|embed|expression|form|frameset|frame|head|html|ilayer|iframe|input|isindex|layer|link|meta |オブジェクト|プレーンテキスト|スタイル|スクリプト|テキストエリア|タイトル|ビデオ|xml|xss';
$str = preg_replace_callback('#
* いたずらなスクリプト要素をサニタイズする
* 不正なスクリプト要素をクリーンアップします
* 上記と同様ですが、
を探す代わりにのみ
* PHP および JavaScript コマンドを検索するタグ
*
を削除するのではなく。
* コード、単に括弧をエンティティに変換するだけです
* コードを実行不能にします
* 上記と同様、PHP や Javascript コマンドと同様に、クエリされた許可されていないタグのみを置き換えます
* コードを削除するのではなく、コードを実行不可能なエンティティに変換する方が良いです
* 例: eval('some code')
* 次のようになります: eval('some code')
$str = preg_replace('#(alert|cmd|passthru|eval|exec|expression|system|fopen|fsockopen|file|file_get_contents|readfile|unlink)(s*)((.*?))#si', "\1\2(\3)"、$str);
// 最終クリーンアップ
// 最終クリーンアップ
// これにより、万が一の場合に備えた追加の予防策が追加されます
// 何かが上記のフィルターを通過しました
// 上記の処理で不正な文字が生成されないようにするための追加の予防措置
$str = $this->_do_never_allowed($str);
/*
* 画像は特別な方法で処理されます
* - 本質的に、私たちが知りたいのは、キャラクターのその後のことです
* 変換は、不要な XSS コードが見つかったかどうかに関係なく実行されます。
* そうでない場合は、画像がきれいであるため、TRUE を返します。
※ただし、変換後の文字列が
と一致しない場合
* XSS の削除後の文字列、不要な XSS があったため失敗します
* コードが検出され、処理中に削除/変更されました。
if ($is_image === TRUE)
戻ります ($str == $converted_string)
}
Log_message('debug', "XSS フィルタリングが完了しました"); 戻る
}
// ----------------------------------------------- --- --------------------------
/**
* URLを保護するためのランダムハッシュ
* 次に、_xss_hssh を生成します
* @戻り文字列
*/
パブリック関数 xss_hash()
{
if ($this->_xss_hash == '')
mt_srand(); ️ $this->_xss_hash = (time() + mt_rand(0, 1999999999));
}
wardワードを使用します
}
// ----------------------------------------------- --- --------------------------
/**
* HTML エンティティのデコード
* HTML エンティティのデコード
* この関数は html_entity_decode() の代替です
* この関数は html_entity_decode() 関数を置き換えるために使用されます
* html_entity_decode() を単独で使用しない理由は、次のとおりです。
* ただし、セミコロンを省略するのは技術的には正しくありません
* エンティティの最後でも、ほとんどのブラウザはエンティティを解釈します
* 正しくは、html_entity_decode() は
なしではエンティティを変換しません。
* セミコロンなので、ここには独自の小さな解決策が残っています。
* エンコードされた文字の後に ; が記述されていない場合、ほとんどのブラウザはコードを正しく解釈できますが、html_entity_decode はそれを解釈しません
* html_entity_decode() はセミコロンのないエンティティを変換しないため、独自のソリューションを使用してください
* @パラメータ文字列
* @パラメータ文字列
* @戻り文字列
*/
パブリック関数entity_decode($str, $charset='UTF-8')
{
if (stristr($str, '&') === FALSE)
$str; を返します。
}
$str = html_entity_decode($str, ENT_COMPAT, $charset);
$str = preg_replace('~(0*[0-9a-f]{2,5})~ei', 'chr(hexdec("\1"))', $str);
return preg_replace('~([0-9]{2,4})~e', 'chr(\1)', $str);
}
// ----------------------------------------------- --- --------------------------
/**
* ファイル名のセキュリティ
* ファイル名のセキュリティ
* @パラメータ文字列
* @param bool
* @戻り文字列
*/
パブリック関数 sanitize_filename($str, $relative_path = FALSE)
{
$bad = array(
「../」、
」、
">"、
「」、
'"'、
'&'、
'$'、
'#'、
'{'、
'}'、
'['、
'='、
';'、
'?'、
"%20"、
"%22"、
"%3c", // "%253c", //
"%3e", // >
"%0e", // >
"%28", // (
"%29", // )
"%2528", // (
"%26", // &
"%24", // $
"%3f", //
?
"%3b", // ;
"%3d" // =
);
if ( ! $relative_path)
$bad[] = './';
$bad[] = '/';
}
$str = Remove_invisible_characters($str, FALSE);
returntripslashes(str_replace($bad, '', $str));
}
// ----------------------------------------------- --- ------------------
/**
* コンパクトな爆発した言葉
* 検索された単語を圧縮します
*
から空白を削除するxss_clean()のコールバック関数
* Javaスクリプトのようなもの
* xss_clean() のコールバック関数、java s c r i p t からスペースを削除します
*
*
* @param タイプ
* @戻り値の型
*/
保護された関数 _compact_exploded_words($matches)
{
return preg_replace('/s+/s', '', $matches[1]).$matches[2];
}
// ----------------------------------------------- --- --------------------------
/*
* 有害な HTML 属性 (evenhandlers や style など) を削除します
* 有害な HTML 属性 (イベント処理やスタイルなど) を削除します
* 邪悪な属性と次のいずれかを削除します:
* - スペースまでのすべて
* * たとえば、パイプ間のすべて:
*
* - 引用符内のすべて
* * たとえば、パイプ間のすべて:
*
*
* @param string $str チェックする文字列
* @param boolean $is_image これが画像の場合は TRUE
* @return string 邪悪な属性が削除された文字列
*/
保護された関数 _remove_evil_attributes($str, $is_image)
{
// すべての JavaScript イベント ハンドラー (例: onload、onclick、onmouseover)、スタイル、および xmlns
// すべての havascript イベント ハンドラー
$evil_attributes = array('onw*', 'style', 'xmlns', 'formaction');
if ($is_image === TRUE)
/*
* Adob​​e Photoshop は XML メタデータを JFIF 画像に挿入します。
* 名前空間を含むため、画像に対してこれを許可する必要があります。
* Adob​​e Photoshop は XML メタデータを JFIF 画像に挿入します
* 名前空間が含まれているため、画像に対してこれらを許可する必要があります
*/
unset($evil_attributes[array_search('xmlns', $evil_attributes)]);
}
$count = 0;
$attribs = array();
️ // 引用符のない不正な属性文字列の出現を検索します
’s together to
’s ’ s 1 t ‐ together together 1 to 1 ’s ’ s 1 t ‐ // 引用符なしで不正な属性を検索します
preg_match_all('/('.implode('|', $evil_attributes).')s*=s*([^s>]*)/is', $str, $matches, PREG_SET_ORDER);
foreach ($attr として $matches)
$attribs[] = preg_quote($attr[0], '/');
}
️ // 引用符付きの不正な属性文字列の出現を検索します (042 と 047 は 8 進引用符です)
号 // 引用符のない不正な属性を見つけます (042、4、0 は八角形の引用符です)
preg_match_all("/(".implode('|', $evil_attributes).")s*=s*(
foreach ($attr として $matches)
$attribs[] = preg_quote($attr[0], '/');
}
// HTML タグ内の不正な属性文字列を置換します
T // HTML タグ内の不正な属性を置換します
if (count($attribs) >​​ 0)
$str = preg_replace("/-])(.*?)(".implode('|' , $attribs).")(.*?)([s> }
} } しながら ($count);
戻る
}
// ----------------------------------------------- --- --------------------------
/** 
* 不正な HTML をサニタイズする
*有害なhtmlを消去します
* 不正な HTML 要素を削除する xss_clean() のコールバック関数
*
* @param 配列
* @return string
     */
保護された関数 _sanitize_naughty_html($matches)
{
// 左中括弧をエンコードします
$str = '
// 再帰ベクトルを防ぐために、キャプチャされた左中括弧または右中括弧をエンコードします
$str .= str_replace(array('>', '', '
戻る
}
// ----------------------------------------------- --- --------------------------
/**
* JS リンクの削除
* js リンクのクリーニング
* リンクをサニタイズするための xss_clean() のコールバック関数
* これにより PCRE バックトラックが制限され、パフォーマンスがより向上します
*
で PREG_BACKTRACK_LIMIT_ERROR がトリガーされるのを防ぎます
* リンクの多い文字列の PHP 5.2 以降
* xss_clean を呼び出して接続をクリーンアップします
* @param配列
* @return string
*/
保護された関数 _js_link_removal($match)
{
return str_replace(
$match[1],
preg_replace(
'#href=.*?(alert(|alert(|javascript:|livescript:|mocha:|charset=|window.|document.|.cookie|<script> <div> </script>
$this->_filter_attributes(str_replace(array(''), '', $match[1]))
)、
$match[0]
);  
}
// ----------------------------------------------- ---------------------
/** 
* JS 画像の削除
* js图片清理
* 画像タグをサニタイズするための xss_clean() のコールバック関数
* これにより、PCRE バックトラックが制限され、パフォーマンスが向上します
* で PREG_BACKTRACK_LIMIT_ERROR がトリガーされるのを防ぎます
* イメージタグの重い文字列では PHP 5.2 以降
*
* @param 配列
* @return string
     */
保護された関数 _js_img_removal($match)
{
return str_replace(
$match[1],
preg_replace(
'#src=.*?(alert(|alert(|javascript:|livescript:|mocha:|charset=|window.|document.|.cookie|<script> <div> </script>
$this->_filter_attributes(str_replace(array(''), '', $match[1]))
)、
$match[0]
);  
}
// ----------------------------------------------- ---------------------
/** 
* 属性変換
* プロパティ转换
* XSS Clean のコールバックとして使用されます
*
* @param 配列
* @return string
     */
保護された関数 _convert_attribute($match)
{
return str_replace(array('>', '', '
}
// ----------------------------------------------- ---------------------
/**
* フィルター属性
* フィルターのプロパティ
* 一貫性と安全性を確保するためにタグ属性をフィルターします
* 一貫性とセキュリティのためにタグ属性をフィルタリングします
* @パラメータ文字列
* @戻り文字列
*/
保護された関数 _filter_attributes($str)
{
$out = '';  
if (preg_match_all('#s*[a-z-]+s*=s*( 42| 47)([^\1]*?)\1#is', $str, $matches))
{
foreach ($matches[0] as $match)
{
$out .= preg_replace("#/*.*?*/#s", '', $match);  
}
}
$out を返します。  
}
// ----------------------------------------------- ---------------------
/** 
* HTML エンティティ デコード コールバック
* html实体解解
* XSS Clean のコールバックとして使用されます
*
* @param 配列
* @return string
     */
保護された関数 _decode_entity($match)
{
return $this->entity_decode($match[0], strtoupper(config_item('charset')));  
}
// ----------------------------------------------- ---------------------
/**
* URL エンティティを検証する
* URL 文字エンティティを検証します
* xss_clean() によって呼び出されます
*
* @パラメータ文字列
* @戻り文字列
*/
保護された関数 _validate_entities($str)
{
/*
* URL 内の GET 変数を保護する
* 保护url中のGET变量
*/
// 901119URL5918AMP18930PROTECT8198
$str = preg_replace('|&([a-z_0-9-]+)=([a-z_0-9-]+)|i', $this->xss_hash()."\1=\ 2", $str);  
/*
* 標準の文字エンティティを検証する
* 验证标標準字符实体
*
* 不足している場合はセミコロンを追加します。  
を有効にするためにこれを行います。
* 後でエンティティを ASCII に変換します。 
* 説明がない場合は、分数が追加されます。これは、後で文字体を ASCII に変換するために行われます。
*
*/
$str = preg_replace('#(?[0-9a-z]{2,})([x00-x20])*;?#i', "\1;\2", $str);  
/*
* UTF16 の 2 バイト エンコーディング (x00) を検証します
*验证UTF16两个字节的编码(x00)
* 上記と同様に、不足している場合はセミコロンを追加します。 
* 画像上にない場合は分数を追加します。
*/
$str = preg_replace('#(?)([0-9A-F]+);?#i',"\1\2;",$str);  
/*
* URL 内の GET 変数の保護を解除する
* URL中不保护的GET变量
*/
$str = str_replace($this->xss_hash(), '&', $str);  
$str; を返す  
}
// ----------------------------------------------- -----------------------
/**
* 絶対に許可しないでください
* 移除不允许的文字符
* xss_clean() のユーティリティ関数
*
* @param string
* @return string
*/
保護された関数 _do_never_allowed($str)
{
$str = str_replace(array_keys($this->_never_allowed_str), $this->_never_allowed_str, $str);  
foreach ($this->_never_allowed_regex as $regex)
{
$str = preg_replace('#'.$regex.'#is', '[removed]', $str);  
}
$str; を返す  
}
// ----------------------------------------------- ---------------------
/**
* クロスサイトリクエストフォージェリプロテクションクッキーを設定します
* クロスサイトリクエスト保護 Cookie を設定します
* @戻り文字列
*/
保護された関数 _csrf_set_hash()
{
の場合
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
誇大広告を超えて:今日のPHPの役割の評価誇大広告を超えて:今日のPHPの役割の評価Apr 12, 2025 am 12:17 AM

PHPは、特にWeb開発の分野で、最新のプログラミングで強力で広く使用されているツールのままです。 1)PHPは使いやすく、データベースとシームレスに統合されており、多くの開発者にとって最初の選択肢です。 2)動的コンテンツ生成とオブジェクト指向プログラミングをサポートし、Webサイトを迅速に作成および保守するのに適しています。 3)PHPのパフォーマンスは、データベースクエリをキャッシュおよび最適化することで改善でき、その広範なコミュニティと豊富なエコシステムにより、今日のテクノロジースタックでは依然として重要になります。

PHPの弱い参照は何ですか、そしていつ有用ですか?PHPの弱い参照は何ですか、そしていつ有用ですか?Apr 12, 2025 am 12:13 AM

PHPでは、弱い参照クラスを通じて弱い参照が実装され、ガベージコレクターがオブジェクトの回収を妨げません。弱い参照は、キャッシュシステムやイベントリスナーなどのシナリオに適しています。オブジェクトの生存を保証することはできず、ごみ収集が遅れる可能性があることに注意する必要があります。

PHPで__invoke Magicメソッドを説明してください。PHPで__invoke Magicメソッドを説明してください。Apr 12, 2025 am 12:07 AM

\ _ \ _ Invokeメソッドを使用すると、オブジェクトを関数のように呼び出すことができます。 1。オブジェクトを呼び出すことができるように\ _ \ _呼び出しメソッドを定義します。 2。$ obj(...)構文を使用すると、PHPは\ _ \ _ Invokeメソッドを実行します。 3。ロギングや計算機、コードの柔軟性の向上、読みやすさなどのシナリオに適しています。

同時性については、PHP 8.1の繊維を説明します。同時性については、PHP 8.1の繊維を説明します。Apr 12, 2025 am 12:05 AM

繊維はPhp8.1で導入され、同時処理機能が改善されました。 1)繊維は、コルーチンと同様の軽量の並行性モデルです。 2)開発者がタスクの実行フローを手動で制御できるようにし、I/O集約型タスクの処理に適しています。 3)繊維を使用すると、より効率的で応答性の高いコードを書き込むことができます。

PHPコミュニティ:リソース、サポート、開発PHPコミュニティ:リソース、サポート、開発Apr 12, 2025 am 12:04 AM

PHPコミュニティは、開発者の成長を支援するための豊富なリソースとサポートを提供します。 1)リソースには、公式のドキュメント、チュートリアル、ブログ、LaravelやSymfonyなどのオープンソースプロジェクトが含まれます。 2)StackOverFlow、Reddit、およびSlackチャネルを通じてサポートを取得できます。 3)開発動向は、RFCに従うことで学ぶことができます。 4)コミュニティへの統合は、積極的な参加、コード共有への貢献、および学習共有への貢献を通じて達成できます。

PHP対Python:違いを理解しますPHP対Python:違いを理解しますApr 11, 2025 am 12:15 AM

PHP and Python each have their own advantages, and the choice should be based on project requirements. 1.PHPは、シンプルな構文と高い実行効率を備えたWeb開発に適しています。 2。Pythonは、簡潔な構文とリッチライブラリを備えたデータサイエンスと機械学習に適しています。

PHP:それは死にかけていますか、それとも単に適応していますか?PHP:それは死にかけていますか、それとも単に適応していますか?Apr 11, 2025 am 12:13 AM

PHPは死にかけていませんが、常に適応して進化しています。 1)PHPは、1994年以来、新しいテクノロジーの傾向に適応するために複数のバージョンの反復を受けています。 2)現在、電子商取引、コンテンツ管理システム、その他の分野で広く使用されています。 3)PHP8は、パフォーマンスと近代化を改善するために、JITコンパイラおよびその他の機能を導入します。 4)Opcacheを使用してPSR-12標準に従って、パフォーマンスとコードの品質を最適化します。

PHPの未来:適応と革新PHPの未来:適応と革新Apr 11, 2025 am 12:01 AM

PHPの将来は、新しいテクノロジーの傾向に適応し、革新的な機能を導入することで達成されます。1)クラウドコンピューティング、コンテナ化、マイクロサービスアーキテクチャに適応し、DockerとKubernetesをサポートします。 2)パフォーマンスとデータ処理の効率を改善するために、JITコンパイラと列挙タイプを導入します。 3)パフォーマンスを継続的に最適化し、ベストプラクティスを促進します。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。