0

重複の可能性:
PHP で SQL インジェクションを防ぐ方法は?

私は無料の php サーバーを使用しています。php.ini ファイルにアクセスできず、magic_quotes がオンになっています。フォームページを介してmysqlにレコードを追加している間、私のphpコードは

$_POST["text"]=trim(stripslashes(mysql_real_escape_string($_POST["text"])));

私の質問:

  1. Magic_quote の効果は減価償却して削除し、潜在的に悪意のあるユーザー入力を最適な方法で mysql に入れるため、これを排除したいと考えています。上記の私のコードは正しいですか、それとも変更、改善が必要ですか?

    ありがとう、
4

1 に答える 1

3

魔法の引用符を取り除くには、stripslashes() だけで十分です。

$text = stripslashes($_POST["text"]); 

実行時にマジック クォートを削除するより完全な例を参照してください: http://php.net/manual/en/security.magicquotes.disabling.php

別の PHP サーバーを取得する必要があります。PHP 5.3.0 (2009 年 6 月) 以降、マジック クォートは廃止されました。あなたの PHP ホスティング サイトは、ほぼ 4 年間 PHP を更新していないため、他の多くのバグやセキュリティの脆弱性さえも危険にさらされています。別のホストに移動する時が来ました。


あなたのコメントについて:

はい、stripslashes はリクエスト パラメータをプレーン テキストに変換するだけです。

mysql_real_escape_string() を使用する必要があるかどうかの質問については...

まず、値を SQL クエリに補間する場合にのみ、これを行う必要があります。必ずしもすべての POST 値でそれを行うとは限らないため、すべてにエスケープを適用するのはばかげています。

例えるなら、どれだけ食べるか、残り物としてどれだけ食べるかを知る前に、夕食を冷蔵庫の保存容器に入れるようなものです。:-)

次に、mysql_* 関数をまったく使用しないでください。これらはPHP 5.5.0 で非推奨になり、PHP の将来のバージョンでは削除される予定です。mysqli_* または PDO 関数の使用を開始する必要があります。

第 3 に、SQL クエリの動的な値にはエスケープを使用しないでください。代わりに、パラメータを使用して準備済みクエリを使用してください。パラメータ化されたクエリは、 mysql_real_escape_string() を使用するよりも安全で、コーディングが簡単で、実行が高速です。


次のコメントについて:

いいえ、まだ手に入れていないと思います。

$_POST["text"] を SQL クエリに挿入したい場合で、マジック クォートがオンになっている場合は、次のようにします。

// remove the magic quotes simply with stripslashes():
$text = stripslashes($_POST["text"]);

// prepare an SQL statement, using a ? placeholder instead of interpolated value
$stmt = $mysqli->prepare("INSERT INTO mytable (mytext) VALUES (?)");

// always check for an error on prepare, you might have made a syntax error, 
// or the table might not exist, etc.
if ($stmt === false) {
  die($mysqli->error);
} 

// bind one PHP variables for each parameter placeholder in the query
$stmt->bind_param("s", $text);

// then execute!  MySQL will use the values of the PHP variables you bound
// in place of the placeholders
$status = $stmt->execute();

// always check for an error on execute too, because the value of the parameter 
// might cause the query to fail, e.g. conflicting with another value in a 
// unique column, etc.
if ($status === false) {
  die($stmt->error);
}

クエリ パラメータを使用する場合、mysqli_real_escape_string() を使用する必要がある場合はありません。


さらにヘルプが必要な場合は、バインドされたパラメーターを示す例を含む mysqli のチュートリアルを次に示します。

于 2013-02-02T21:42:36.550 に答える