- PR -

ASP.Net Global.asaxのApplication_Errorでのログ出力

投稿者投稿内容
みつん
大ベテラン
会議室デビュー日: 2004/05/21
投稿数: 100
投稿日時: 2005-03-31 16:54
いつも参考にさせていただいております。

現在、.NET TIPS

[ASP.NET]アプリケーション内で発生したエラー情報をロギングするには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/168asperrlog/asperrlog.html
を参考にエラー時の処理を実装してみました。

protected void Application_Error(Object sender, EventArgs e)
{
StreamWriter objSw = new StreamWriter(Server.MapPath("/err.log"), true,Encoding.GetEncoding("Shift_JIS"));
// 最後に発生したエラー原因情報をExceptionオブジェクトとして取得
Exception objErr = Server.GetLastError().InnerException;
// 日付、ソース・コード、エラー・メッセージ、エラー原因となった
// メソッドをタブ区切りテキストで記録
StringBuilder objBld = new StringBuilder();
objBld.Append(DateTime.Now.ToString());
objBld.Append("\\t");
objBld.Append(objErr.Source);
objBld.Append("\\t");
objBld.Append(objErr.Message);
objBld.Append("\\t");
objBld.Append(objErr.TargetSite.ToString());
objSw.WriteLine(objBld.ToString());
objSw.Close();
}

これを起動し、エラーが発生させApplication_Errorの処理に移った時に、

StreamWriter objSw = new StreamWriter(Server.MapPath("/err.log"), true,Encoding.GetEncoding("Shift_JIS"));

にて、System.UnauthorizedAccessExceptionが発生します。
メッセージ:"パス /"c:/inetpub/wwwroot/err.log/" へのアクセスが拒否されました。"」

ファイルを事前に作成したり、フォルダのセキュリティにて、ASP.NETアカウントに権限を与えてもだめでした。
何かお気づきの点やヒントがありますでしょうか?
ぜひどなたかご教授お願いいたします。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2005-03-31 18:30
まずは、サンプルを変更せずに動くかを確認ですね。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2005-03-31 18:35
err.logの出力先にASP.NETの書き込み権限がないだけでは?
みつん
大ベテラン
会議室デビュー日: 2004/05/21
投稿数: 100
投稿日時: 2005-03-31 18:56
todoさん、burton999さん、早速のレスありがとうございます!

>まずは、サンプルを変更せずに動くかを確認ですね。

サンプルと違うところは出力先のパス名のみです。
サンプル("/netIns/err.log)⇒ ("/err.log")
最初はサンプルを自前のソースコードに
全てコピーし動作させましたがダメでした。

>err.logの出力先にASP.NETの書き込み権限がないだけでは?

err.logのプロパティにてASP.NETアカウントを追加しました。
err.logのプロパティ⇒セキュリティ⇒追加でよいでしょうか?
気になるのは追加をしてもアクセス許可の部分はグレーになっていて
変更ができなくなっているところです。
グレー状ですがチェックはついています。
もしかして見当違いでしょうか??

知識が乏しくお世話かけます・・・。
なにとぞよろしくお願いいたします。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-03-31 21:03
 エラーログを、外部からアクセスできるところにおくべきではありません。誰かが直接URLを記入して、err.logにアクセスして、それを見ると、アプリケーションにどんな脆弱性があるか、わかってしまいますよね。

#####
 ***で使用だから大丈夫、とかいわないでくださいね。

○そのサーバにアクセス出来るすべての人に悪意が全くない
○そのサーバにアクセス出来るすべての人に悪戯気が全くない
○そのサーバにアクセス出来るすべての人は、会社でのことを決して社外の人に話さない

などの条件がクリアできるなら、それでも大丈夫でしょうけど。
拡張子によっては、IISがブロックするかもしれませんが、それでもwwwroot$として共有されている場所ですし。
#####

 それで、偽装したりしていませんか?

_________________
みつん
大ベテラン
会議室デビュー日: 2004/05/21
投稿数: 100
投稿日時: 2005-04-01 11:16
Jittaさん、ありがとうございます。

確かにその通りですね。
このパスではどこからでもアクセスできてしまいます・・。

今はテスト中なんですが、ログ出力先をローカルのパスに変更すると
仮想ディレクトリではありません等のエラーメッセージがでました。
なかなかうまくいきませんが、もう少し色々やってみようと思います。

みなさま、アドバイスありがとうございました。
何かお気づきの点があればまたよろしくお願いいたします。

にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-04-01 12:43
引用:

ログ出力先をローカルのパスに変更すると
仮想ディレクトリではありません等のエラーメッセージがでました。


Server.MapPath を呼ばずに、直接ローカルのパスを書けばいいんじゃないでしょうか。
みつん
大ベテラン
会議室デビュー日: 2004/05/21
投稿数: 100
投稿日時: 2005-04-01 14:07
にしざきさん、ありがとうございます。

すいません。コードの説明をしていませんでした。
ローカルパス指定の時は、Server.MapPathは呼ばず、
直接フルパスを指定してみました。

説明不足で申し訳ございませんでした。

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