0

我使用了一个 sql 语句,我想在其中显示当前登录用户的详细信息。但是当我运行这个命令时

ConnectionString = "<%$ ConnectionStrings:Details %>" 

SelectCommand = "SELECT *  FROM member WHERE username = 'User.Identity.Name'"

它没有显示任何细节,但是当我运行时

SelectCommand = "SELECT *  FROM member WHERE username = 'david'" 

用户名 david 存在于数据库中,并在 Web 表单中仅显示 david 的详细信息。我什至Response.WriteUser.Identity.Nameand 该语句上显示了登录页面的当前用户。

4

1 回答 1

2

问题是您将实际User.Identity.Name作为字符串而不是其值传递。

SelectCommand = String.Format("SELECT *  FROM member WHERE username = '{0}'", User.Identity.Name)

但更好(和更安全)的做法是

SelectCommand = "SELECT *  FROM member WHERE username = @UserName"
SelectCommand.Parameters.AddWithValue("@UserName", User.Identity.Name)

这将防止 SQL 注入。

编辑: 由于您在页面中定义它,您可以使用以下模板:

<asp:SqlDataSource runat="server" ID="SqlDataSource1" ConnectionString="<%$ ConnectionStrings:Details %>" SelectCommand="SELECT * FROM members WHERE ([username] = @UserName)">
    <SelectParameters>
        <asp:Parameter Name="UserName" Type="String" DefaultValue="" />
    </SelectParameters>
</asp:SqlDataSource>

User.Identity.Name然后在服务器端设置默认值:

SqlDataSource1.SelectParameters.Item(0).DefaultValue = User.Identity.Name

更简单的方法是使用Configure Data Source向导,在设计视图中单击 SqlDataSource 对象旁边的右箭头即可使用该向导。

于 2012-09-20T01:47:07.233 回答