构建安全的数据访问-异常管理(八)

2023-05-16

异常条件可能会由配置错误、代码中的错误或恶意输入引起。如果没有正确的异常管理,这些条件可能会透露有关数据源位置和特性的敏感信息,以及有价值的连接详细信息。下面的建议适用于数据访问代码:

•捕获和记录 ADO.NET 异常。

•确保数据库连接总是处于断开状态。

•在 ASP.NET 应用程序中使用一般错误页面。

捕获和记录 ADO.NET 异常

将数据访问代码放在 try/catch 块中并处理异常。在编写 ADO.NET 数据访问代码时,由 ADO.NET 生成的异常类型取决于数据提供程序。例如:

•SQL Server .NET Framework 数据提供程序生成 SqlException

•OLE DB .NET Framework 数据提供程序生成 OleDbException

•ODBC .NET Framework 数据提供程序生成 OdbcException

捕获异常

下面的代码使用 SQL Server .NET Framework 数据提供程序,并显示应该如何捕获类型为 SqlException 的异常。


try
{
// 数据访问代码
}
catch (SqlException sqlex) // 比较具体
{
}
catch (Exception ex) // 比较一般
{
}  
记录异常

还应该记录来自 SqlException 类的详细信息。此类公开那些包含异常条件详细信息的属性。这些属性包括 Message 属性(用来描述错误)、Number 属性(用来唯一标识错误类型)以及 State 属性(其中包含其他信息)。State 属性通常用来指示特定错误条件出现的具体位置。例如,如果某个存储过程从多个行中生成同一错误,则 State 属性可以指出错误出现的具体位置。最后,Errors 集合中包含 SqlError 对象,这些对象提供详细的 SQL 服务器错误信息。

下面的代码片断显示了如何通过使用 SQL Server .NET Framework 数据提供程序来处理 SQL Server 错误条件:


using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;

// 由数据访问层 (DAL) 组件公开的方法
public string GetProductName( int ProductID )
{
SqlConnection conn = new SqlConnection(
"server=(local);Integrated Security=SSPI;database=products");
// 将所有的数据访问代码包含在 try 块中
try
  {
conn.Open();
SqlCommand cmd = new SqlCommand("LookupProductName", conn );
cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add("@ProductID", ProductID );
SqlParameter paramPN = 
cmd.Parameters.Add("@ProductName", SqlDbType.VarChar, 40 );
paramPN.Direction = ParameterDirection.Output;

cmd.ExecuteNonQuery();
// 在该方法返回之前先执行 finally 代码
return paramPN.Value.ToString();  
  }
catch (SqlException sqlex)
  {
// 处理数据访问异常条件
// 记录具体的异常详细信息
LogException(sqlex);
// 将当前异常包装在一个相关性更强的
// 外部异常中,并重新引发新异常
throw new Exception(
"Failed to retrieve product details for product ID: " + 
ProductID.ToString(), sqlex );
  }
finally
  {
conn.Close(); // 确保连接处于断开状态
  }
}

// Helper 例程,该例程将 SqlException 详细信息记录到
// 应用程序事件日志中
private void LogException( SqlException sqlex )
{
EventLog el = new EventLog();
el.Source = "CustomAppLog";
string strMessage;
strMessage = "Exception Number :" + sqlex.Number + 
"(" + sqlex.Message + ") has occurred";
el.WriteEntry( strMessage );

foreach (SqlError sqle in sqlex.Errors)
  {
strMessage = "Message:" + sqle.Message +
" Number:" + sqle.Number +
" Procedure:" + sqle.Procedure +
" Server:" + sqle.Server +
" Source:" + sqle.Source +
" State:" + sqle.State +
" Severity:" + sqle.Class +
" LineNumber:" + sqle.LineNumber;
el.WriteEntry( strMessage );
  }
}  
确保数据库连接总是处于断开状态

