[PHP-users 14839]Re: GETのセキュリティ

kenbooit @ excite.co.jp kenbooit @ excite.co.jp
2003年 4月 24日 (木) 02:39:18 JST


Setoさん、草薙さん、レスありがとうございました。

一括読みの為、まだメールが届いていない為、
スレッド返信できませんがお許しください
(やり方あるのかな。)。

Seto さん、説明不足ですみません。
ブラウザURL欄に不正なID番号を入れて変更をしない限りは
普通に見えているプログラムです。

データベース内にIDが1、2、4、5、7、8・・・・・とあって、
http://www.example.com/example.php?ID=3
とすればエラーが出ます、という説明でした。

草薙さん

>単純に、そのIDでSELECTした結果のレコード数が0かどうかで判別してエラーを
>出すといった問題ではないのでしょうか?

そういえばたったこれだけでいいですね。
ありがとうございました。
助かりました。

ちなみに実際のプログラムではIDはhiddenにしてPOSTで渡しています。
なのでこの件に関して、何か問題があるというわけではありません。
こんな時にわざわざGETは使わなければいいだけの話なのですが、
ふと疑問に思ってしまったまでです。
・GETを使う時ってどんな時かな?
・みなさんどうしているのかな?
というような

>例えば
>	http://www.example.com/example.php?ID=5
>のようにIDを指定する場合、
>	$SQL = "SELECT * FROM testtable WHERE
ID=".$_POST["ID"];
>のようにSQL化し、そのままpg_query()なりに突っ込んでいると、
>	http://www.example.com/example.php?ID=5%3BDROP%20TABLE%20testtable
>等と指定されてしまった場合どんな動作になるでしょうか。

ちなみに
example.php?ID=5
は$_POST["ID"]には格納されないですよね。
でないと、register_globals=offって、全く意味がなくなってしまいますよね。
(でも出来るのかな?私の環境では再現しないです。)

$SQL = "SELECT * FROM testtable WHERE ID=".$_POST["ID"];
もあり得ないですよね。
これだと普通の値がフォームから来た時にエラーとなってしまいます。
(なる環境もあるのかな。こちらも間違っていたら申し訳ございません。)
SQLインジェクションの例としては

$SQL = "SELECT * FROM testtable WHERE ID =
".$_POST['ID']."";
フォームの入力値 => 10000';DELETE FROM testtable;SELECT '999

などでしょうか。

>GETであろうがPOSTであろうが、フォームの形式がプルダウンであってもチェッ
>クボックスであっても、簡単に偽装が可能です。
>プログラムへの入力データは全て汚染されていることを前提に考え、エラーがあ
>るデータを捨てるのではなく、面倒でも汚染されていると思われるデータの中か
>ら条件に合うデータのみを抽出するような処理を実装するべきです。
>敢えてきつめの言い方をさせて頂ければ、セキュリティに対する認識そのものが
>甘いのではないかと思います。

value値が1、2、3のフォームがあり、
1、2、3はデータベース内のテーブルで管理しているとします。
1が佐藤で、2が田中で、3が中村だとかいうように。
この状態でif文でvalue値が1あるいは2あるいは3でない時はエラーとした場合、
いくらフォームの値を偽装しようにも不正なデータは入れようがないと思うのですが。
(勿論SQLインジェクションなどへの対策は施してあるのが大前提です。)
これができてしまうとインターネット上でアプリケーションなんて全く公開できないような。

#ただプルダウンの数が多くなってしまった時、
#if文が偉い長くなってしまって面倒におもうのですが、
#何かいい手段はないでしょうか。
#pg_fetch_array あたりを使って皆さんやっているのではと
#足りない頭なりに考えているのですが・・・。
#いい方法があったら教えてください。
#それともテーブルの設計の時に、テクニックがあるのでしょうか。

データを汚染させてしまうのは仕方がなく必要なものだけ抽出する、というよりは
やっぱり汚染させないようにプログラム側で制御するというのがあくまで本流ではないかと。

勘違いしていたら申し訳ございません。
別にケチをつけているわけではございません。

ディスカッションの中で、よりよい知識を共有できればと考えています。
では、失礼します。


PHP-users メーリングリストの案内