- PR -

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

投稿者投稿内容
お獅子
大ベテラン
会議室デビュー日: 2004/09/14
投稿数: 160
投稿日時: 2006-02-08 21:06
引用:

Jittaさんの書き込み (2006-02-08 21:00) より:
引用:

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

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


 そうでしたっけ?

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

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

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



Where句ではエラーになります。
ごく一部ですが、画面からの入力値をWhere句に使用してる所が有るので、対策は必要だと認識した所です。

DatatSetにセットしUpdateする分にはエラーとはなりません。
ここでも対策が必要なのか、今悩んでる所です。
お獅子
大ベテラン
会議室デビュー日: 2004/09/14
投稿数: 160
投稿日時: 2006-02-08 21:13
引用:

かるあさんの書き込み (2006-02-08 20:58) より:
ちなみに ['], [%], [_], [/], [;] などを入力されたときはどうしたいですか?
エラー?それともその値で検索 or 更新?



入力値をWhere句に使用している所では[']のみエラーとなります。
その他の文字はエラーになりません。
また、入力値を更新しているものは全てエラーになりません。
「myrow(列名)=画面で入力した値」
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-02-08 21:15
失礼しました。読み間違っていました。

引用:

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

DatatSetにセットしUpdateする分にはエラーとはなりません。
ここでも対策が必要なのか、今悩んでる所です。


 ブログに書いているように、「使われるところで特殊な文字はないか、調査する」必要があります。DataSet では特殊な文字がない、それだけのことです。

 ただし、DataTable.Select などを使うときには、特殊文字があります。これも、「特殊機能を回避する方法を調べ」、そのように実装します。要は、「使うときに対応する」です。がるの健忘録も読んでみてください。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-02-08 21:22
引用:

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

入力値をWhere句に使用している所では[']のみエラーとなります。
その他の文字はエラーになりません。
また、入力値を更新しているものは全てエラーになりません。
「myrow(列名)=画面で入力した値」



えーと
"where str_row2 like '" & str & "%" みたいなSQLがあったら
[%],[_] は期待しない値をかえしそうですよね

"where num_row1 = " & num & " みたいなSQLがあったとしたら
[;],[/] もへんな結果を出しそうですよね

とくに数字の検索のため ['] で囲っていなかったりした場合は
はいろんな SQL が試せそうですよね

引用:

かるあさんの書き込み (2006-02-08 20:58) より:
ちなみに ['], [%], [_], [/], [;] などを入力されたときはどうしたいですか?
エラー?それともその値で検索 or 更新?


書き方が悪かったかな・・・
SQLの文字列とみなされる文字列を受け取ったら
入力をエラーとしますか?
それともその値で 検索 or 更新 を行いますか?
お獅子
大ベテラン
会議室デビュー日: 2004/09/14
投稿数: 160
投稿日時: 2006-02-08 21:30
引用:

かるあさんの書き込み (2006-02-08 21:22) より:
書き方が悪かったかな・・・
SQLの文字列とみなされる文字列を受け取ったら
入力をエラーとしますか?
それともその値で 検索 or 更新 を行いますか?


失礼しました。
エラーとするか値で検索Or更新するかは、自分一人では判断できないので今後検討する事になると思いますが、個人的には入力した値で検索Or更新が出来れば良いですね。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-02-08 21:59
 SQL injection に関しては、Web アプリケーションだから、という問題ではありません。Windows アプリケーションでも発生します。

 ただ、「使う人」と「ダメージを受ける人」が、ほぼ同じだから問題になりにくいだけです。私がこの問題に気づかされたのは、10数年前、Windows アプリケーションを作っていたときです。

 で、イントラネットで使用と限定されているなら、とりあえず運用で逃げてもらうようにするのも、一つ。。。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-02-08 22:17
引用:

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

個人的には入力した値で検索Or更新が出来れば良いですね。



だとしたら、SqlParameterを使用したほうが楽な気がする
[']を検索したい場合次のように変わります。

コード:
sql = "select * from table where aaa = :value"
sql = "select * from table where aaa = '" & value & "'"



SqlParameter を使用する場合 ['] をパラメータに入れれば検索できます。
後者の場合 value という変数には ['] を [''] に置き換えて検索しなければなりません。
お獅子
大ベテラン
会議室デビュー日: 2004/09/14
投稿数: 160
投稿日時: 2006-02-08 22:30
引用:

かるあさんの書き込み (2006-02-08 22:17) より:

sql = "select * from table where aaa = :value"
sql = "select * from table where aaa = '" & value & "'"

SqlParameter を使用する場合 ['] をパラメータに入れれば検索できます。
後者の場合 value という変数には ['] を [''] に置き換えて検索しなければなりません。




ん〜なるほど。SELECTに関してはSqlParameterの方向で考える事にします。

UPDATEとDELETEはどうなるのでしょう?
何度も同じことを言って恐縮ですが、DateSetでのUPDATEも対策が必要なのか迷ってます。

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