1

映画を一覧表示するテーブルがあり、簡単な検索機能が組み込まれています。フォームにタイトルまたはキーワードを入力できるテキスト フィールドが 1 つあり、フォームが送信されます。

作業を行う php/mysql コードは次のとおりです。

$find = $_POST['find'];
$find = mysql_real_escape_string($find);
$find = htmlspecialchars($find);
$sql = "SELECT * FROM tbl_buyerguide WHERE rel_date BETWEEN NOW() AND DATE_ADD(now(), INTERVAL 2 MONTH) AND title LIKE '%".$find."%' ORDER BY title";

ここで、'find' は検索フォームに入力されたテキストの名前です。

これは、必要な目的の検索機能には十分に機能します。

皆さんへの私の質問は次のとおりです。

mysql_real_escape_string と htmlspecialchars は検索フォームを安全にするのに十分ですか?

これについてstackoverflowで見つけることができるすべての質問を読みましたが、知っている人に「はい、それで十分です」または「いいえ、あなたも考慮する必要がある」と言ってもらいたいですアカウント ..."。

前もって感謝します。乾杯アル。

4

2 に答える 2

4

Filter In, Escape Outという格言を思い出してください。

そこに用語を出力していないのに、なぜHTML目的でエスケープするのhtmlspecialchars()ですか?

代わりに、データベースに対してのみエスケープします(準備済みステートメントを使用する必要がありますが、それは別のポイントです)。したがって、そこでhtmlspecialchars を使用しないでください。

代わりに、変数を HTML ページに出力するときは、HTML 用にエスケープする必要があります (ここでも を使用しますhtmlspecialchars)。

現在、データベースと html エスケープを混在させているため、どちらも効果的ではありません...

于 2013-06-21T01:34:43.843 に答える
2

はい、それを安全にするだけで十分です....いつでもそこに strip_tags() を投げることができます....

私は1行でそれを行うだけですが...3つを使用する代わりに

   $find = htmlspecialchars(mysql_real_escape_string($_POST['find']));

しかし、本当に安全で最新の状態にするためには、mysql_* 関数は非推奨であり、PHP の将来のリリースでは削除されるため、使用を中止する必要があります....

代わりに、mysqli_* または PDO に切り替えて、セキュリティを処理する準備済みステートメントを実装する必要があります。

例... PDOで

   $db = new PDO('mysql:server=localhost;dbname=test', 'username', 'password');

   $find = $_POST['find'];

   $query = $db->prepare('SELECT * FROM tbl_buyerguide WHERE rel_date BETWEEN NOW() AND DATE_ADD(now(), INTERVAL 2 MONTH) AND title LIKE :like ORDER BY title');
   $query->bindValue(':like', '%' . $find . '%');
   $query->execute();
于 2013-06-21T00:34:28.300 に答える