Frage

Wenn ich SubSonic verwenden DAL für meine Web-Projekt zu erstellen, muss ich zu verhindern SQL-Injection-Attacken Sorgen machen?

War es hilfreich?

Lösung

Das hängt davon ab, wie Sie Ihre Abfragen erstellen. Es ist durchaus möglich, unsichere Anfragen mit Subsonic zu schreiben, wenn Sie keine Parameter verwenden.

// 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);

Andere Tipps

Nein, SubSonic Parameter verwendet, um Daten in die Datenbank zu übergeben, es kümmert sich um diese.

Die kurze Antwort ist nein. Wenn Sie die Subsonic generierten Klassen oder die Subsonic.Select Klasse verwenden, um Ihre Anfragen / Update / Insert-Anweisungen zu erzeugen, dann müssen Sie nicht in befürchten, dass SubSonic Parameter korrekt verwendet.

Paulus hat jedoch darauf hin, dass, wenn Sie aus dem Weg gehen unsichere SQL zu schreiben, die SubSonic ermöglicht es Ihnen zu. SubSonic ist nicht deine Mutter es wird nicht aufhören es mehr wie dein bester Freund ist, wird es Ihnen nicht sagen, aber wenn Sie sich entscheiden, es zu tun, das ist Ihre Entscheidung.

Just re-präsentiert das Beispiel von Paul (falls Sie FK Einschränkungen)

        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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top