質問

SubSonicを使用してWebプロジェクトのDALを作成する場合、SQLインジェクション攻撃の防止について心配する必要がありますか?

役に立ちましたか?

解決

これは、クエリの作成方法によって異なります。パラメーターを使用しない場合、亜音速で安全でないクエリを作成することは完全に可能です。

// Bad example:

string sql = "delete from Products where ProductName = " + rawUserInput;
QueryCommand qry = new QueryCommand(sql, Product.Schema.Provider.Name);
DataService.ExecuteQuery(qry);

// Should be:

string sql = "delete from Products where ProductName = @TargetName";
QueryCommand qry = new QueryCommand(sql, Product.Schema.Provider.Name);
qry.AddParamter("@TargetName", rawUserInput, DbType.String);
DataService.ExecuteQuery(qry);

他のヒント

いいえ、SubSonicはパラメーターを使用してデータをデータベースに渡します。これは面倒を見てくれます。

短い答えはノーです。 Subsonic GeneratedクラスまたはSubsonic.Selectクラスを使用してクエリ/更新/挿入ステートメントを生成する場合、SubSonicがパラメーターを正しく使用することを心配する必要はありません。

しかし、Paulは、安全でないSQLを書くために邪魔をすると、SubSonicが許可することを指摘しました。 SubSonicはあなたの母親ではありません。あなたを止めることはありません。親友のようなものです。

Paulの例を再表示するだけです(FK制約がある場合)

        string rawUserInput = "Queso Cabrales1";
        #region  BadExample
        //string sql = "delete from Products where ProductName = " + rawUserInput;
        ////QueryCommand objQueryCommand = new QueryCommand(sql, Product.Schema.Provider.Name);
        ////DataService.ExecuteQuery(objQueryCommand);
        #endregion BadExample

        #region BetterExample
        // Should be:

        string sql = "update Products set ProductName =  @ProductName where ProductName='Queso Cabrales'";
        QueryCommand objQueryCommand = new QueryCommand(sql, Northwind.Product.Schema.Provider.Name);
        objQueryCommand.AddParameter("@ProductName" , rawUserInput, DbType.String);
        DataService.ExecuteQuery(objQueryCommand);


        panGvHolder.Controls.Clear();

        Query qry = Northwind.Product.CreateQuery();
        qry.Columns.AddRange(Northwind.Product.Schema.Columns);
        qry.WHERE("UnitPrice > 15").AND("UnitsInStock < 20 ");
        //WHERE("UnitPrice > 15").AND("UnitsInStock < 30 ");
        #endregion BetterExample

        #region PresentResultsReplaceResponseWriteWithConsole.WriteLineForConsoleApp
        using (IDataReader rdr = qry.ExecuteReader())
        {
            Response.Write("<table>");
            while (rdr.Read())
            {
                Response.Write("<tr>");
                for (int i = 0; i < rdr.FieldCount; i++)
                {
                    Response.Write("<td>");
                    Response.Write(rdr[i].ToString() + " ");
                    Response.Write("<td>");
                } //eof for 
                Response.Write("</br>");
                Response.Write("</tr>");
            }
            Response.Write("<table>");
        }
        #endregion PresentResultsReplaceResponseWriteWithConsole.WriteLineForConsoleApp

    } //eof method
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top