プレースホルダを使わないで対策を行いたいのですが、
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 などの関数はそのほかの注意すべき文字も含めてトータルで問題ない形に変換するための関数。
基本的にはこれらのエスケープ関数に任せておけば最悪文法エラーになる程度で脆弱性になることは少ないが、
前提条件として、「文字コード設定」がきちんと行われていることが前提になる。
MySQL SET NAMES でSQLインジェクションに脆弱 | beginsprite log
上記は MySQL の例だが、単にコンソールから(管理者等が)直接アクセスするには問題ない機能でも
Webアプリケーションでの設定方法としては不適切なことも多い。
このあたりは使用するDBMSによって異なるうえに、間違った情報も多いので特に注意する必要がある。
チェックしたいと思います。
PHP+MySQLという前提条件でしょうか?
各々のバージョンの指定はありませんか?
一般論としては、次のような注意点が挙げられます。
参考「セキュア・プログラミング講座 Webアプリケーション編」(IPA)
dbx関数推奨というのは初耳です。何故でしょうか。
詳しくお聞きしたいです。
詳しく解説のあるサイトの紹介でもかまいません。
1.リテラル内のシングルクォートをエスケープする。
2.その際、addslashesを使わないでpg_escape_stringやmysql_real_escape_stringを使う
気をつけなければいけない文字はシングルクオートだけではない。
mysql_real_escape_string などの関数はそのほかの注意すべき文字も含めてトータルで問題ない形に変換するための関数。
基本的にはこれらのエスケープ関数に任せておけば最悪文法エラーになる程度で脆弱性になることは少ないが、
前提条件として、「文字コード設定」がきちんと行われていることが前提になる。
MySQL SET NAMES でSQLインジェクションに脆弱 | beginsprite log
上記は MySQL の例だが、単にコンソールから(管理者等が)直接アクセスするには問題ない機能でも
Webアプリケーションでの設定方法としては不適切なことも多い。
このあたりは使用するDBMSによって異なるうえに、間違った情報も多いので特に注意する必要がある。
ありがとうございます。
set namesが危険というのはどこかで聞いたことがありましたが、よくわかりました。
dbx関数推奨というのは初耳です。何故でしょうか。
PHPとRDBMSへのアクセスモジュールを切り離すのが目的です。
一般論として、PHPのバージョンアップとRDBMSのバージョンアップは足並みが揃っているわけではないので、dbx系関数でワンクッション置くようにします。
なるほど言われてみれば使ったほうが好ましそうですね。
情報が少ないのでいろいろ調べてみます。
ありがとうございます。
set namesが危険というのはどこかで聞いたことがありましたが、よくわかりました。