HPのSQLインジェクション対策について。

プレースホルダを使わないで対策を行いたいのですが、

1.リテラル内のシングルクォートをエスケープする。
2.その際、addslashesを使わないでpg_escape_stringやmysql_real_escape_stringを使う
3.SJISをリテラルに含めない
4.リテラルはシングルクォートで囲む
5.DBの文字コードとプログラムの内部文字コードを合わせる

上記以外に注意することはありますか?

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2010/12/22 22:09:00
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:b-wind No.3

回答回数3344ベストアンサー獲得回数440

ポイント50pt

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によって異なるうえに、間違った情報も多いので特に注意する必要がある。

id:dedara

ありがとうございます。

set namesが危険というのはどこかで聞いたことがありましたが、よくわかりました。

2010/12/22 16:02:38

その他の回答3件)

id:tama213 No.1

回答回数486ベストアンサー獲得回数30

ポイント25pt

http://www.tokumaru.org/d/20080601.html

数値リテラルのチェックもしたほうがよいです。

数値リテラルが数値であるかどうかのチェックです。

id:dedara

チェックしたいと思います。

2010/12/22 12:42:49
id:asuka645 No.2

回答回数856ベストアンサー獲得回数97

ポイント25pt

PHP+MySQLという前提条件でしょうか?

各々のバージョンの指定はありませんか?


一般論としては、次のような注意点が挙げられます。

  1. 入力値をSQLに渡さない(例:入力値のバリデーションチェックを行う,O/Rマッピングを行う)
  2. エラー出力を抑制する(例:set_error_handler関数でエラー処理をトラッピングする)
  3. PHPのmysql固有関数を使わない→dbx関数を使うのが好ましい
  4. adminアカウントでDBにログインしない

参考「セキュア・プログラミング講座 Webアプリケーション編」(IPA)

id:dedara

dbx関数推奨というのは初耳です。何故でしょうか。

詳しくお聞きしたいです。

詳しく解説のあるサイトの紹介でもかまいません。

2010/12/22 12:41:05
id:b-wind No.3

回答回数3344ベストアンサー獲得回数440ここでベストアンサー

ポイント50pt

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によって異なるうえに、間違った情報も多いので特に注意する必要がある。

id:dedara

ありがとうございます。

set namesが危険というのはどこかで聞いたことがありましたが、よくわかりました。

2010/12/22 16:02:38
id:asuka645 No.4

回答回数856ベストアンサー獲得回数97

ポイント25pt

dbx関数推奨というのは初耳です。何故でしょうか。

PHPとRDBMSへのアクセスモジュールを切り離すのが目的です。

一般論として、PHPのバージョンアップとRDBMSのバージョンアップは足並みが揃っているわけではないので、dbx系関数でワンクッション置くようにします。

id:dedara

なるほど言われてみれば使ったほうが好ましそうですね。

情報が少ないのでいろいろ調べてみます。

2010/12/22 22:05:40

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません