質問: HPのSQLインジェクション対策について。 プレースホルダを使わないで対策を行いたいのですが、 1.リテラル内のシングルクォートをエスケープする。 2.その際、addslashesを使わないでpg_escape_stringやmysql_real_escape_stringを使う 3.SJISをリテラルに含めない 4.リテラルはシングルクォートで囲む 5.DBの文字コードとプログラムの内部文字コードを合わせる 上記以外に注意することはありますか?
回答: > > 1.リテラル内のシングルクォートをエスケープする。 > > > 2.その際、addslashesを使わないでpg_escape_stringやmysql_real_escape_stringを使う > > > 気をつけなければいけない文字はシングルクオートだけではない。 mysql_real_escape_string などの関数はそのほかの注意すべき文字も含めてトータルで問題ない形に変換するための関数。 基本的にはこれらのエスケープ関数に任せておけば最悪文法エラーになる程度で脆弱性になることは少ないが、 前提条件として、「文字コード設定」がきちんと行われていることが前提になる。 SET NAMESは禁止 MySQL SET NAMES でSQLインジェクションに脆弱 | beginsprite log 上記は MySQL の例だが、単にコンソールから(管理者等が)直接アクセスするには問題ない機能でも Webアプリケーションでの設定方法としては不適切なことも多い。 このあたりは使用するDBMSによって異なるうえに、間違った情報も多いので特に注意する必要がある。