ようこそ!逆襲のニートブログへ

ブログ内検索

最近の記事

はてなブックマーク数

この日記のはてなブックマーク数

カテゴリー

月別アーカイブ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

SQLインジェクション対策

SQLインジェクションについて、朝っぱらから調べた。

ユーザーの入力値をSQL文の一部に入れる場合、SQL文が意図せぬ形にならないように、ユーザーの入力値を加工する必要がある。
=ユーザーの入力値を未加工のまま使うのはダメ。

PHP マニュアル > mysql_real_escape_string
サンプルコードにあったユーザー定義関数 function quote_smart($value) を使えばいいだろう。

【MySQLウォッチ】第27回 MySQL 5.0 および 4.1 にSQLインジェクションのセキュリティ・ホール
PHPのmysql_real_escape_string()関数は、MySQLのmysql_real_escape_string()関数をコール(呼び出し)しているが、元々のMySQLのmysql_real_escape_string()関数自体にバグがあり、SQLインジェクション対応が不十分だったようだ。

■PHP 利用時に Shift_JIS で addslashes() によるエスケープ処理に SQL インジェクション可能な穴

結論から言うと、Shift_JISを素直に使っている限り、addslashes()は駄目(Chris Shiflett氏)、mysql_real_escape_string() は駄目(Ilia Alshanetsky氏)、一部のPrepared Statements すらも駄目(id:jrofbyrsさん)、ということらしいです。


安全な対処方法としては Shift_JIS などの文字の最後のバイトに \ が含まれる可能性のある文字コードを使用しないことです。



1.addslashes()→不十分
2.mysql_real_escape_string()→不十分
3.Prepared Statements→不十分
4.SJISを使わない→OK
ということのようだ。

最近は、EUC-JPよりUTF8を使う機会が多いような気がする。
・UTF8はエンコードの仕組の都合で、EUC-JPよりデータ量が割り増しになるんだったよな?
・携帯用のページは、UTF8→SJISに変換すればOKかな?

addslashes() による SQL 文字列のエスケープ回避問題
↑Shift_JISの場合のSQLインジェクションについて解説してある。

yohgaki's blog addslashesによるエスケープ処理は止めましょう
↑PostgreSQLの場合の話が出ていた。

あと、ご指摘通り、pg_prepare() と pg_execute() によるプリペアードクエリでは問題ありませんでした(文字コードが SJIS の場合でも SQL インジェクションを起こせない)。

PHP 側でこれらの関数が導入されたのは PHP 5.1.0 以降のようですので、それより前のバージョンでは文字コードに SJIS を使用しないようにするしかないように思います。



PREPAREしとけ、ということかな?


IPA セキュア・プログラミング講座 SQL組み立て時の引数チェック
DBIクイックリファレンス Perl-DBI講座
↑プレースホルダ、バインドメカニズムの復習をしておこう。

SELECT f2 FROM table WHERE f1 = ?

上記で使用したクエスチョン( ? )マークをプレースホルダと呼びます。
プレースホルダは、そのままでは値を持っていないので、後で実際の値を結びつけます。
参照される値をバインド値、実際の値との結びつけをバインドと呼びます。



時代は O/R マッピングなのだけどプレースホルダを復習
ユーザーの入力値を加工するのは機械にやらせればいい、ということで、SQL文を安全にするためのDBラッパーが用意されているようだ。
最初からそれを使えば面倒くさくなさそうだ。
(中身がブラックボックスで見えないのが気に入らないなら、コードを読むしかない。)

「サニタイズ言うな」の高木さんのブログにも、エスケープの話がある。
教えて!goo > HTMLに出力するときには、htmlspecialcharsします。
うわ!もう8時やんけ!
関連記事

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURL:
http://gooddays1.blog37.fc2.com/tb.php/229-f45e6166

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。