- PR -

複数ファイルをアップロードする危険性について

1
投稿者投稿内容
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-03-13 17:19
ASP.NET(VB)で開発しております。

現在、クライアント側(ブラウザ)から複数のファイルをリストボックスで指定し、アップロードする処理を考えております。処理自体は、以下を参考にして、テストはOKでした。
http://www.gdncom.jp/general/bbs/ShowPost.aspx?PostID=26506

開発しているシステムはイントラで利用し、最大でも10個程度のファイルのアップロードになります。
運用としては、サーバ側ではSession変数で配列管理し、複数ファイルをサーバ側で取得後、Session変数を解放し、ファイルはDBに登録後に削除するつもりです。ファイルは、各クライアント毎に専用のフォルダを作成(サーバ側です)し、そこにアップロード。DB登録後は、フォルダ毎削除するようなイメージでいます。

上記ページでこのような処理は危険性を伴いますよ、という書き込みがあるのですが知識が乏しいため、どのように危険なのかがいまひとつ理解できません。メモリはSession変数さえ正しく解放すれば問題無い気がするのですが・・・
「危険」という文字がどうも引っかかっています。
本件の危険性について、お分かりになる方がいらっしゃれば教えていただきたいと思います。

よろしくお願い致します。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-03-13 18:24
引用:

ひろれいさんの書き込み (2006-03-13 17:19) より:
ASP.NET(VB)で開発しております。
上記ページでこのような処理は危険性を伴いますよ、という書き込みがあるのですが知識が乏しいため、どのように危険なのかがいまひとつ理解できません。メモリはSession変数さえ正しく解放すれば問題無い気がするのですが・・・


その開放すると言うのが難物なのですよ。

SessionStateModule.Endイベントで作業ファイルを削除するつもりでしょうか?ですがSessionStateModule.EndはInProc(WEBサーバーのメモリ上にせっジョン情報を保持する)でしか使えません。システムのスケールアップの為にStateServerやSQLServerを使いたくなっても出来ない事になります。

SessionStateModule.Endが発生するのはタイムアウトが発生したときです。テンポラリファイルはタイムアウトが発生するまで数十分間保持されることになります。悪意あるユーザーが意図的に負荷をかけると、あっという間にテンポラリが溢れる事になるかもしれません。

色々と制限&制約を加えたり、ASP.NET以外のプロセスと連携&監視したりする事で回避できるかもしれませんが、面倒で泥臭いシステムになってしまうと思いますよ。
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-03-15 09:25
甕星さん、おはようございます。
昨日は出張だったため、返事が遅れまして申し訳ありません。

引用:

甕星さんの書き込み (2006-03-13 18:24) より:

その開放すると言うのが難物なのですよ。

SessionStateModule.Endイベントで作業ファイルを削除するつもりでしょうか?ですがSessionStateModule.EndはInProc(WEBサーバーのメモリ上にせっジョン情報を保持する)でしか使えません。システムのスケールアップの為にStateServerやSQLServerを使いたくなっても出来ない事になります。

SessionStateModule.Endが発生するのはタイムアウトが発生したときです。テンポラリファイルはタイムアウトが発生するまで数十分間保持されることになります。悪意あるユーザーが意図的に負荷をかけると、あっという間にテンポラリが溢れる事になるかもしれません。

色々と制限&制約を加えたり、ASP.NET以外のプロセスと連携&監視したりする事で回避できるかもしれませんが、面倒で泥臭いシステムになってしまうと思いますよ。



確かに、インターネットやイントラでも不特定多数の人が使用するシステムであれば「悪意」が実行できないようにすべきだと思いますが、今回のシステムは特定できる10数名の人が利用するシステムのため、そこまで考慮する必要はないかな、と考えています。
考えが甘いですか?(この辺がよく分からないもので・・・)

セッションについてもよく分かっていないのですが、領域は動的に確保されるんですよね?
例えば、Session("TEST")=TextBox1 とした後に、Session("TEST")="" としても、最初に確保した領域は減らないのでしょうか?
であれば、確かにアプリの作りによっては特定の利用者でも問題となり得てしまいますね。
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-03-15 16:40
引用:

ひろれいさんの書き込み (2006-03-15 09:25) より:

