1

これが注射を正しく妨げていることを確認するために再確認したいと思います。

ASP .NET 3.5でGridView(ずっと前に他の誰かによって書かれた)を使用する古いコードがあります。

.aspxページ(GridViewはこのデータソースを使用します):

<asp:SqlDataSource ID="sdsUserTables" runat="server" 
    ConnectionString="<%$ ConnectionStrings:Main %>" 
    DeleteCommand="DELETE FROM [MyTable] WHERE [tableID] = @tableID">
    <DeleteParameters>
        <asp:Parameter Name="tableid" Type="Int32" />
    </DeleteParameters>        
</asp:SqlDataSource>

これにより、tableIdへのインジェクションが防止されますか?

背後にあるコードはこれを持っています:

protected void sdsUserTables_Deleting(object sender, SqlDataSourceCommandEventArgs e)
{
    e.Command.Parameters["@tableId"].Value = myTableId;
}    
4

3 に答える 3

1

はい、変数を使用していて、その型が宣言されている場合、これら2つの要素によってSQLインジェクション攻撃が防止されます。

参照してください... http://www.mikesdotnetting.com/Article/113/Preventing-SQL-Injection-in-ASP.NET

SQLコードをストアドプロシージャにし、それに変数を渡すことで、まったく同じことを行うことができます。

于 2013-03-06T19:54:07.450 に答える
1

このコードは、SQLインジェクション攻撃を防ぐために私には問題ないように見えます。

  • <asp:Parameter>SQLクエリにタグを使用しています。このように、これはSQLコマンドの一部ではなく、パラメーターとしてSQLサーバーに送信されます。これは、タイプに関係なく、正しい方法です。

  • タグ内のSQLコマンドと接続文字列<asp:SqlDataSource>はアセンブリに埋め込まれます。ユーザーは使用できず、ページにも表示されません。したがって、改ざんすることはできません。

一般的にSQLインジェクションに対する保護を実施したい場合:

[validateRequest][1]ページのパラメータが「true」に設定されていることを確認してください。

// This parameter is normally set to "true" by default in the machine.config file
<pages validateRequest="true" /> 
  • また、すべてのユーザー入力を検証し、入力の長さを必要な文字数に制限するという良い習慣があります。

例えば:

// assuming myTableId is a string

try
{
    int i = int.Parse(myTableId)
    e.Command.Parameters["@tableId"].Value = i;
}
catch
{
    throw new ApplicationException("Table Id should be an integer");
}

ユーザー入力が文字列の場合、パラメーターを使用する場合は、すべてのSQLキーワードをチェックする必要はありません。

于 2013-03-06T20:25:43.393 に答える
1

あなたが上で与えた例の場合、あなたは間違いなく安全だと思います。入力をサニタイズすることは常にベストプラクティスです。

テキストボックスを含む(ある種の)フォームがあるとすると、入力できるテキストの量に制限はありません(これは非常に悪い可能性があります)。

次に例を示します。

sqlParameter sqlParam = new SqlParameter();
sqlParam.ParameterName = "@testParam";
sqlCommand.Parameters.AddWithValue("@testParam", textBox1.Text);

上記の例では、テキストボックスがバインドされていないことを前提として、悪意のある可能性のある文字列をパラメータに詰め込んでいるという事実により、生データがテーブル/データベースに悪影響を与えるのを防ぎます。

于 2013-03-06T20:34:06.543 に答える