我使用了一个sql语句,我想显示当前用户登录的详细信息。但是当我运行此命令时
ConnectionString = "<%$ ConnectionStrings:Details %>"
SelectCommand = "SELECT * FROM member WHERE username = 'User.Identity.Name'"
它没有显示任何细节,但是当我运行时
SelectCommand = "SELECT * FROM member WHERE username = 'david'"
用户名david存在于数据库中,并在Web表单中仅显示david的详细信息。我甚至在Response.Write
上做了User.Identity.Name
,该语句显示了页面中记录的当前用户。
答案 0 :(得分: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对象旁边的右箭头可以使用该向导。