PHPのaddslashes関数とaddcslashes関数の違いと詳細

3270 ワード

一、addslashesは反スラッシュを使用して文字列を参照する
1.引数は1つのみで、エスケープする文字列
2.エスケープできる文字は、一重引用符(')、二重引用符(")、反斜線()、NUL(null文字)です.
3.例
echo $string = addslashes('aaa"a\dd"aa"'), PHP_EOL;   //     : aaa\"a\\dd\"aa\"

4.その反転関数は次のとおりです.
stripslashes-参照文字列を逆参照
echo stripslashes($string), PHP_EOL;            //     :  aaa"a\dd"aa"

ps:phpは5.3以前にマジックリファレンスを使用することができ、phpのセキュリティメカニズムであり、効果はaddslashesに等しい.
しかし、移植性が低下し、パフォーマンスが低下し、すべてのデータがエスケープされる必要はなく、エスケープが戻ってくる必要があるため、一般的にはオンになりません.
magic_quotes_gpcはHTTPリクエストデータ(GET、POST、COOKIE)に影響します.実行時に変更することはできません.PHPではデフォルト値はonです.get_magic_quotes_gpc()を参照してください.magic_quotes_runtimeを開くと、外部ソースからデータを取得して返される関数の大部分が、データベースやテキストファイルからのデータを含めて、返されるデータは逆斜線でエスケープされます.このオプションは、PHPのデフォルト値がoffである場合に実行時に変更できます.set_magic_quotes_runtime()およびget_magic_quotes_runtime()を参照してください.magic_quotes_sybaseを開くと、逆斜線ではなく一重引用符で一重引用符がエスケープされます.このオプションはmagic_quotes_gpcを完全に上書きします.両方のオプションを同時に開くと、一重引用符は'にエスケープされます.二重引用符、逆斜線、NULL文字はエスケープされません.
異なるバージョンの互換性を実現するために、
コードに処理コードを付ける必要がある
/**
 *         
 */
function cleanQuotes() {
    //TODO :         ,            ,     ,      
    if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
        if (isset($_GET)) $_GET = _stripSlashes($_GET);
        if (isset($_POST)) $_POST = _stripSlashes($_POST);
        if (isset($_REQUEST)) $_REQUEST = _stripSlashes($_REQUEST);
        if (isset($_COOKIE)) $_COOKIE = _stripSlashes($_COOKIE);
    }
    if (function_exists('get_magic_quotes_runtime') && get_magic_quotes_runtime()) {
        set_magic_quotes_runtime(false);
    }
//    if (ini_get('magic_quotes_runtime') != 0) {          //        
//        ini_set('magic_quotes_runtime', 0);
//    }
    if (ini_get('magic_quotes_sybase') != 0) {
        ini_set('magic_quotes_sybase', 0);
    }
}

/**
 *   stripslashes       
 * @param array|string $data        
 * @return array|string         
 */
function _stripSlashes($data) {
    return is_array($data) ? array_map('_stripSlashes', $data) : stripslashes($data);
}
cleanQuotes(); //    

これですべてのマジックリファレンスが復元されます.
データがデータベースを使用する前にaddslashesエスケープ文字列を使用できる場合は、文字符号化に関連付けられたmysql専用関数mysqli_real_escape_stringを使用することをお勧めします.
二、addcslashes—C言語スタイルで反斜線エスケープ文字列の文字を使用する
1.パラメータは2つあり、1番目のパラメータはエスケープされる文字列、2番目のパラメータはエスケープされる文字リストである
2.その反転関数は次のとおりです.
stripcslashes-addcslashes()を使用してエスケープされた文字列を逆参照します.
3.例
$str = 'ch[ \'"]';
echo $str, PHP_EOL;
echo $string = addcslashes($str, 'A..z][ \'"'), PHP_EOL;
echo stripcslashes($string), PHP_EOL;

しゅつりょく
ch[ '"]
\c\h\[\ \'\"\]
ch[ '"]

エスケープするパラメータを自分で選択できます.A..zは大文字と小文字を表します.
タブのように、変換子のアルファベットが変換され、反転義が戻ってこない場合は、他のアルファベットにも影響を与えることに注意してください.
$str = 'chtr[ \'"]at';
echo $str, PHP_EOL;
echo $string = addcslashes($str, 'A..z][ \'"'), PHP_EOL;
echo stripcslashes($string), PHP_EOL;

結果
chtr[ '"]at
\c\h\t\r\[\ \'\"\]\a\t
[ '"]