2

アカウントに関連付けられた請求日を検索するために、ユーザーがアカウント ID (正確に 8 桁である必要があります) を指定する Web サイトを設計しています。ユーザーが文字を入力できないようにするために、asp.net正規表現バリデーターを使用しました。また、このテキスト ボックスに必須フィールド バリデータを添付しました。

他のstackoverflowの質問からSQLインジェクション攻撃について読んだことがありますが、バリデーターでクエリを保護することに関連するものは何も見つけていません.

これらのバリデータが設定されている場合、SQL インジェクション攻撃について心配する理由はありますか? 悪意のあるユーザーがこのユーザー入力を悪用するのを防ぐために、他に必要な (またはすべき) ことはありますか?

以下は、SQL クエリの C# コードで、AccountID に関連付けられた請求サイクルの日付をドロップダウン リストに入力します。

string sqlCommandString = "SELECT StatementDate AS StateDate FROM dbTable " + 
    "WHERE AccountID = '" + AccountID + "' ORDER BY StatementDate DESC";

string ConnectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;

using (SqlConnection sqlConnection = new SqlConnection(ConnectionString))
using (SqlCommand sqlCommand = new SqlCommand(sqlCommandString, sqlConnection))
{
    sqlConnection.Open();
    DropDownList_StatementDate.DataSource = sqlCommand.ExecuteReader();
    DropDownList_StatementDate.DataBind();
}

そして、これが私が使用した正規表現バリデータです:

<asp:RegularExpressionValidator
    ID="RegExpVal_AccountID"
    runat="server"
    ErrorMessage="Must be 8 digits"
    ValidationExpression="^\d{8}$"
    ControlToValidate="TextBox_AccountID"
    CssClass="ValidatorStyle"
    Display="Dynamic">        
</asp:RegularExpressionValidator>

ありがとうございました。

4

1 に答える 1

12

パラメータ化されたクエリを使用するだけです (SQL インジェクション攻撃を防ぐ唯一の安全な方法です)。

string sqlCommandString = "SELECT StatementDate AS StateDate FROM dbTable " + 
    "WHERE AccountID = @AccountID ORDER BY StatementDate DESC";

string ConnectionString = ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString;

using (SqlConnection sqlConnection = new SqlConnection(ConnectionString))
using (SqlCommand sqlCommand = new SqlCommand(sqlCommandString, sqlConnection))
{
    sqlConnection.Open();
    sqlCommand.Parameters.AddWithValue("@AccountID", AccountID);
    DropDownList_StatementDate.DataSource = sqlCommand.ExecuteReader();
    DropDownList_StatementDate.DataBind();
}
于 2013-07-05T20:45:12.027 に答える