sprintf()の%は%でエスケープできる
sprintf()式で使う、「%」は、「%」を使うことでエスケープできる※。
具体的な例を書くと、
$comment = 'php';
$sql = sprintf('SELECT * FROM comment LIKE "%%%S%%"', $comment);
とすると、結果的に 「%php%」と言う文字列に変換される。
SQL文をsprintf文を使って組み立てることはセキュリティ上、絶対にやめた方がほうが良いです。と言うかやめるべきです、PDOと言うものを使いましょう。※今から解説を見ようとしてんのに何言ってんのと思うかもしれませんが、本記事は筆者がエンジニアになりたてのころ、個人的にうまく動いたものを備忘録的に書いただけの記事になります。それをご了承の上ご購読願います!
具体的な処理の流れを見ていこう。
エスケープの流れ
「%s」は変数の値でphpに変換される。
なので「%%php%%」になる。
残った「%」のうち、後ろの%は、それぞれ手前の 「%」でエスケープされるので、結果としてただの「%」と言う「文字列」になる。
%→「%」php %→「%」
結果「%php%」が残る
これがSQLのLIKE文に残ることで、結果として、
$sql = 'SELECT * FROM comment LIKE %php%';
と言うSQL文の完成。
%はワイルドカードなので、「php」と言う文字列を含むレコードを全て取ってくる、 と言うSQL文の出来上がり。
ちなみにこれは、検索フォームなどで入力された文字列からDBのレコードを引っ張ってくるときなんかに便利。
注意点としては、でユーザの入力情報を受け取って変換するときは、必ず「サニタイズ」すること
悪意ある入力によってSQLインジェクションされてしまうので。
まとめ
sprintf()式で使う、「%」は、「%」を使うことでエスケープできる。
コメントを残す