セッションについてもよく分かっていないのですが、領域は動的に確保されるんですよね?
例えば、Session("TEST")=TextBox1 とした後に、Session("TEST")="" としても、最初に確保した領域は減らないのでしょうか?
であれば、確かにアプリの作りによっては特定の利用者でも問題となり得てしまいますね。



すいません。勉強してきました。
検索でうまくヒットさせることが出来なくて・・・

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=19387&forum=7

お騒がせしました。

#無言のプレッシャーがこわい(^^;)
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-03-15 21:12
引用:

ひろれいさんの書き込み(2006-03-15 09:25)より:

今回のシステムは特定できる10数名の人が利用するシステムのため、そこまで考慮する必要はないかな、と考えています。
考えが甘いですか?(この辺がよく分からないもので・・・)


 甘いかどうかは、このさき“ひろれいさんが”関わるシステムの内容によります。
 今のシステムと同規模、同環境のシステムに“しか”関わらないのであれば、特に問題は無いと思います。
 この先、もっと大きな、違う環境のシステムに“も”関わるのであれば、今から他の方法を考えておいて、損はないでしょう。

 「以前作ったことがある」と思うと、真似をしようと思うのではないでしょうか。その時作ったものが使えないと、結構ハマりますよ。


> #無言のプレッシャーがこわい
 そんなに深く考えることはないでしょう。
 ってか、本来 Web に時間はないですから。相手の時間にあわせるのが本来です。

[ メッセージ編集済み 編集者: Jitta 編集日時 2006-03-15 21:56 ]
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-03-16 08:56
Jittaさん、おはようございます。
引用:

Jittaさんの書き込み (2006-03-15 21:12) より:

 甘いかどうかは、このさき“ひろれいさんが”関わるシステムの内容によります。
 今のシステムと同規模、同環境のシステムに“しか”関わらないのであれば、特に問題は無いと思います。
 この先、もっと大きな、違う環境のシステムに“も”関わるのであれば、今から他の方法を考えておいて、損はないでしょう。


そうですね。1つの出来事についても色々な方策を知っていた方が、柔軟なシステムを作りやすいですね。ただ、「時間」という制約があることも事実でして(^^;)

限られた時間の中で、納期を厳守しつつ、いかに高品質なシステムを構築するか。しかも、会社にも決められた利益をもたらしつつ。そういった総合的な見地に基づいて考えると、今回は「悪意のある人間」を想定することは諦めようかな、と。
なにせ、今回初めて「.NET」でシステム構築していますので、分からないことばかりで(^^;)

引用:

 「以前作ったことがある」と思うと、真似をしようと思うのではないでしょうか。その時作ったものが使えないと、結構ハマりますよ。


十分承知しております。ただ、今回、こういった危険性について認識できただけでもプラスになると考えています。実装は、その時にハマるんでしょうけど・・・

引用:

> #無言のプレッシャーがこわい(^_^;))
 そんなに深く考えることはないでしょう。
 ってか、本来 Web に時間はないですから。相手の時間にあわせるのが本来です。


はい。ありがとうございます。
ただ、質問している側にしてみると、自分の質問が回答者なしで置いていかれるのは結構プレッシャーだったりもします(^^;)

「これくらいは自分で調べれるよ」という暗黙のプレッシャーかな、と要らぬ詮索をしてしまう始末で。ただ、おかげでキチンと調べられているのでこれでいいのかな、とも。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-03-17 00:24
#年度末進行で忙しいのさ〜

要は「Session("TEST")=""」って処理を何時どのタイミングで行う(行える)のかが問題なんですよ〜。
_________________
甕星 <mikahosi@abox9.so-net.ne.jp>
http://blogs.msmvp.jp/mikahosi/
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-03-17 08:57
引用:

甕星さんの書き込み (2006-03-17 00:24) より:

要は「Session("TEST")=""」って処理を何時どのタイミングで行う(行える)のかが問題なんですよ〜。



そうですね。
現状は、Page_Load の IsPostBack = False 時と、ページ内で処理が完結した(アップロード完了時)に、Session.Remove("TEST") を実行しています。

一応、リストに追加されたファイル数が10個を超えて追加しようとした場合はエラーとしていますが、裏技的にSession変数を膨大化させることも可能なんでしょうね。リロードとか。そう言えば、リロードの対応はまだしていません・・・
1

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