zoukankan      html  css  js  c++  java
  • ADO.NET 安全编码指南 来自MSDN

    原文地址:http://msdn.microsoft.com/zh-cn/library/hdb58b2f(v=VS.80).aspx

    .NET Framework 提供多种有用的类和服务,使得开发人员能够编写安全的应用程序(请参见保证应用程序的安全)。安全编码概述概述了几种不同的代码设计方法,用这些方法设计的代码可以在 .NET Framework 安全系统上运行。还提供了到安全编码指南的链接,该指南中又包含到其他安全文章的链接。此外,在 ADO.NET 代码中必须遵守安全数据访问编码惯例,避免被潜在的攻击者利用。攻击者发起的与 ADO.NET 有关的常见攻击是使用 SQL 注入式攻击或从应用程序返回的异常中确定私有数据库信息。使用参数化命令和有效的异常处理可以解决该问题。

    防范 SQL 注入式攻击

    攻击者将其他 SQL 语句插入(即注入)在数据源或数据库服务器上处理的命令时,即发生 SQL 注入式攻击。这些命令不仅可以检索您的私有信息,还可以修改或破坏数据库服务器上的信息。只要注入的 SQL 语句在语法上正确的,就无法通过编程方式在服务器端检测到篡改的情况。因此,必须确保用户输入不会插入到已在执行的命令。遵守这些原则可以帮助您抵御 SQL 注入式攻击:

    • 始终在拥有最低特权的帐户下运行。

    • 始终验证来自外部源的所有用户输入。

    • 始终将列值作为参数而不是作为串联值传递。

    SQL 注入式攻击示例

    以下代码容易受到 SQL 注入式攻击,因为代码接受任何来自 TextBox 控件的用户输入,并将其与 Transact-SQL 语句串联在一起,将串联后的字符串提交给 SQL Server 进行处理。只要串联后的 Transact-SQL 语句在语法上是正确的,并且调用者具有相应的权限,SQL Server 就会处理该命令。如果使用字符串串联,攻击者就可以利用您的应用程序输入数据,这些数据可以在服务器上执行意想不到的命令。

    // Retrieve CustomerID to search for.
    string ID =TextBox1.Text;
    
    // The following line of code allows for SQL injection attack.
    string query = 
        "SELECT * FROM dbo.Orders WHERE CustomerID = '" + ID + "';"
    
    // Code connecting to a data source has been omitted for brevity.
    SqlCommand cmd = new SqlCommand(query, connection);
    SqlDataReader reader = cmd.ExecuteReader();
    reader.Close();
    

    在这种情况下,潜在的攻击者可以对 CustomerID 输入“ABCD';DELETE FROM Orders;--”值,其中 ABCD 是预期的 WHERE 子句的有效值。ABCD 之后的单引号结束了所需查询的 WHERE 子句,分号分隔第一个命令的结尾。DELETE FROM 语句开始了一个新命令,代表 SQL 注入式攻击。双连字符字符序列 (--) 通知 SQL Server 后面的所有内容都是注释,应忽略,所以,在原始代码中串联的右单引号和分号 (+ "';") 不会生成语法错误。服务器将处理以下字符串,该字符串由两个独立的命令组成:

    SELECT * FROM dbo.Orders WHERE CustomerID = 'ABCD';DELETE FROM Orders;--'
    

    SQL Server 处理第一个命令时,将在 Orders 表中选择匹配的记录。处理第二个命令时,将删除 Orders 表中的所有记录。

    SQL 注入式攻击可以包括用于删除表或在服务器上执行其他命令的语法。损害的范围取决于为调用进程授予的权限。要能够使用字符串串联,需要授予对表的 SELECT 权限,这样,所有数据都将暴露给攻击者。

    使用参数化命令

    参数提供了一种方便的方法来组织随 Transact-SQL 语句传递的值以及向存储过程传递的值。另外,通过确保从外部源接收的值仅作为值传递,而不是作为 Transact-SQL 语句的一部分传递,可以防止参数受到 SQL 注入式攻击。因此,在数据源处不会执行插入到值中的 Transact-SQL 命令。相反,只会将这些命令作为参数值来计算。有关验证存储过程中的用户输入的更多信息,请参见验证用户输入

    以下代码显示了使用参数传递值的一个示例。该参数定义为大小为 5 个字符,所以,在参数添加到命令中时,如果 TextBox 控件中提交的字符串值超过 5 个字符,将引发异常。但是,即使大小足以接受恶意的 Transact-SQL 片断,该片断也只是作为值的一部分对待,而不会作为可执行的 Transact-SQL 代码对待。在此示例中,为了保持代码的简洁,省略了异常处理部分。有关更多信息,请参见本主题后面的 。

    // Retrieve CustomerID to search for.
    string ID = TextBox1.Text;
    
    string queryString = "SELECT * FROM Orders WHERE CustomerID = @CustomerID";
    
    SqlCommand cmd = new SqlCommand(queryString, conn);
    cmd.Parameters.Add("@CustomerID", SqlDbType.VarChar, 5).Value = ID;
    
    // Code connecting to a data source has been omitted for brevity.
    SqlDataReader reader = cmd.ExecuteReader();
    ' Process results.
    reader.Close();
    
  • 相关阅读:
    Python+selenium之调用JavaScript
    Python+selenium 之操作Cookie
    Python+selenium整合自动发邮件功能
    Python之查询最新的文件
    jQuery之回调对象
    jQuery之XML的加载和解析
    jQuery之DOM属性
    jQuery之Ajax--快捷方法
    jQuery之Ajax--底层接口
    jQuery之Ajax--辅助函数
  • 原文地址:https://www.cnblogs.com/herbert/p/1773875.html
Copyright © 2011-2022 走看看