PHP Webアプリ開発でのXSSやSQL Injection絡みのクォートだなんだのごっちゃになってて、今まで開発やってきたくせにいまいち明確に分かっていませんでした。
が、正解がやっと分かりました!
正解言っちゃいますけどいいでしょうか?これが正解なので暗記してください。あとお子さんが生まれたら真っ先に教えておいてください。
■問題名
- 問題
- 解決策
- エスケープ対象
■XSS
- ユーザの入力をHTML内で表示すると危険なスクリプトを実行される可能性がある
- htmlspecialchars()
- & , < , >
■SQL Injection
- ユーザの入力をSQL文に含める場合、危険なSQLが実行される可能性がある
- addslashes()
- ’, ””, \, NUL (ASCII 0)
「magic_quotes_gpcはどうした?」という意見があるかもしれません。
magic_quotes_gpcに関してはphp.ini-recommendedに下記の記述があります。
; – magic_quotes_gpc = Off [Performance]
; Input data is no longer escaped with slashes so that it can be sent into
; SQL databases without further manipulation. Instead, you should use the
; function addslashes() on each input element you wish to send to a database.
magic_quotes_gpcはSQLのためにある設定で、パフォーマンス的には切ると上がるのでオススメと。これを使わない場合は自分でaddslashes()。
どっちでもいいんですが、下記の2点からOffにして自分でaddslashes()が正解(とします)!
- magic_quotes_gpcはGet,Post,Cookieの略でその時にクォートされる。値を受け取った後プログラム内でシングルクォートなどを入れてしまう可能性はある。
- 複数リクエストに渡る場合、そのたびにクォートされるので毎回戻す必要がある。
あーすっきりした!