20

PHP manualによると、コードの移植性を高めるために、データのエスケープに次のようなものを使用することをお勧めします。

if (!get_magic_quotes_gpc()) {
    $lastname = addslashes($_POST['lastname']);
} else {
    $lastname = $_POST['lastname'];
}

実行する他の検証チェックがありますが、データのエスケープに関して上記は厳密にどの程度安全ですか? また、マジック クォートが PHP 6 で非推奨になることも確認しました。上記のコードにどのような影響がありますか? mysql_real_escape_string() のようなデータベース固有のエスケープ関数に依存する必要はありません。

4

12 に答える 12

28

魔法の引用符は本質的に壊れています。これらは PHP スクリプトへの入力をサニタイズすることを目的としていましたが、その入力がどのように使用されるかを知らなければ、正しくサニタイズすることはできません。どちらかといえば、マジック クォートが有効になっているかどうかを確認してから、$_GET/$_POST/$_COOKIES/$_REQUEST で stripslashes() を呼び出し、変数を使用している場所でサニタイズすることをお勧めします。たとえば、URL で使用する場合は urlencode()、Web ページに出力する場合は htmlentities()、データベースに保存する場合はデータベース ドライバーのエスケープ関数を使用します。これらの入力配列にはサブ配列が含まれている可能性があるため、サブ配列に再帰してこれらのスラッシュも削除する関数を作成する必要がある場合があることに注意してください。

マジック クォートに関するPHP のman ページは次のように同意しています。

「この機能は、PHP 5.3.0 で非推奨となり、PHP 5.4.0 で削除されました。この機能に依存することはお勧めしません。マジック クォートは、受信データを PHP スクリプトに自動的にエスケープするプロセスです。マジックでコーディングすることをお勧めします。必要に応じて、代わりに実行時にデータをエスケープします。」

于 2008-10-21T00:57:28.860 に答える
20

マジック クォートは設計ミスでした。それらの使用は、あなたの正気を保つことと両立しません。

私が好む:

if (get_magic_quotes_gpc()) {
   throw new Exception("Turn magic quotes off now!");
}

本質的に壊れたセットアップとの互換性のためにコードを書かないでください。代わりに、コードをFAIL FASTにすることで、それらの使用を防ぎます。

于 2008-10-21T08:43:03.353 に答える
6

私は自分の Web サイトのヘッダー ファイルで次のコードを使用して、magic_quotes の効果を無効にしています。

<?php

// Strips slashes recursively only up to 3 levels to prevent attackers from
// causing a stack overflow error.
function stripslashes_array(&$array, $iterations=0) {
    if ($iterations < 3) {
        foreach ($array as $key => $value) {
            if (is_array($value)) {
                stripslashes_array($array[$key], $iterations + 1);
            } else {
                $array[$key] = stripslashes($array[$key]);
            }
        }
    }
}

if (get_magic_quotes_gpc()) {
    stripslashes_array($_GET);
    stripslashes_array($_POST);
    stripslashes_array($_COOKIE);
}

?>

その後、magic_quotes が存在しなかったかのように残りのコードを記述できます。

于 2008-10-21T01:29:16.863 に答える
2

コードに PHP 5.2 以上の要件を設定し、フィルター APIを使用します。関数は未加工の入力データに直接アクセスするため(filter_*触れない$_POSTなど)、 の影響をまったく受けませんmagic_quotes_gpc

次に、この例:

if (!get_magic_quotes_gpc()) {
    $lastname = addslashes($_POST['lastname']);
} else {
    $lastname = $_POST['lastname'];
}

これになることができます:

$lastname = filter_input(INPUT_POST, 'lastname');
于 2009-01-14T03:16:00.797 に答える
2

「mysql_real_escape_string() のようなデータベース固有のエスケープ関数に頼る必要はありません」

次に、PDOのようなものを使用します。しかし、とにかく魔法の引用によって与えられたダメージを元に戻す必要があります.

于 2008-10-21T08:29:06.593 に答える
1

そうです、それは最善の方法ではなく、最も安全でもありません。エスケープは、エスケープする目的に関連して行うのが最適です。mysql データベースに保存する場合は、他のロケール、文字セットを考慮した mysql_real_escape_string を使用します。HTML、htmlentities の場合。コードで使用する場合は、escapeshellcmd、escapeshellarg。はい、魔法の引用符がオンになっている場合は、おそらく最初に鐙を打つ必要があります。しかし、それを当てにしたり使用したりしないのが最善です。

于 2008-10-21T01:00:19.823 に答える
0

サンプルコードは逆です。次のことを行う必要があります。

if (get_magic_quotes_gpc()) {
  $lastname = stripslashes($_POST['lastname']);
} else {
  $lastname = $_POST['lastname'];
}

これにより、入力データはユーザーが入力したとおりの「生」の状態のままになることに注意してください。余分なバックスラッシュはなく、SQL インジェクションや XSRF 攻撃でロードされる可能性があります。これはまさにあなたが望むものです。次に、常に次のいずれかを使用するようにします。

  • echo変数を HTML に ing するときは、それをラップします。htmlentities()
  • それをmysqlに入れるときは、準備されたステートメントを使用するかmysql_real_escape_string()、最低限として使用してください。
  • echo変数を Javascritpt コードに ing するときは、次を使用します。json_encode()

Joel Spolsky は、Making Wrong Code Look Wrongで良い開始アドバイスを提供しています。

于 2009-01-14T03:42:44.083 に答える
0

「mysql_real_escape_string() のようなデータベース固有のエスケープ関数に頼る必要はありません」

また、addslashes もだまされる可能性があります。この投稿もチェックしてください。

http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-string

于 2009-01-14T02:41:52.457 に答える
0

これを試すことができます:

if (get_magic_quotes_gpc()) { 
          $_REQUEST = array_map('stripslashes', $_REQUEST); 
          $_GET = array_map('stripslashes', $_GET);
          $_POST = array_map('stripslashes', $_POST);
          $_GET = array_map('stripslashes', $_COOKIES);

    }
于 2008-11-28T11:21:50.830 に答える
0

PHPマニュアルページでこれを見つけたところ、emを削除するかなり賢い方法のように見えます(キーと値を扱います...):

if (get_magic_quotes_gpc())
{
    $_GET = json_decode(stripslashes(json_encode($_GET, JSON_HEX_APOS)), true);
    $_POST = json_decode(stripslashes(json_encode($_POST, JSON_HEX_APOS)), true);
    $_COOKIE = json_decode(stripslashes(json_encode($_COOKIE, JSON_HEX_APOS)), true);
    $_REQUEST = json_decode(stripslashes(json_encode($_REQUEST, JSON_HEX_APOS)), true);
    ini_set('magic_quotes_gpc', 0);
}
于 2010-04-22T06:05:26.980 に答える
0

データベース固有のエスケープ関数の使用に関しては、かなり必要です。addslashes()MySQL を使用すると、まれに失敗することがわかりました。使用しているDBを決定するエスケープ関数を作成してから、適切なエスケープ関数を使用できます。

于 2008-10-21T06:47:47.827 に答える