3

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

SQL インジェクションについて調査を行っていますが、答えが見つからない質問がいくつかあります。文字列レベルでの SQL インジェクション攻撃を防ぐことはできないのでしょうか? 私が言いたいのは、それを防ぐことはできないということです。

  • mysql クエリで処理する前に不正な文字を見つけていますか?

    $postID = $_POST['id'];
    if($postID contains characters)
        remove characters;
    if($postID still contains characters)
        then exit;
    else
        mysql_real_escape_string($postID); //just in case?
    continue to do whatever you are doing...
    

PDO/mysqli を使用する必要は本当にありますか? mysql で処理する SQL 文字列を分析するだけで十分ですか? 返信する際は、私が PHP または MySQL の専門家ではないことに注意してください。私は彼らについて学ぼうとしている人です。

4

6 に答える 6

4

mysql_real_escape_string($postID)確かに、関数を呼び出すたびにクエリを気にしない限り、 を使用してインジェクションを防ぐことができます。

PDO と MySQLi は、単なるインジェクション保護以上のものを提供します。それらは、データベースへの複数の呼び出しなしで注入から保護できる準備済みステートメントを可能にします。これは、全体的なパフォーマンスが高速であることを意味します。テーブルに 30 列のユーザー レコードを挿入しようとすることを想像してみてください。これは多くのmysql_real_escape_string()呼び出しです。

準備されたステートメントは、すべてのデータをクエリとともに一度に送信し、1 つの要求でサーバー上でエスケープします。Mysql DB は準備済みステートメントをサポートしていますが、古い php mysql_ ライブラリはそれらをサポートしていません。

mysqli またはできれば PDO に移行する時が来ました。後戻りすることはありません。

于 2012-10-30T21:08:14.783 に答える
2

PDO (PHP Data Objects) を使用することをお勧めします。これは SQL インジェクションを防ぎ、クエリを高速化します。また、アプリケーションはデータベースからより抽象化されます。

次のようなもの:

$stmt = $conn->prepare("INSERT INTO table_name VALUES(:id, :firstname, :lastname)");
$stmt->bindValue(':id', $id);
$stmt->bindValue(':firstname', $firstname);
$stmt->bindValue(':lastname', $lastname);
$stmt->execute();
于 2012-10-30T21:13:47.990 に答える
0

PDO/mysqli を使用する必要は本当にありますか?

いいえ。

mysql で処理する SQL 文字列を分析するだけで十分ですか?

いいえ。

学習教材

セキュリティ制御のコーディング

独自のセキュリティ コントロールを記述しないでください。すべての Web アプリケーションまたは Web サービスのセキュリティ制御を開発する際に一からやり直すと、時間の浪費と膨大なセキュリティ ホールが発生します。OWASP Enterprise Security API (ESAPI) ツールキットは、ソフトウェア開発者がセキュリティ関連の設計と実装の欠陥から保護するのに役立ちます - https://code.google.com/p/owasp-esapi-php/

于 2012-10-30T21:26:06.380 に答える
0

mysql_ 関数は廃止されたため、これ以上使用することはお勧めしません。通常の mysql_ が廃止された理由の詳細については、 http ://php.net/manual/en/function.mysql-real-escape-string.php を確認してください。本当に簡単に mysqli に切り替えることができます。それほど複雑ではありません。さらに、文字をエスケープしたいが、すべての mysql_real_escape_string を新しいエスケープ方法に置き換えたくない場合は、次の関数を使用できます。

function mysql_string_safe($stringtoclean)
{ 
    //In this case, 
    $safestring = mysqli_real_escape_string('your_handle_here',$stringtoclean);
    return $safestring;
}

したがって、mysql_string_safe を mysql_real_escape_string に置き換えます。mysqli は mysql_ に非常に似ていますが、より安全です。私はそれに切り替えましたが、それほど時間はかかりませんでした。交換するだけだったので簡単でした。データベースへの接続も異なります。一方、PDO はさまざまなデータベース ドライバーをサポートしていますが、時間を節約したくてデータベース ドライバーを切り替えるつもりがない場合は、mysqli を使用してください。

于 2012-10-30T21:10:38.357 に答える
0

IDが整数の場合は、そのまま使用してください

$postID = (int)$_POST['id'];

そしてもちろん、$postID が != その行の後にゼロであるかどうかを検証します。

于 2012-10-30T21:13:18.103 に答える
-2

PDO を使用してステートメントを準備するだけです。

于 2012-10-30T21:22:41.360 に答える