2

PHP PDO ステートメントは自動的にエスケープされますか、それとも準備済みステートメントのみですか?

たとえば、$username$passwordがユーザー入力であるとします。次のコードは安全ですか、それともインジェクションに対して脆弱ですか?

$dbh = new PDO("mysql:host=localhost;dbname=mydb", $my_mysql_username, $my_mysql_password);
$sth = $dbh->query("SELECT * FROM users WHERE username='$username' AND password='$password'");
$result = $sth->fetch();
if(!$result){
    $dbh->exec("INSERT INTO users (username, password) VALUES ('$username', '$password')");
}

(上記のコードは純粋に仮説であり、例としてのみ使用されています。)

それらが自動的にエスケープされない場合、PDOmysql_はこの状況で関数に対して追加の保護を提供しますか?

4

2 に答える 2

5

魔法の引用符が有効になっているような醜さがないと仮定すると、準備されたステートメントのみが自動魔法のエスケープを提供します。また、params 内のデータのみがエスケープされ、ステートメントを準備するときに SQL 文字列に既に含まれているものは何もエスケープされません。

自動エスケープの利点が必要な場合は、ステートメントを準備して、データを個別にフィードする必要があります。

$sth = $dbh->prepare("SELECT * FROM users WHERE username=? AND password=?");
$sth->execute(array($username, $password));

そうしないmysqli_queryと、友人や友人をほとんどまたはまったく保護できません。(自尊心のある PHP プログラマーはもう使用していないため、言及 することさえ拒否しmysql_queryます。ああ、待って..くそー。まあ、それがここで言及される唯一の言及です。)

于 2012-11-25T03:48:35.127 に答える
3

それらはエスケープされません。ここで例を見ることができます:

http://www.phptherightway.com/#pdo

于 2012-11-25T03:48:09.363 に答える