プリペアド ステートメントとエスケープ: バランスをとる方法
PHP でプリペアド ステートメントを使用する場合、これを防ぐために mysql_real_escape_string() を使用する必要がありますか? SQLインジェクション?この質問に答えるために、特定のクエリとその実装を調べてみましょう。
クエリと実装
<code class="php">$consulta = $_REQUEST["term"] . "%"; $sql = $db->prepare('select location from location_job where location like ?'); $sql->bind_param('s', $consulta); $sql->execute(); $sql->bind_result($location); $data = array(); while ($sql->fetch()) { $data[] = array('label' => $location); } ?> **The Dilemma** The provided query aims to fetch locations that match the term entered in the $_REQUEST["term"] variable. While the usage of a prepared statement is commendable for preventing SQL injections, the implementation raises a query: is mysql_real_escape_string() still necessary in this case? **The Verdict: No, but a Refinement is Suggested** When using prepared statements, as long as they are employed correctly, they effectively shield against SQL injections. In this instance, mysql_real_escape_string() is redundant. However, a minor improvement can enhance the code's clarity and efficiency. Rather than using bind_param('s', $consulta), it's more straightforward to pass parameters through the execute method, especially when utilizing the '?' placeholder. The updated code would be: </code>
$sql->execute([$consulta]);
重要な理由
パラメータ バインディングを備えたプリペアド ステートメントにより、外部データが SQL クエリを操作できなくなります。ただし、SQL パラメーターのバインディングだけでは、HTML 内での安全な表示が保証されないことに注意してください。そのためには、クエリ結果を出力する前に htmlspecialchars() のような関数を使用することが重要です。
以上がプリペアドステートメントを使用すると、PHP の「mysql_real_escape_string()」が不要になりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。