質問: "登録しました。"; header('location: address.php'); } ``` としています。 正直、書籍のものがコードが少なく、SQLインジェクションに対しても有効なのであればこういった書き方をしたいとおもっています。 ?に対して順番にセットしていくだけでも良いのでしょうか? よろしくおねがいします
回答: おす! SQLインジェクション対策が出来ているかいねぇかって話なら、出来てるぞ。 どこを見ればいいのかって話だが、prepareしてるSQLがどうなってっか見ればいいぞ。 prepareしてるSQLには一切変数展開がされてねぇから、書いたとおりにしか動かねぇ。 ``` INSERT INTO goods VALUES(?,?,?) ``` と ``` UPDATE Goods SET GoodsName=?, Price=? WHERE GoodsID=? ``` だな。 SQLインジェクションってぇのは、SQLがデータベースのオプティマイザで解析されて実行計画が立てられる時に、実装者の意図とは違った構文として認識された場合に発生すんだ。 例えばGoodsNameの値が ``` '; --- ``` だったりして、これが直接埋め込まれた場合、 ``` UPDATE Goods SET GoodsName=''; ---', Price=? WHERE GoodsID=? ``` みてぇになる。 これをオプティマイザが解析してクエリの実行計画を立てると、WHERE文がコメントアウトされたせいでUPDATE文が意図せず無作為に実行されてデータベースが不正に書き換えられちまうって寸法だ。 だけんども、今回発行してるクエリは ``` UPDATE Goods SET GoodsName=?, Price=? WHERE GoodsID=? ``` だ。オプティマイザはこれを解析して実行計画を立てる。 その後で、 ? の場所に値をバインドする。 既にクエリの実行計画は立ててあっからおかしなUPDATE文が発行されちまう事は絶対にねぇ。 ? の場所に値をバインドしてくだけだ。 SQLインジェクションってぇのは、構文も値も全部ひとかたまりの文字列としてデータベースに渡されて意図しない形で解析されっから起こる。 渡したSQLクエリが製作者の意図に反した解釈がされる可能性が全く無い状態でprepareしてさえいれば、SQLインジェクションは絶対に起こらねぇんだ。 だから、注意しなければならねぇのはprepareするSQLクエリを動的に組み立てる時だけだな。 その場合でも、ユーザーからの入力を直接SQLクエリのパーツにしなければ心配する必要はねぇだろうな。