web-dev-qa-db-ja.com

PDOで入力をサニタイズするにはどうすればよいですか?

[〜#〜] pdo [を使用する場合、入力(_$_POST_や_$_GET_など)でmysql_real_escape_string()を使用する必要がありますか? 〜#〜] ライブラリ?

PDOを使用してユーザー入力を適切にエスケープするにはどうすればよいですか?

19
Karem

PDOを使用すると、クエリをパラメータ化して、含まれている変数をエスケープする必要がなくなります。

PDOの優れた入門チュートリアルについては、 ここ を参照してください。

PDOを使用すると、プリペアドステートメントを使用してSQLと渡されたパラメーターを分離できます。これにより、文字列をエスケープする必要がなくなります。2つは別々に保持され、実行時に結合されるため、パラメーターは上記のソースから自動的に刺し傷として処理されます。

   // where $dbh is your PDO connection

   $stmt = $dbh->prepare("SELECT * FROM animals WHERE animal_id = :animal_id AND animal_name = :animal_name");

   /*** bind the paramaters ***/
   $stmt->bindParam(':animal_id', $animal_id, PDO::PARAM_INT);
   $stmt->bindParam(':animal_name', $animal_name, PDO::PARAM_STR, 5);

   /*** execute the prepared statement ***/
   $stmt->execute();

注:サニタイズは変数バインディング中に発生します($stmt->bindParam

その他のリソース:

http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/

http://www.phpeveryday.com/articles/PDO-Prepared-Statement-P550.html

http://php.net/manual/en/pdo.prepared-statements.php

28
SW4

PDOを使用する際の重要なポイントは次のとおりです。

PDOは、SQLに対してのみサニタイズし、アプリケーションに対してはサニタイズしません。

そのため、INSERTやUPDATEなどの書き込みの場合は、最初にデータをフィルタリングし、他の目的(HTMLタグ、JavaScriptなどの削除)のためにデータをサニタイズすることが特に重要です。

<?php
$pdo = new PDO(...);
$stmt = $pdo->prepare('UPDATE users SET name = :name WHERE id = :id');
$id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT); // <-- filter your data first
$name = filter_input(INPUT_GET, 'name', FILTER_SANITIZE_STRING); // <-- filter your data first
$stmt->bindParam(':id', $id, PDO::PARAM_INT); // <-- Automatically sanitized for SQL by PDO
$stmt->bindParam(':name', $name, PDO::PARAM_STR); // <-- Automatically sanitized for SQL by PDO
$stmt->execute();

ユーザー入力をサニタイズしなければ、ハッカーはJavaScriptをデータベースに保存し、それをサイトに出力すると脅威にさらされる可能性があります。

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

8
fluminis