如果发生异常,一定要断开数据库连接,并释放其他所有受限制的资源。使用 finally 块或 C# using 语句,可以确保无论是否发生了异常条件,都会断开数据库连接。上面的代码阐释了 finally 块的用法。还可以按如下方式使用 C# using 语句:


using ((SqlConnection conn = new SqlConnection(connString)))
{
conn.Open();
// 在以下情况下将断开连接:生成异常或者控制流
// 通常会离开 using 语句的使用范围
}  
在 ASP.NET 应用程序中使用一般错误页面

如果您的数据访问代码由 ASP.NET Web 应用程序或 Web 服务调用,则应该对 <customErrors> 元素进行配置,以防异常详细信息传播回到最终用户。还可以通过使用该元素来指定一般错误页面,如下所示。


<customErrors mode="On" defaultRedirect="YourErrorPage.htm" />  

对于生产服务器设置 mode="On"。只有在发布之前开发和测试软件时才使用 mode="Off"。如果不这样做,将导致向最终用户返回大量错误信息(如图 14.4 中显示的信息)。这些信息可能包含数据库服务器的名称、数据库名称和连接凭据。

详细的异常信息会透露敏感数据

图 14.4
详细的异常信息会透露敏感数据

图 14.4 还显示了数据访问代码中接近导致异常的行的大量漏洞。特别是:

•连接字符串是硬编码的。

•特权极高的 sa 帐户用于连接到数据库。

sa 帐户有一个弱密码。

•SQL 命令的构造容易受到 SQL 注入攻击;输入内容未进行验证,代码不使用参数化存储过程。

转载于:https://www.cnblogs.com/lanchong/archive/2010/08/03/1791453.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

构建安全的数据访问-异常管理(八) 的相关文章

