0

データベースは、次の例のように、準備ステートメントを使用した SQL インジェクションに対して依然として脆弱ですか (私は PDO と php バージョン 5.3 を使用しています):

  $unsafe = $_POST['user_input'];

  $stmt = $db->prepare("INSERT INTO table (column) VALUES ('" . $unsafe . "')");

2つの例に言及する価値のある違いはありますか?

  $stmt = $db->prepare('SELECT * FROM table WHERE name = :name');

  $stmt->execute(array(':name' => $name));

    $stmt = $db->prepare('SELECT * FROM table WHERE name = :name');
    $stmt->bind_param(':name', $name);

    $stmt->execute();

メソッドの実行で使用できるパラメーターの種類は何ですか?

4

2 に答える 2

1

あなたの実際の質問が何であるかは完全には明らかではありませんが、私にこれを言わせてください:

あなたが投稿した最初のスニペットはすぐです。非推奨の拡張機能(または非推奨になっている拡張機能)を使用するための有効な引数は1つもありませんmysql_*mysql_connectそれらの厄介な電話をすべて一緒に忘れてください。
使用していると思われる他の2つのスニペットを見ると、PDOprepare-emulationをサポートしています。実際、デフォルトでprepareをエミュレートします。ただし、3番目のスニペットがmysqli_*スニペットである場合、何が問題になりますか?MySQL 3.xを実行していない限り、問題はありません。

エミュレートされた準備呼び出しと直接準備呼び出しの違いは、エミュレーションがMySQLサーバーを使用せずに構文エラーを検出する可能性があるため、より効率的であるということです。ただし、MySQLサーバーがプリペアドステートメントをサポートしていない場合は、それを処理してくれると確信しているPDOので、問題はありません。でも、わからないmysqli_*。すべてを考慮すると、とにかく2番目のスニペットに賛成です。コードが少なく、3番目のスニペットと同じことを行い、コードを整理して保守しやすくします。

「メソッド実行で使用できるパラメーターのタイプ」の質問については、ここに表示されているように、パラメーターがない場合PDO、または配列の場合は、ドキュメントページを参照できますbool PDOStatement::execute ([ array $input_parameters ] )
の場合はmysqli_execute、使用方法によって異なります。ドキュメントに示されているように、OOまたは手続き型スタイル:手続き型スタイル
bool mysqli_stmt::execute ( void )のOOの場合
bool mysqli_stmt_execute ( mysqli_stmt $stmt )

于 2013-03-15T00:26:55.960 に答える
0

データベースは、次の例のように、準備ステートメントを使用した SQL インジェクションに対して依然として脆弱ですか?

なんで?もちろん。この例では実際に使用される準備済みステートメントがないためです。

エミュレートされた準備と直接の準備呼び出しの違いは?

セキュリティに関して違いはありません。どちらの方法でも安全です。
ただし、以下の不具合が発生する可能性があります

Errr...エミュレートされた準備が何であるかについて間違った考えを持っているかもしれないと思いました。
あなたの質問の最初のコードスニペットは、準備されたステートメントではなく、エミュレートされたものでも自然なものでもありませんが、すべての危険が背後にある古い良い外挿です。
エミュレートされた準備は、PDOがクエリを操作する方法の略ですが、ここで説明されています

メソッドの実行で使用できるパラメーターの種類は何ですか?

これは明らかです。デフォルトでは、すべてのパラメータが文字列として扱われます。

したがって、クエリはどちらの方法でも無敵ですが、エミュレーションがオンの場合は不便になる可能性があります.LIMIT句にプレースホルダーがある場合は、パラメーターを明示的にバインドする必要があり、実行に渡すのではなく、INT型を設定する必要があります。
しかし、エミュレーションが無効になっている場合、mysql はすべてのパラメーターを正しく並べ替えることができ、配列をexecute()ずっと送信することができます。

于 2013-03-15T04:23:45.837 に答える