我们正在运行在 IIS 7.5 上运行的 Silverlight 应用程序,使用表单身份验证来登录用户。我们有一个使用 RequiresAuthentication 保护的 RIA 服务,以及一个没有被保护的 ErrorHandlingService 和一个 LoggingService。
最近,我们似乎收到了对我们的 ErrorHandlingService 的请求的垃圾邮件 - 大约 50 pr。第二 - 在 IIS 日志中生成以下输出:
2013-10-01 11:19:12 xxx.xxx.xxx.xxx POST ...ErrorService.svc - 80 - xxx.xxx.xxx.xxx Mozilla/4.0+(兼容;+MSIE+8.0;+Windows+NT +6.1;+Trident/4.0;+SLCC2;+.NET+CLR+2.0.50727;+.NET+CLR+3.5.30729;+.NET+CLR+3.0.30729;+Media+Center+PC+6.0; +.NET4.0C;+.NET4.0E;+InfoPath.2;+MS-RTC+LM+8) 403 6 5 15
现在详细介绍一下设置:
ErrorHandlingService 有一个接受 Exception 包装类的方法,该方法会将异常信息记录到数据库中的表中,LoggingService 接受 LogMessage 和相同的异常包装并将消息记录到使用 NLog 文件。每当受保护的服务发生异常时,silverlight 客户端会先调用 ErrorHandlingService 记录该异常,然后再调用 LoggingService 将其记录到文件中。
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class ErrorHandlingService : IErrorHandlingService
{
public string RecordError(ExceptionTransport error)
{
if (error == null)
{
return null;
}
var hex = HandMadeException.CreateFrom(error);
var res = DiagnosticsHandler.DefaultInstance.HandleException(hex);
var fb = res.GetFeedBack(DatabaseSink.FeedBackEntryId);
var dbId = "";
if (fb != null)
{
dbId = fb.ToString();
}
return dbId;
}
}
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class LoggingService : ILoggingService
{
private static NLog.Logger _logger = NLog.LogManager.GetLogger("Trace");
public void LogError(LogMessage message, ExceptionTransport error)
{
string log = message.Message;
if (error != null)
{
log = string.Format("{0}: {1}", log, error.ToString());
}
switch (message.Level)
{
case LogLevel.Trace:
_logger.Trace(log);
break;
case LogLevel.Debug:
_logger.Debug(log);
break;
case LogLevel.Info:
_logger.Info(log);
break;
case LogLevel.Warning:
_logger.Warn(log);
break;
case LogLevel.Error:
_logger.Error(log);
break;
case LogLevel.Fatal:
_logger.Fatal(log);
break;
}
}
}
public class ErrorHandlingService : ErrorService, IErrorHandler
{
private LogHandlingService _loggingService = new LogHandlingService();
public ErrorHandlingService()
: base(WcfWebUtility.CreateFactory<IErrorHandlingService>("xxxxErrorHandlingService"))
{
}
public bool HandleError(Exception error)
{
base.RecordError(error, OnErrorRecorded, false);
}
private void LogError(Exception error, string errorId, bool showUserMessage)
{
_loggingService.Log(string.Format("Error '{0}' occured on Ecofleet v. '{1}' for user '{2}'", errorId, ProductVersion.GetEcofleetVersion(), AutologUser.Current), Autolog.DiagnosticsService.Logging.LogLevel.Error, error);
}
private void OnErrorRecorded(ErrorResult result)
{
bool showUserMessage = false;
if (result.UserState is bool)
{
showUserMessage = (bool)result.UserState;
}
LogError(result.ErrorRecorded, result.ErrorId, showUserMessage);
}
... Shortened for brevity
}
所以这就是正在发生的事情:
- 在 IIS 日志输出中,我们看到对 ErrorHandlingService 的大量请求,但对 LoggingService 没有。
- 没有任何内容输入到数据库中,表明错误参数为空。
- 该应用程序运行良好,没有用户抱怨错误。我希望任何用户都会收到 55 个错误。其次是联系支持部门,或者至少注销...
- 客户端 IP 地址似乎大部分时间都保持不变。
那么这可能是(恶意)攻击吗?或者可能是客户端版本差异(如果部署了新版本并且客户端没有下载它,它是否会针对新服务器运行旧客户端版本?)?或者是其他东西 ... ?