随机推荐

  • 1

    stage 1 xff1a 尝试直接使用Adobe acrobat xff0c foxit阅读器 xff0c 以及CAJ等PDF阅读器 xff0c 尝试使用CAJ是因为CAJ有文字识别功能 xff0c 但是对于加密的文档 xff0c 依然是
  • Python自动化备份系统及网站

    随着目前IT迅猛的发展 xff0c 自动化运维对于Linux运维人员也越来越重要 xff0c 传统的运维方式靠大量的人力 xff0c 现在也逐渐转向自动化运维 xff0c 我们常见的跟自动化有关的软件有哪些呢 今天我们来简单列举一下 xff
  • AI 黑箱难题怎么破?基于神经网络模型的算法使机器学习透明化

    编者按 xff1a 人们可以训练人工智能 xff08 AI xff09 和机器人完成任务 xff0c 但整个过程在黑箱中运作 我们并不知道 AI 和机器人是如何决策的 一家名为 OptimizingMind 的初创公司想要解决这个问题 这篇
  • 技术面试介绍

    内容 xff1a 1 技术面试的形式 2 技术面试的大致环节 3 技术面试应具备的素质 4 技术面试的经验建议 参考 xff1a 剑指offer 第二版 第一章 Java程序员面试笔试宝典 第一章 第二章 1 技术面试的形式 技术面试大致上
  • 今天是 Java 诞生日,Java 24 岁了!

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 今天是 Java 诞生日 xff0c Java 今年 24 岁了 xff0c 比栈长还年轻 还有得搞 xff0c 别慌 xff01 作为一名Java语言的学习者 xff0c
  • [原创]求两个经纬度之间的距离

    经常要根据两个经纬度值 求它们之间的距离 delphi实现代码 xff1a 求两个经纬度之间的距离 function Distince const lon1 lat1 lon2 lat2 double double var alpha1 a
  • cmake的命令execute_process

    execute process COMMAND lt cmd1 gt args1 COMMAND lt cmd2 gt args2 WORKING DIRECTORY lt directory gt TIMEOUT lt seconds g
  • php 输出数组内容_php数组怎么输出

    PHP数组的输出方式有两种 xff1a print r 函数和var dump 函数 1 print r 利用 print r 函数可以打印输出整个数组内容及结构 xff0c 按照一定格式显示键和元素 注意 print r 函数不仅是只用于
  • VNC常用操作及常见问题解决办法汇总

    VNC登录用户缺省是root xff0c 但在安装oracle时必须用oracle用户的身份登录 xff0c 下面我们就以oracle为例说明如何配置VNC xff0c 从而可以使用不同的用户登录到主机 步骤描述如下 xff1a 步骤一 x
  • Xsens 在ROS环境下读取数据

    Xsens 在ROS环境下读取数据 1 Xsens 参数配置2 Xsens ROS环境下读取数据2 1 安装ROS二进制包2 2 Xsens修改rule文件2 3 启动节点 参考资料 1 Xsens 参数配置 软件可以在官网上进行下载 1
  • 交换机***查询篇

    如何确定 类型 当设备遭受 时 xff0c 通常伴随着如下现象 xff1a 用户无法获取ARP 用户上线成功率较低 用户无法访问网络 l严重时可能导致设备上所有用户都无法正常访问网络 当大量用户或固定某个端口下的所有用户出现上述现象时 xf
  • tomcat部署war包访问显示404

    在eclipse导出的maven项目war包 xff0c 放到tomcat下启动 xff0c 顺利启动且无报错 xff0c 但是浏览器访问该项目时显示404 原因 xff1a 未在server xml中配置这几个项目 xff0c 导致服务器
  • Pycharm: 代码跳转如何回退 (小技巧)

    背景 玩Python已经有段时间了 一般都是通过vim和Pycharm来开发 真心觉得这两个是神器 Vim神器暂且不说 今天来分享Pycharm的一个小技巧 用Pycharm的童鞋都知道 它有个跳转的功能 可以让我们在想深入了解某个函数 库
  • 最近沉迷美女图片无法自拔,所以我决定用PHP扒海量妹子图

    为什么80 的码农都做不了架构师 xff1f gt gt gt 学习PHP 43 MySQL制作WEB应用有一阵子了 xff0c 没有上过学所以只能学习到CURD的地步 最近对国产美女图片 私房写真特别感兴趣 xff0c 什么周妍希 刘飞儿
  • elementui的loading啊。。。踩坑了。。。

    为什么80 的码农都做不了架构师 xff1f gt gt gt 总结如下 xff1a 1 elementui的loading其实是fullscreen才是全局唯一 xff0c 不然会Loading service一次创建一次实例 2 ele
  • a padding to disable MSIE and Chrome friendly error page 填充禁用MSIE铬友好的错误页面

    一个网页在用户登录后 xff0c 应该自动刷新后 xff0c 显示登录用户信息 xff0c 但是没有自动刷新反而报错 xff0c 手动刷新后显示正常 显示如下 xff1a 检查代码 xff1a 可能原因 xff1a 文件读写权限 权限和用户
  • 边缘检测:Canny算子,Sobel算子,Laplace算子

    1 canny算子 Canny边缘检测算子是John F Canny于 1986 年开发出来的一个多级边缘检测 算法 更为重要的是 Canny 创立了边缘检测计算理论 xff08 Computational theory ofedge de
  • ProtocolException : 已超过传入消息(65536)的最大消息大小配额。

    SilverLight调用WCF xff0c 提交的是一个List lt Linq2SqlEntity gt xff1b 当List中数据量不大的时候 xff0c 不会报错 xff1b 当数据量稍微大一点儿 xff0c 就会出现这个错误 发
  • 最简单的限制edit输入

    procedure TForm1 Edt NumKeyPress Sender TObject var Key Char begin If not key in 48 57 then begin key 61 0 ShowMessage 3
  • 构建安全的数据访问-异常管理(八)

    异常条件可能会由配置错误 代码中的错误或恶意输入引起 如果没有正确的异常管理 xff0c 这些条件可能会透露有关数据源位置和特性的敏感信息 xff0c 以及有价值的连接详细信息 下面的建议适用于数据访问代码 xff1a 捕获和记录 ADO