0

ログインしている現在のユーザーの詳細を表示するSQLステートメントを使用しました。しかし、このコマンドを実行すると、

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

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

詳細は表示されませんが、実行すると

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

ユーザー名 david はデータベースに存在し、david の詳細のみが Web フォームに表示されます。私もやっResponse.WriteたしUser.Identity.Name、そのステートメントは、ページにログインしている現在のユーザーを表示します。

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 に答える