1

同様の質問がおそらく以前に尋ねられたことがあります。SQL インジェクションから正しく保護していることを確認する必要があります。

php sql ステートメントを pdo ステートメントに変換しました。mysql_real_escape_string古い sql クエリでは、 、strip_tags()、および多分を使用していましたhtmlenteties()(id が html を実行したかどうかはわかりません)。

pdoステートメントでこのようなものを使用する必要がありますか? これは pdo では不要であるといくつかの場所で聞いたことがあります。真偽は?

そして:私はいつも以下の最初の例のようなクエリを書いてきました:

SELECT `id` , `password` FROM  `users` WHERE `username` = '$username'
SELECT id, password FROM users WHERE username = '$username'

例 1 は例 2 よりも (SQL インジェクションから) より安全ですか、それとも時間を無駄にしただけですか?

4

2 に答える 2

4

PDOを使用している場合は、パラメーター付きのプリペアドステートメントを使用する必要があります。ドキュメントにはいくつかの例があります。

/* Execute a prepared statement by passing an array of values */
$sql = 'SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour';
$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute(array(':calories' => 150, ':colour' => 'red'));
$red = $sth->fetchAll();
$sth->execute(array(':calories' => 175, ':colour' => 'yellow'));
$yellow = $sth->fetchAll();

このアプローチを使用する場合、文字列をエスケープする必要はありません。

于 2012-07-26T20:36:16.847 に答える
1

プリペアド ステートメントを使用するため、PDO で文字列をエスケープする必要はないと彼らは言います。mysql のようにPDOquery()メソッドを使用しているだけでは、mysql を使用するだけでは安全ではありません。あなたが与えた例については、どちらも同じように安全ではありません。どちらも同じようにインジェクションに対して脆弱です (そして、インジェクションに対して非常に脆弱です)。分岐点では、拡張機能には、複数の SQL ステートメントを 1 つでは実行できないという意味でmysqli1 つの利点があります。これにより、いくつかの (すべてではありませんが) インジェクションの試み、特に新しいスーパーユーザーを作成する試みなどに対して、ある程度の (完全ではない) 保護が提供されます。PDOmysqli_query()

于 2012-07-26T20:39:00.403 に答える