0
$stmt_update = $db->prepare("UPDATE 2_1_journal SET RecordDay = ?,  WHERE Number = ? ");
$stmt->execute(array($amount1, $date_day1));

これは mysql インジェクションに対して安全ですか?

安全であれば、私が理解しているように、「= ?」が原因です。次に、どのように「= ?」と質問します。働く/助ける

ここにhttp://php.net/manual/en/pdo.prepare.phpと書いてあるので質問です

準備されたステートメントは、bindParam または bindValue オプションを使用する場合にのみ、SQL インジェクションからあなたを予測します。

たとえば、username と email の 2 つのフィールドを持つ users というテーブルがあり、誰かが自分のユーザー名を更新した場合、次のコマンドを実行できます。

UPDATE `users` SET `user`='$var'

$var は、ユーザーが送信したテキストです。

今あなたがした場合

<?php
$a=new PDO("mysql:host=localhost;dbname=database;","root","");
$b=$a->prepare("UPDATE `users` SET user='$var'");
$b->execute();
?>

ユーザーが User', email='test と入力すると、インジェクションが発生し、メールがテスト用に更新され、ユーザーが User に更新されます。

私のコード (上記) には、bindParams も bindValue もありません。したがって、安全かどうかはわかりません。安全である場合は、コードのどの部分がそれを保証しますか。ご意見をお聞かせください

アップデート

これを読んだ後、PHPでSQLインジェクションを防ぐにはどうすればよいですか? もう1つ質問があります

このコードは

$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->execute(array($name));

これと同じ?

$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute(array(':name' => $name));

はいの場合、短いので最初のコードを使用する方が良いと思われますか?

4

2 に答える 2

1

はい、準備されたステートメントは、使用などの論理的な欠陥がない限り、挿入攻撃から常に安全name = '?'です。

bindParam異なるデータ型をバインドしたい場合に非常に役立ちます。クエリの文字列、整数など。例:

$stmt = $pdo->prepare('SELECT * FROM employees WHERE myID = ?');
$stmt->bindParam( 1, $id, PDO::PARAM_INT );
$stmt->execute();
于 2013-05-04T06:52:46.673 に答える
0

準備されたステートメントは、bindParam または bindValue オプションを使用する場合にのみ、SQL インジェクションからあなたを予測します。

マニュアルはここで間違っています。にデータを渡すことexecute()も安全です。主なことは、プレースホルダーを使用してクエリ内の実際のデータを表すことです。実際のデータの代わりにプレースホルダーを使用している限り、安全です。ただし、PDO は、たとえば識別子など、クエリに追加できるすべてのプレースホルダーを提供しません。

このコードはこれと同じですか?

はい。
名前付きプレースホルダーは、通常のプレースホルダーの単なる「構文糖衣」です。
技術的には、どちらの方法でも同じです。つまり、好みの問題です。
個人的には、通常のクエスチョン マークのプレースホルダーを好みます。実際にコードが劇的に短くなるためです。

于 2013-05-04T07:11:12.157 に答える