ホームページ >バックエンド開発 >PHPチュートリアル >php セキュリティ フィルタリング_PHP チュートリアル
/*ansicコード-URLコードテーブル: http://www.w3school.com.cn/tags/html_ref_urlencode.html
-------------- ------------ -------------------------------------- ------------ -------------------------------------- ------------
1. ユーザー入力の検証とフィルタリング
最も一般的な英数字入力であっても、セキュリティ上の問題を引き起こしやすい文字をいくつか紹介します:
!$ ^ & * ( ) ~ [ ] { } ' " ; < > ? - `
データベース内で特別な意味を持つ文字:
'" ; いくつかの非印刷文字もあります:
文字 x00 または ASCII 0、NULL または FALSE
文字 x10 と x13、または ASCII 10 と 13、n r
文字 x1a または ASCII 26 は、ファイルの終わりを示します
間違ったパラメータ タイプを入力すると、予期せぬ問題が発生する可能性もありますプログラム内のエラー。
パラメータ値を入力しすぎると、オーバーフローやその他のエラーが発生する可能性があります。
2. ファイルのパスと名前のフィルタリング
ファイル名にバイナリ データを含めることはできません。そうしないと問題が発生する可能性があります。
一部のシステムでは Unicode マルチバイトでエンコードされたファイル名を使用できますが、それを避け、代わりに ASCII 文字を使用するようにしてください。
Unix システムではファイル名設定でほぼすべての記号を使用できますが、- と _ を使用し、他の文字の使用は避けてください。
同時に、ファイル名の長さを制限する必要があります。
3. SQL インジェクションを防ぐ
ユーザー入力が数値の場合は、次の方法を使用できます:
is_int() 関数 (または is_integer() または is_long() 関数)
gettype() 関数を使用する
intval() 関数を使用する
settype() 関数を使用する
strlen() 関数を使用してユーザー入力文字列の長さを確認する
日付または時刻が有効かどうかを確認するには、strtotime() 関数を使用できます
4. XSS 攻撃を防止する
xss 攻撃の一般的な方法は、PHP に組み込まれている js スクリプトを実行するために HTML 要素を挿入することです。いくつかの防御機能 (htmlentities や htmlspecialchars など)
5. ユーザーが送信した URL をフィルターする
ユーザーが URL を入力して画像やリンクを呼び出すことが許可されている場合は、http 以外の URL を渡さないようにする必要があります。 javascript:、vbscript:、data: などのプロトコル。
PHPの組み込み関数parse_url()関数を利用してURLを分割して判定することができます。
6. リモート実行の防止 -- 次の表に、シェルに関連するいくつかの文字を示します:
リモート実行では通常、eval() 関数などの PHP コード実行を使用するか、exec()、passthru ()、proc_open などのコマンド実行を呼び出します。 ()、shell_exec()、system()、または Popen()。
PHP コードの挿入: PHP は、開発者に PHP スクリプトを呼び出すためのさまざまな方法を提供します。ユーザーが制御可能なデータのフィルタリングに注意を払う必要があります。
7. シェルコマンドの実行
PHP には、exec() 関数や ` (バックティック) など、システムコマンドを直接実行できるいくつかの関数が用意されています。
PHP のセーフ モードはある程度の保護を提供しますが、セーフ モードをバイパスする方法もいくつかあります:
1. サーバーがサポートする環境に Perl スクリプト、または Python や Ruby などをアップロードして、スクリプトを実行します。他の言語では PHP セーフ モードをバイパスします。
2. システムのバッファ オーバーフローの脆弱性を利用して、セーフ モードをバイパスします。
シェルに関連するいくつかの文字:
名前文字 ASCII 16 進 URL エンコード HTML エンコード
改行 10 22 " または "
ドル記号 $ 36 x24 %24 $
コネクタ & 38 x26 %26 & #38 または amp
一重引用符 ' 39 x27 %27 '
左括弧 ( 40 x28 %28 (
右括弧) 41 x29 %29 )
アスタリスク* 42 x2a %2a *
ハイフン - 45 x2d %2d -
セミコロン; 59 x3b %3b ;
左山括弧< 60 x3c %3c <
直角括弧 62
疑問符? 63 x3f %3f ?
左括弧 [91 x5b %5b [
バックスラッシュ 92 x5c %5c \
右角括弧] 93 x5d %5d ]
キャレット ^ 94 x5e %5e ^
バッククォート ` 96 x60 %60 `
左中括弧 { 123 x7b %7b {
パイプ 124 x7c %7c |
右中括弧} 125 x7d %7d }
チルダ ~ 126 x7e %7e ~
---------------------------- ---------- -------------------------------------- ---------- -----------------------
セキュリティフィルター機能コード*/
/**
* 安全なフィルタリング入力 [jb]
*/
function check_str($string , $isurl = false)
{
$string= preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F]/','', $string); //制御文字を削除
$string= str_replace(array("
empty($isurl)&& $string =preg_replace("/&(?!(#[0-9]+|[a-z]+);)/si",'&',$string);//HTML 内xx; を使用して、(スペース)、? Unicode 文字などの一部の文字をエンコードできます。A(?!B) は、A の後に B が続かないことを意味するため、作成者は同様の HTML エンコード文字を保持したいと考えています。問題の文字
を削除します $string= str_replace(array("%3C",'<'),'<',$string); //ascii の '<' は '<' に変換されます。
$ string= str_replace(array("%3E",'>'),'>',$string);
$string= str_replace(array('"',"'","t", ' ') ,array('"',''','',' '),$string);
returntrim($string);
}
/**
* セキュリティフィルタリングクラス - JavaScript、CSS、iframe、オブジェクトなどの安全でないパラメータをフィルタリングします。 高いフィルタリングレベル
* @param string $value フィルタリングする必要がある値
* @return string
*/
function fliter_script( $value) {
$value=preg_replace("/(javascript:)?on(click|load|key|mouse|error|abort|move|unload|change|dblclick|move|reset|resize|submit )/i ","&111n\2",$value);
$value= preg_replace("/(.*?)/si","",$value);
$value= preg_replace(" /(.*?)/si","",$value);
$value= preg_replace ("//iesU", '', $value);
return$value ;
}
/**
* セキュリティフィルタリングクラス - HTMLタグのフィルタリング
* @param string $value フィルタリングする値
* @return string
*/
function filter_html($value) {
if(function_exists('htmlspecialchars')) return htmlspecialchars($value);
returnstr_replace(array(" &", '"', "'", "<",">"), array("&", """, "'","<", ">"), $value) ;
}
/**
* セキュリティ フィルタリング クラス - SQL インジェクションを防ぐために受信データに下線を付けます
* @param string $value フィルタリングする値
* @return string
*/
function filter_sql($value) {
$sql= array("select", 'insert', "update", "delete","' ", " /*","../", "./","union", "into", "load_file","outfile");
$sql_re=array("","","" 、"" 、""、""、""、""、""、""、""、"");
returnstr_replace($sql, $sql_re, $value);
}
/**
* セキュリティ フィルタリング クラス - 一般的なデータ フィルタリング
* @param string $value フィルタリングする必要がある変数
* @return string|array
*/
function filter_escape($value) {
if(is_array($value)) {
foreach($value as $k => $v) {
$value[$ k]= self::fliter_str($v);
}
}else {
$value= self::fliter_str($value);
}
return$value;
}
/**
* セキュリティフィルタリングクラス - 特殊な有害な文字をフィルタリングするための文字列フィルタリング
* @param string $value フィルタリングされる値
* @return string
*/
function filter_str($value) {
$badstr= array("