phpでの文字フィルタ

5278 ワード

セキュリティのために、ユーザーが入力した文字列をエスケープする必要がある場合があります.
 
 
 
文章の中に正しくないところや言葉がはっきりしないところがありますが、ご指摘お願いします~~~
PHP文字列エスケープに関する構成と関数は次のとおりです.
1.magic_quotes_runtime 
2.magic_quotes_gpc 
3.addslashes()とstripslashes()
4.mysql_escape_string() 
5.addcslashes()とstripcslashes()
6.htmlentities()とhtml_entity_decode() 
7.htmlspecialchars()とhtmlspecialchars_decode() 
magic_quotes_runtimeが開くと、phpのほとんどの関数は、外部から導入された(データベースやファイルを含む)データのオーバーフロー文字に自動的に反斜線を付けます. 
set_を使用できますmagic_quotes_runtime()とget_magic_quotes_runtime()は、そのステータスを設定および検出します. 
注意:PHP 5.3.0以上のバージョンでは、この2つの関数は廃棄されています.つまり、PHP 5です.3.0以降では、このオプションはオフになっています. 
‍ 
magic_quotes_gpcはGPC(GET,POST,COOKIE)から送られてきたデータの一部の文字を自動的にエスケープするか否かを設定し、
get_を使用できますmagic_quotes_gpc()はその設定を検出する. 
この設定を開いていない場合は、addslashes()関数を使用して文字列に追加してエスケープできます.
addslashes()は、指定した事前定義文字の前にスラッシュを追加します. 
事前定義された文字には、一重引用符(')、二重引用符(")、反斜線()、NUL(NULL文字)が含まれます.
以上、W 3 SCHOOL.COM.CNの説明は私の直感が正確ではない.
magic_にいるからquotes_Sybase=onでは、単一引用符(')を二重引用符(')に変換します.magic_quotes_sybase=offでは、単一引用符(')を(')に変換します.
stripslashes()関数の機能はaddslashes()とは正反対で、その機能はエスケープを除去する効果です. 
mysql_escape_string()は、SQL文で使用される文字列の特殊文字をエスケープします.‍ 
ここでの特別な例としては、(x 00)、()、(r)、(')、(")、(x1 a)
addcslashes()は、C言語スタイルで反斜線エスケープ文字列の文字を使用します.この関数はあまり使われませんが、文字0、a、b、f、n、r、t、vをエスケープすると、それらは0、a、b、f、r、t、およびvに変換されます.PHPでは、0(NULL),r(リターンバー),(改行)およびt(タブ)のみが事前定義されたエスケープシーケンスであり、C言語では上記の変換後のすべての文字が事前定義されたエスケープシーケンスである.同理stripcslashes()の機能は,そのエスケープを除去することである. 
htmlentities()は文字をHTMLエンティティに変換します.(HTMLエンティティって何?自分GOOGLEかな~~)
具体的なパラメータはここを参照してください.その逆の関数html_entity_decode()-HTMLエンティティを文字に変換します. 
htmlspecialchars()関数は、いくつかの事前定義された文字をHTMLエンティティに変換します. 
定義済みの文字は次のとおりです.
&(和号)になる&
「(二重引用符)になる」
'(一重引用符)は'になります.
<(より小さい)は<
>(より大きい)になる>
詳細パラメータは、htmlspecialchars_の逆関数です.decode()は、定義済みのHTMLエンティティを文字に変換します. 
少し自分の体験:
>>複数の単一引用符エスケープは、データベースのセキュリティ上の問題を引き起こす可能性があります.
>>mysqlは推奨されません.escape_stringはエスケープを行い,ユーザ入力を取得する際にエスケープを行うことを提案する.
>>set_のためmagic_quotes_runtime()PHP 5.3.0以降のバージョンは廃棄されているので、以前のバージョンでは、統合構成をオフにすることを推奨しています.
 
    
if(phpversion() < '5.3.0') { 
set_magic_quotes_runtime(0); 

>>関数でmagic_を定義できませんquotes_gpc、そのためサーバーの上で統一的に開くことを提案して、プログラムを書く時判断の下で、GPCを開けていないで安全な問題を引き起こすことを避けるべきです
GPCをaddslashesでエスケープする場合、ユーザが配列データをコミットする際のキー値と値のフィルタリングに注意する
 
    
if(!get_magic_quotes_gpc()) { 
$_GET = daddslashes($_GET); 
$_POST = daddslashes($_POST); 
$_COOKIE = daddslashes($_COOKIE); 
$_FILES = daddslashes($_FILES); 

function daddslashes($string, $force = 1) { 
if(is_array($string)) { 
foreach($string as $key => $val) { 
unset($string[$key]); 
$string[addslashes($key)] = daddslashes($val, $force); 

} else { 
$string = addslashes($string); 

return $string; 

>>ユーザーの入力または出力時にHTMLエンティティをエスケープしてXSS脆弱性の発生を防止します.
今日、ファイルの特殊文字を処理することに遭遇しました.phpでは、この問題に再び気づきました.
*単一引用符で区切られたphp文字列で、2つのエスケープ'と\をサポート
*二重引用符で区切られたphp文字列は、次の変換をサポートします.
改行(LFまたはASCII文字0 x 0 A(10))
rリターン(CRまたはASCII文字0 x 0 D(13))
t水平タブ(HTまたはASCII文字0 x 09(9))
\反斜線
$ドル記号
二重引用符
[0-7]{1,3}この正規表現シーケンスは、8進記号で表される文字に一致します.
x[0-9 A-Fa-f]{1,2}この正規表現シーケンスは、16進数記号で表される文字に一致します.
いくつかの例を挙げます.
0の特殊文字を含む例:
$str = "ffff\0ffff"; 
echo(strlen($str)); 
echo(""); 
for($i=0;$iecho(""); 
出力結果:
---------------------- 

        102     102     102     102     0       102     102     102     102 
特殊文字を置換する例
$str = "ffff\0ffff"; 
$str = str_replace("\x0", "", $str);   
//または$str=str_replace("\0", "", $str);  
//または$str=str_replace(chr(0), "", $str);  
echo(strlen($str)); 
echo(""); 
for($i=0;$iecho(""); 
出力結果:
---------------------- 

        102     102     102     102     102     102     102     102 
8進法asciiコードの例:
//注意、正則[0-7]{1,3}に合致する文字列は、8進法のasciiコードを表す. 
$str = "\0\01\02\3\7\10\011\08\8";//ここの8は要求に合わず、「\8」(asciiは92と56)に修正されました
echo(strlen($str)); 
echo(""); 
for($i=0;$iecho(""); 
出力結果:
---------------------- 
11 
        0       1       2       3       7       8       9       0       56      92      56 
16進法asciiコードの例:
$str = "\x0\x1\x2\x3\x7\x8\x9\x10\x11\xff"; 
echo(strlen($str)); 
echo(""); 
for($i=0;$iecho(""); 
出力結果: