zoukankan      html  css  js  c++  java
  • 防护针对SQL Server数据库的SQL注入攻击

    SQL注入可能是最常见的攻击面向InternetSQL Server数据库的方法。即使你对网络和防火墙进行了防护,只要应用程序存在漏洞,那么依然存在受攻击的可能。微软已经注意到最近针对使用ASPASP.NET网站的攻击数量呈上升趋势。这不仅会导致数据的失窃和丢失,在近期的很多案例中数据库中还被攻击者加入恶意javascript代码,这导致访问网站的客户电脑也会因此感染病毒。

     

    防护针对您数据库的SQL注入攻击有如下的几种方法:

     

    1. 使用双引号

    使用双引号或其他符号替换您的用户的输入值。这种简单的预防措施能较为有效的防护相当多的SQL注入攻击。单引号经常被用于结束SQL表达式,使输入的内容获得不必要的权限。

    代码如下:

    string strSanitizedInput = strInput.Replace("'", "''");

     

    注意:请记住即使你已经替换了单引号,攻击者也有可能绕过这个防护措施。

     

    2. 避免动态SQL

    动态SQL是动态查询的很好的工具,但这也会暴露脆弱点。很多情况下可以使用其他SQL语句或存储过程来代替动态SQL。当然,如果您在存储过程中依然通过用户输入来建立动态SQL查询,那么只靠替换还是不安全的。

     

    较好的使用参数的SQL语句如下:

    Code

     

    使用procVerifyUser存储过程来验证用户是一种更好的方法:

     

    Code

     

    3. 验证所有的输入

    永远不要信任用户的输入。

    如果输入域中只能包含数字,那就需要验证用户输入的值是否只包含数字。如果允许输入字符,那么就需要检查是否有允许范围之外的字符。您的应用程序应该包含对诸如分号,等号,冒号,括号和SQL关键字的检查。.NET Framework提供常用的输入检查表达式来简化这个过程。限制用户输入的长度也是一种很好的方法。

    您可以使用下列代码来检查输入值限于4-12位的数字,字母和下划线:

    [\d_a-zA-Z]{4,12}

     

    4. 最低权限原则

    永远也不要在代码中用管理员级别权限的帐户来连接数据库。

    应用程序使用的帐户应该只拥有应用程序需要的最低级别的权限。这也能将已入侵者造成的破坏降低到最低限度。应用程序不能已sa或其他管理员帐号连接数据库,而且应定义使用的帐号能访问的范围。

     

    错误的使用系统管理员权限的代码如下:

    <add key="CodeBad"

    value="server=localhost;uid=sa;pwd=;database=northwind;" />

     

    有限制的正确代码如下:

    <add key="CodeGood"

    value="server=localhost;uid=NWindReader;pwd=utbbeesozg4d;

    database=northwind;" />

     

    5. 安全存储机密信息

    不要用明文存储机密信息。

    较好的替代方法是使用加密或散列密码。散列密码较加密密码更安全,这是因为它们不能被解密。你还可以在散列加密之前添加一些随机值来增加安全性。

    好的代码如下:

    Code

     

    加密的连接字符串在Web.Config中存储如下:

    <add key="CodeBest"

    value="AQAAANCMnd8BFdERjHoAwE/

    Cl+sBAAAAcWMZ8XhPz0O8jHcS1539LAQAAAACAAAAAAADZgAAqAAAABAAAABdodw0YhWfcC6+

    UjUUOiMwAAAAAASAAACgAAAAEAAAALPzjTRnAPt7/W8v38ikHL5IAAAAzctRyEcHxWkzxeqbq/

    V9ogaSqS4UxvKC9zmrXUoJ9mwrNZ/

    XZ9LgbfcDXIIAXm2DLRCGRHMtrZrp9yledz0n9kgP3b3s+

    X8wFAAAANmLu0UfOJdTc4WjlQQgmZElY7Z8"

    />

     

    6. 适当地处理异常

    在您所有的代码中加入异常处理,而且所有的异常应该提供最少量的信息。

    对于没有处理的异常,应该确保不能使攻击者获得有用的信息。可以通过设置Web.Config中的debug选项和设置CustomError的模式为"RemoteOnly"

    范例:

    <compilation defaultLanguage="c#"

        debug="false"

    />

     

    <customErrors mode="RemoteOnly"

    />

     

    辅助工具:

    微软也为管理员提供了几个辅助工具,用于检测,防护和识别可能的脆弱点。

     

    检测 - HP Scrawlr

    http://www.communities.hp.com/securitysoftware/blogs/spilabs/archive/2008/06/23/finding-sql-injection-with-scrawlr.aspx

     

    防护 UrlScan 3.0 Beta

    http://learn.iis.net/page.aspx/473/using-urlscan

     

    识别 Microsoft Source Code Analyzer for SQL Injection

    http://support.microsoft.com/kb/954476

     

    更详细的SQL Server最优防护实践信息可参考:

    "SQL Server 2005 Security Best Practices - Operational and Administrative Tasks"

    http://www.microsoft.com/technet/prodtechnol/sql/2005/sql2005secbestpract.mspx

     

    "How To - Protect from Injection Attacks in ASP.NET"

    http://msdn.microsoft.com/en-us/library/bb355989.aspx

     

    "How To - Protect from SQL Injection in ASP.NET"

    http://msdn.microsoft.com/en-us/library/ms998271.aspx

     

    "How To - Protect from Cross-Site Scripting in ASP.NET"

    http://msdn.microsoft.com/en-us/library/ms998274.aspx

     

    "Design Guidelines"

    http://msdn.microsoft.com/en-us/library/aa302420.aspx

     

    "Arch/Design Inspection"

    http://msdn.microsoft.com/en-us/library/aa302421.aspx

     

    "Microsoft Security Advisory"

    http://www.microsoft.com/technet/security/advisory/954462.mspx

  • 相关阅读:
    改进动物园
    异常动手脑总结
    代码大全2 阅读笔记
    抽象和接口
    Appium+python自动化2-启动百度app
    Appium+python自动化1-环境搭建
    python之图像识别
    python之栈和队列
    python之语音识别(speech模块)
    使用Python计算IP、TCP、UDP校验和
  • 原文地址:https://www.cnblogs.com/galaxyyao/p/1400419.html
Copyright © 2011-2022 走看看