문제

웹 프로젝트에 DAL을 만들기 위해 SubSonic을 사용하는 경우 SQL 주입 공격 방지에 대해 걱정해야합니까?

도움이 되었습니까?

해결책

이것은 쿼리를 구성하는 방법에 따라 다릅니다. 매개 변수를 사용하지 않으면 Subsonic과 함께 안전하지 않은 쿼리를 작성하는 것이 완전히 가능합니다.

// 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 생성 클래스 또는 subsonic.subsonc.select 클래스를 사용하여 쿼리/업데이트/삽입 문을 생성하는 경우 Subsonic이 매개 변수를 올바르게 사용한다고 걱정할 필요가 없습니다.

그러나 Paul은 당신이 안전하지 않은 SQL을 쓰려고하면 Subonic이 허용 할 것이라고 지적했습니다. Subsonic은 당신의 어머니가 아니라 당신을 막을 수는 없습니다. 그것은 당신의 가장 친한 친구와 비슷합니다. 그것은 당신에게 말하지 않을 것이지만, 당신이 그것을 결정한다면 그것은 당신의 결정입니다.

바울의 예를 다시 제시하기 위해 (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