- PR -

ASP.NETにおけるXSS、SQLインジェクション対策

投稿者投稿内容
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-02-08 19:07
引用:

お獅子さんの書き込み (2006-02-08 18:24) より:
すみません。具体的な方法とかあれば教えて頂けませんか。


ここまで読んだところでは、入力チェックもまともにやっていないように思えます。
SQLインジェクションに対しては、多少手間がかかってもパラメータクエリを使うように
変更したほうが早いと思います。

引用:

取り合えず画面から入力した値をWhere句に使用している画面だけでもSqlParamaterを使用する方向で考ようと思います。



もしやるのであれば、既に書いたように「画面から入力」されないhiddenパラメータや
リンクに指定されるパラメータを含め、全リクエストパラメータに対して実施してください。
でないと意味がありません。

XSS対策としては、出力文字列に対してHtmlEncode/URLEncodeでサニタイジングすることで
通常は対応できます。画面数が多いと大変ですけどね。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-02-08 19:33
引用:

お獅子さんの書き込み(2006-02-08 14:44)より:

現在、データのSELECTは「SELECT * FROM TABLE WHERE CODE=" & 1」のような形でSQL文を作成し、FillメソッドでDateSetに取得し表示してます。更新の際はDataRowに値をセットしUPDATEメソッドを実行、削除の際はDataRowを削除しUPDATEメソッドを実行しています。それでもSqlParamaterを使用した方が良いのでしょうか?


「CODE=" & 1」って?
  このダブルクォーテーションは、何を意味していますか?
  & 1 は、何を意味していますか?

「それでも」って?
  DataRow 経由でやっているのだから、SQL Injection の対象にならない、とでも?
  とりあえずつくって、シングルクォーテーションを含む文字列を入力したらどうなるか、やってみれば?

「Where句の値が画面から入力される事はありません」って?
  でも、更新のための値は、画面から入力されますよね?そこは対象外ですか?
  「セカンドオーダー SQL インジェクション」は、調べましたか?これに使われる値は、直接はデータベースから持ってきた値ですよ。

「今更パラメタライズドクエリにするのは無理です。」
  パラメータを使わないなら、すべての“使用前”に、特殊文字を無効化するコードを挿入しなければなりません。同じことじゃないですか?
  別の言い方をすれば、設計からバグっています。設計まで戻って直さなければなりません。→じゃぁ、どうすりゃいいのさ

〆 written by Jitta on 2006/02/08

8レスしかついていない頃に書いたので、時代遅れな所もありますが、ご勘弁を。

[ メッセージ編集済み 編集者: Jitta 編集日時 2006-02-08 19:34 ]
Moo
大ベテラン
会議室デビュー日: 2004/04/12
投稿数: 118
お住まい・勤務地: 地球・港
投稿日時: 2006-02-08 19:43
皆さんが書いているように設計思想に問題がありそうですね。

プログラムは正常系が完成して5割(場合によってはそれ以下)
異常系が通ってはじめて完成するものだと思います。

・異常入力、・異常データ、・通信障害
もちろん故意・悪意によるものも考えられると思います。

このまま突き進んでいいのか、もう一度考え直すことをオススメします。

_________________
ASP/ASP.NETだいすき。 ASP++ by Moo http://moo-asp.net/
日記は ほぼ毎日更新中 http://d.hatena.ne.jp/aspx/
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-02-08 20:11
そういえば、SELECT文だけ問題にしているようですが、当然更新文でもSQLインジェクションの
対策は必要ですよ。その場合、WHERE句だけでなく、INSERT文やUPDATE文の設定値に埋め込ま
れる可能性もあります。

引用:

Mooさんの書き込み (2006-02-08 19:43) より:
皆さんが書いているように設計思想に問題がありそうですね。
このまま突き進んでいいのか、もう一度考え直すことをオススメします。


セキュリティ面を考慮せずに実装した後で、「そういえばXXXの対策はしているのか?」と
言われて慌ててる、という状況だと思います。インターネットに公開するWebサイトでの
セキュリティ対策は、小手先で対応できるものではないことだということですね。
お獅子
大ベテラン
会議室デビュー日: 2004/09/14
投稿数: 160
投稿日時: 2006-02-08 20:36
引用:

Jittaさんの書き込み (2006-02-08 19:33) より:
「CODE=" & 1」って?
  このダブルクォーテーションは、何を意味していますか?
  & 1 は、何を意味していますか?


失礼しました。

sql="SELECT * FROM TABLE WHERE CODE=" & 変数

Com = New OracleCommand(sql, OracleConnection)
ODA.SelectCommand = Com
ODA.Fill(DataSet, "TABLE")

って事が言いたかったのです。

引用:

「それでも」って?
  DataRow 経由でやっているのだから、SQL Injection の対象にならない、とでも?
  とりあえずつくって、シングルクォーテーションを含む文字列を入力したらどうなるか、やってみれば?



Where句に使用しないのであればシングルクォーテーションを入力してもエラーになりません。

引用:

「Where句の値が画面から入力される事はありません」って?
  でも、更新のための値は、画面から入力されますよね?そこは対象外ですか?
  「セカンドオーダー SQL インジェクション」は、調べましたか?これに使われる値は、直接はデータベースから持ってきた値ですよ。



なるほど。考えもしなかったです。
パラメタライズドクエリにする事によって解決できるのですか?

引用:

「今更パラメタライズドクエリにするのは無理です。」
  パラメータを使わないなら、すべての“使用前”に、特殊文字を無効化するコードを挿入しなければなりません。同じことじゃないですか?


画面から文字を入力できる項目も限られているので、何百と有るSQL文を全て直すよりは簡単かと思ったのですが、限定してパラメタライズドクエリに修正するのであれば可能です。

引用:

  別の言い方をすれば、設計からバグっています。設計まで戻って直さなければなりません。


ま、そういう事ですね。
そもそもWebシステムに関して素人の集まりで開発した為、Webの基本が全くありませんでした。クラサバのシステムと言う事もあって甘く見てました。
で、稼動直前になって色々と問題が出てきまして。
お獅子
大ベテラン
会議室デビュー日: 2004/09/14
投稿数: 160
投稿日時: 2006-02-08 20:41
引用:

クラサバのシステムと言う事もあって甘く見てました。


訂正:
イントラのシステムと言う事もあって甘く見てました。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-02-08 20:58
ちなみに ['], [%], [_], [/], [;] などを入力されたときはどうしたいですか?
エラー?それともその値で検索 or 更新?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-02-08 21:00
引用:

お獅子さんの書き込み (2006-02-08 20:36) より:

Where句に使用しないのであればシングルクォーテーションを入力してもエラーになりません。


 そうでしたっけ?

 単純に考えて、次のような SQL 文が出来ると思います。

SELECT * FROM table WHERE NAME = '入力'文字列'

エラーになると思いますけど?
# っつうか、SQL Injection の説明って、WHERE 句にはいる文字列で説明されているような?

スキルアップ/キャリアアップ(JOB@IT)