• ASP.NET入门之数据库访问


    从 Web 应用程序访问 SQL Server
    当 Web 应用程序涉及数据库访问时,它必须向 SQL Server 提供凭据(即它必须登录到 SQL Server),就像任何其他用户或进程一样。在 Web 应用程序中,这样会使问题复杂化。例如,如果 Web 应用程序以匿名方式运行,则可能没有要传递到 SQL Server 的凭据。为 Web 应用程序设计 SQL Server 访问的方法有多种。您选择什么样的策略,取决于您的计算机是如何配置的以及您是否在 Intranet 上。最简单的选择有:

    使用 Windows 集成安全性。此选择将用户的凭据传递到 SQL Server。由于委托问题,这样做是切实可行的,条件是 SQL Server 和 IIS 位于同一台计算机上,而且用户必须与 Web 服务器计算机位于同一域中。

    使用 Windows 集成安全性访问 SQL Server如果您的应用程序运行在基于 Windows 的 Intranet 上,则也许可以将 Windows 集成安全性用于数据库访问。集成安全性要求:

    SQL Server 与 IIS 在同一台计算机上运行。
    所有应用程序和用户位于同一域中,以便其凭据可由 Web 服务器使用。(也就是说,对于公共 Web 站点,Windows 集成安全性是不可行的。)
    注意   如果 SQL Server 和 IIS 不在同一台计算机上,则请使用其他访问方法。有关详细信息,请参见使用显式凭据访问 SQL Server 和使用映射的 Windows 域用户访问 SQL Server。
    若要使用 Windows 集成安全性访问 SQL Server,则需要配置应用程序的以下四个不同方面:

    IIS
    应用程序配置文件 (Web.config)
    连接字符串
    SQL Server 本身
    配置 IIS
    您需要在 IIS 中将应用程序配置为禁用匿名访问并启用 Windows 身份验证。

    为 Windows 集成安全性配置 IIS

    在 Windows 中,打开“Internet 信息服务”管理工具。
    在 Windows 2000 中,单击“开始”菜单,依次指向“程序”、“管理工具”,然后单击“Internet 服务管理器”,即可打开该工具。
    在 Windows XP 中,从“控制面板”中的“管理工具”中可打开该工具。
    打开服务器的节点,然后继续打开节点,直到找到您的应用程序的节点(通常在“默认 Web 站点”之下)。
    右击您的应用程序,然后选择“属性”。
    在“目录安全性”选项卡中,单击“编辑”。
    在“验证方法”对话框中,清除“匿名访问”框并确保选中“集成 Windows 身份验证”。
    单击“确定”关闭所有对话框。
    配置 Web.config 文件
    在应用程序配置文件 (Web.config) 中,您可以建立应用程序使用的身份验证模式,并建立应用程序将模拟用户凭据(即该应用程序将以这名用户的身份运行)的模式?

    配置 Web.config 以允许 Windows 集成安全性

    打开应用程序的 Web.config 文件并向其添加以下元素:
    <authentication mode="Windows" />
    <identity impersonate="true"/>
    <authentication> 元素可能已经存在。

    注意   Web.config 中的元素区分大小写。
    创建连接字符串
    在创建连接字符串以访问 SQL Server 时,您必须包含通知 SQL Server 您正在使用 Windows 集成安全性的属性。

    为 Windows 集成安全性配置连接字符串

    在 SQL Server 的任何连接字符串中,包含属性 Trusted_Connection=Yes 并移除用户名和密码属性。
    下面显示的是一个为 Windows 集成安全性配置的典型连接字符串:

    "workstation id=WebServer1;packet size=4096;
    Trusted_Connection=Yes;data source=mySqlServers";
    persist security info=False;initial catalog=northwind"
    配置 SQL Server
    您必须将 SQL Server 设置为可以识别将访问它的用户。

    为 Windows 集成安全性配置 SQL Server

    从 Windows 的“开始”菜单中,选择“Microsoft SQL Server”,然后选择“企业管理器”。
    打开服务器的节点,并展开希望将其权限授予用户的数据库的节点。
    右击“用户”节点,并选择“数据库用户”。
    在“数据库用户属性”对话框中,在“登录名”框中输入“域\用户名”,然后单击“确定”。或者,将 SQL Server 配置为允许所有域用户访问数据库。
    作为本地 ASPNET 或 NETWORK SERVICE 进程(应用程序中 Web 应用程序的默认用户标识)访问 SQL Server。此选项非常适合于匿名访问,但只有在 SQL Server 与 Web 服务器在同一台计算机时才起作用。以本地用户身份访问 SQL Server当 ASP.NET 应用程序运行时,默认情况下它运行在名为 ASPNET(在 Windows 2000 和 Windows XP 中)或 NETWORK SERVICE(在 Windows Server 2003 中)的特殊本地用户的上下文中。此用户帐户具有的权限恰好足以在 Web 服务器计算机上运行应用程序。

    如果 SQL Server 和 Web 服务器位于同一台计算机上,则可以将 ASPNET 或 NETWORK SERVICE 用户定义为 SQL Server 上的用户。

    此方法的优点在于它是安全的,因为 Web 应用程序在有限的安全性上下文内运行。与 SQL Server 一起使用单个用户名也是高效的,因为这使 SQL Server 可以利用连接池增强应用程序的可伸缩性。

    授予 ASPNET 或 NETWORK SERVICE 用户 SQL Server 权限

    从 Windows 的“开始”菜单中,选择“Microsoft SQL Server”,然后选择“企业管理器”。
    打开服务器的节点,并展开希望将其权限授予用户的数据库的节点。
    右击“用户”节点,并选择“数据库用户”。
    在“数据库用户属性”对话框中,在“登录名”框中输入“计算机名\ASPNET”,然后单击“确定”。
    将 Web 应用程序进程映射到 Windows 域用户,然后以该用户身份登录到数据库。如果 SQL Server 与 Web 服务器位于不同的计算机上,此选择非常适合于匿名访问。使用映射的 Windows 域用户访问 SQL Server默认情况下,ASP.NET 应用程序运行在名为 ASPNET(在 Windows 2000 和 Windows XP 中)或 NETWORK SERVICE(在 Windows Server 2003 中)的本地用户的上下文中。这些用户帐户具有有限的权限。但是,ASPNET 或 NETWORK SERVICE 用户是 Web 服务器计算机的本地用户,因此未被识别为远程计算机上的用户。要避开此限制,您可以让应用程序在 Windows 域用户(Web 服务器计算机和 SQL Server 计算机都可以识别它)的上下文中运行。

    将您的应用程序进程映射到 Windows 域用户要求您配置以下进程:

    Web 服务器计算机    您必须确保指定的 Windows 域用户具有足够的特权(但没有多余的特权)运行 Web 应用程序。
    您的应用程序   您需要配置 Web.config 文件以指定 ASP.NET 使用集成安全性,这样 ASP.NET 就可以识别映射的用户名。
    注意   有关 machine.config 和 Web.config 文件的信息,请参见 ASP.NET 配置。
    连接字符串   在为应用程序中的连接对象创建连接字符串时,您需要指定它们将使用集成安全性。
    SQL Server   您需要将指定的域用户作为 SQL Server 登录用户进行添加。
    在 Web 服务器计算机上配置用户
    为 Windows 域用户设置用户权限

    使用 Web 服务器计算机上的 Windows 管理工具,确保映射的 Windows 域用户具有所需的特权。有关详细信息,请参见 ASP.NET 必需的访问控制列表 (ACL)。
    映射到 Windows 用户并启用模拟
    在为 ASPNET 或 NETWORK SERVICE 用户帐户和映射到的用户建立正确权限之后,配置应用程序以模拟该用户。

    为集成安全性配置 Web 应用程序

    打开应用程序的 Web.config 文件并添加以下元素:
    <authentication mode="Windows" />
    <identity impersonate="true" userName="domain\username" password="password"/>
    <authentication> 元素可能已经存在。

    注意   Web.config 中的元素区分大小写。
    在连接字符串中使用 Windows 安全性
    最后,在为数据库访问创建连接字符串之后,请配置它们以使用 Windows 集成安全性。

    在连接字符串中使用 Windows 安全性

    在为应用程序创建连接字符串时,不要包含用户名和密码。相反,将连接字符串的 Integrated Security 属性设置为 SSPI。
    以下示例显示包含适当属性的连接字符串:

    data source=myserver;initial catalog=northwind;Integrated Security=SSPI
    为集成安全性配置 SQL Server

    从 Windows 的“开始”菜单中,选择“Microsoft SQL Server”,然后选择“企业管理器”。
    打开服务器的节点,并展开希望将其权限授予用户的数据库的节点。
    右击“用户”节点,并选择“数据库用户”。
    在“数据库用户属性”对话框中,在“登录名”框中输入“域\用户名”,然后单击“确定”。
    在连接字符串中传递显式用户名和密码。如果您可以提示用户输入凭据,则此选择是切实可行的,但是其安全性可能低于其他选择。您也可以将其作为映射到 Windows 域用户的更容易实现的替代选择。使用显式凭据访问 SQL Server连接到 SQL Server 的可靠方法是在连接字符串中传递用户名和密码。您可以以不同的方式使用此策略:

    提示用户输入用户名和密码。
    使用预设的用户名和密码。
    安全说明   使用连接字符串访问 SQL Server 不如使用集成安全性安全。仅当在您的应用程序中使用集成安全性不可行时,才与显式凭据一起使用连接字符串。
    提示输入凭据
    您可以提示用户输入用户名和密码(例如,使用 Forms 身份验证),然后在连接字符串中将凭据传递到 SQL Server。提示输入凭据具有几个缺点。它要求 SQL Server 分别识别每个用户。而且,它对于连接池也是低效的,因此会限制可伸缩性。有关 Forms 身份验证的示例,请参见简单 Forms 身份验证。

    安全说明   在应用程序中提示用户输入用户名和密码是一种潜在的安全威胁。凭据信息必须从浏览器传输到服务器上,而普通的 HTTP 传输未加密。为了获得最佳安全性,在应用程序中提示用户提供凭据时,应使用安全套接字层 (SSL),它在将信息从浏览器发送到服务器之前,对其进行加密。有关如何实现 SSL 的详细信息,请参见 Microsoft 知识库文章 Q307267HOW TO:Windows 2000 中带有安全套接字层的安全 XML Web services。
    在连接字符串中动态地传递显式用户名

    在获取用户的名称和密码之后,以代码形式将它们串联到连接字符串中,然后将它们分配给连接对象的 ConnectionString 属性。
    安全说明   您应该确保用户名和密码不包含恶意内容。以下示例说明做到这一点的一种方法。有关更多信息,请参见脚本利用。
    以下示例显示如何动态地创建连接字符串。假定用户名和密码在文本框中是可用的。用一个函数筛选用户输入,以确保它仅包含预设的字符。

    提示   如果您熟悉正则表达式的使用,则可以创建此筛选器的更高效版本。有关详细信息,请参见正则表达式类。
    ' Visual Basic
    Private Function ValidateInput(ByVal validchars As String, _
            ByVal userinput As String) As Boolean
        Dim c As Char
        For Each c In userinput
            If validchars.IndexOf(c) < 0 Then
                Return False
            End If
        Next
        Return True
    End Function

    Private Sub OpenDatabase()
        Dim vChars As String = _
            "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz*&%$#!"
        Dim userid As String
        Dim password As String
        If ValidateInput(vChars, UserName.Text) Then
            userid = UserName.Text
        Else
            Throw New System.Exception("Invalid user name.")
        End If
        If ValidateInput(vChars, PasswordText.Text) Then
            password = PasswordText.Text
        Else
            Throw New System.Exception("Invalid password.")
        End If
        Dim connectionString As String
        connectionString =  "data source=myserver"
        connectionString &= ";initial catalog=northwind"
        connectionString &= ";user id=" & userid
        connectionString &= ";password=" & password
        SqlConnection1.ConnectionString = connectionString
        SqlConnection1.Open()
        ' Further code to work with the database
    End Sub

    // C#
    private Boolean ValidateInput(String validchars, String userinput)
    {
        foreach(Char c in userinput)
        {
            if(validchars.IndexOf(c) < 0)
            {
                return false;
            }
        }
        return true;
    }

    private void OpenDatabase()
    {
        String vChars =
           "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz*&%$#!";
        String userid;
        String password;
        if(ValidateInput(vChars, UserName.Text))
        {
            userid = UserName.Text;
        }
        else
        {
            throw new System.Exception("Invalid user name.");
        }
        if(ValidateInput(vChars, PasswordText.Text))
        {
            password = PasswordText.Text;
        }
        else
        {
            throw new System.Exception("Invalid password.");
        }
        String connectionString;
        connectionString =  "data source=myserver";
        connectionString += ";initial catalog=northwind";
        connectionString += ";user id=" + userid;
                connectionString += ";password=" + password;
        sqlConnection1.ConnectionString = connectionString;
        sqlConnection1.Open();
        // Further code to work with the database
    }
    使用预设的凭据
    如果没有提示您输入凭据,则可以使用预设的用户名和密码。推荐的方法是将预设的用户名和密码存储在服务器上,然后在运行时读取它并将它添加到连接字符串。此技术的优点是:您的应用程序可以根据它需要在数据库中执行的操作,在不同情况下使用不同的凭据访问数据库。

    安全说明   决不将凭据以字符串形式硬编码到您应用程序的程序中。能够访问代码文件(甚至是已编译的代码)的任何人员,都将能够获取凭据。
    安全说明   始终将资源的最少访问特权给予预设用户名。决不使用“sa”或任何其他管理级别的用户名。始终使用密码。
    您可以将凭据存储在各种不同的位置。两个选项是:

    在 Web.config 文件中。这使与应用程序一起部署配置信息变得很容易。虽然配置文件与 ASP.NET 应用程序存储在同一目录中,但是 ASP.NET 可以防止客户端直接访问扩展名为 .config 的文件。为了获得额外的安全性,您可以设置配置文件的 NTFS 文件系统权限并对该文件内的连接字符串进行加密。
    在 Windows 注册表中,作为自定义子项。凭据没有存储在可通过 Web 访问的目录中,这样可以降低字符串的潜在可视性。但是,此方法使部署更复杂,因为安装应用程序要求更改目标计算机的注册表。为了获得额外的安全性,您可以使用访问控制列表 (ACL) 限制对注册表子项的访问并对子项内的连接字符串进行加密。
    注意   有关存储数据库凭据的进一步信息,请参见数据库安全性。
    如果您确实将凭据作为应用程序的一部分进行存储,则应该尝试通过加密来保护它们。一种可能性是使用“数据保护 API”(DPAPI)。有关详细信息,请参见 MSDN 技术文章“Windows 数据保护”。

    在 Web.config 中存储凭据

    在 Web.config 文件中,在 <appSettings> 元素中创建一个新的 <add> 关键字。<appSettings> 元素必须作为 <configuration> 元素的子元素出现。有关详细信息,请参见配置节架构。
    以下示例说明包含标记为“mappedname”和“mappedkey”的用户名和密码的 <add> 关键字。

    提示   在应用程序中最好不使用字符串“password”和“user name”(或“username”),这样,搜索这些词的恶意用户就找不到它们。
    <appSettings>
       <add key="mappedname" value="MyWebAppUser"/>
       <add key="mappedkey" value="Aje$31"/>
    </appSettings>
    在您的应用程序中,从 System.Configuration.ConfigurationSettings 类的静态 AppSettings 属性读取凭据。
    以下示例显示如何在运行时读取凭据并将它们串联到连接字符串中:

    ' Visual Basic
    Dim connectionString As String
    Dim user As String = System.Configuration.ConfigurationSettings. _
        AppSettings("mappedname")
    Dim pass As String = System.Configuration.ConfigurationSettings. _
        AppSettings("mappedkey")
    connectionString =  "data source=myserver;initial catalog=northwind"
    connectionString &= ";user id=" & user
    connectionString &= ";password=" & pass
    SqlConnection1.ConnectionString = connectionString

    // C#
    String connectionString;
    String user = System.Configuration.ConfigurationSettings.
        AppSettings["mappedname"];
    String pass = System.Configuration.ConfigurationSettings.
        AppSettings["mappedkey"];
    connectionString =  "data source=myserver;initial catalog=northwind";
    connectionString += ";user id=" + user;
    connectionString += ";password=" + pass;
    sqlConnection1.ConnectionString = connectionString;
    在注册表中存储凭据

    向 HKEY_LOCAL_MACHINE 配置单元的 SOFTWARE 项中添加新的子项。
    在您的应用程序中,使用 Registry.LocalMachine 对象的 OpenSubKey 方法访问子项。
    注意   为了使用 Registry 类,您必须导入 System 和 Microsoft.Win32 命名空间。
    以下示例说明如何从子项“Connection”中获取用户名和密码(作为名为“mappedname”和“mappedkey”的字符串值存储):

    ' Visual Basic
    Dim user, pass, connectionString As String
    user = Microsoft.Win32.Registry.LocalMachine.OpenSubKey( _
       "Software\Connection").GetValue("mappedname").ToString()
    pass = Microsoft.Win32.Registry.LocalMachine.OpenSubKey( _
       "Software\Connection").GetValue("mappedkey").ToString()
    connectionString = "data source=myserver;initial catalog=northwind"
    connectionString &= ";user id=" & user
    connectionString &= ";password=" & pass
    SqlConnection1.ConnectionString = connectionString

    // C#
    String user, pass, connectionString;
    user = Microsoft.Win32.Registry.LocalMachine.
        OpenSubKey("Software\\Connection").
        GetValue("mappedname").ToString();
    pass = Microsoft.Win32.Registry.LocalMachine.
        OpenSubKey("Software\\Connection").
        GetValue("mappedkey").ToString();
    connectionString = "data source=myserver;initial catalog=northwind";
    connectionString += ";user id=" + user;
    connectionString += ";password=" + pass;
    sqlConnection1.ConnectionString = connectionString;

  • 相关阅读:
    GKCTF2020
    PTA的Python练习题(二十三)
    Web刷题之旅(三)
    Web刷题之旅(二)
    Web刷题之旅(一)-攻防世界 站
    PTA的Python练习题(补)
    Ctfshow
    Ctfshow
    15、实操篇——Vi和Vim编译器
    13、14、实操篇——远程登录到Linux服务器和远程上传下载文件
  • 原文地址:https://www.cnblogs.com/luqingfei/p/212757.html
Copyright © 2020-2023  润新知