2009-01-23 11 views
47

Ich richte eine öffentliche Website und die erste Sache in meinem Kopf ist SQL-Injektion. Ich habe einige Textfelder, die ich speichere und benutze linq, um die Datenbank zu aktualisieren/zu schreiben. Bin ich sicher mit linq?Wird mit LINQ zu SQL helfen SQL-Injektion zu verhindern

In diesem Beispiel wird das Benutzerkonto erstellt.

Data.MemberRegistrationDataContext context = new MemberRegistrationDataContext(); 
Data.tbl_Member_UserProfile profile = new tbl_Member_UserProfile(); 
profile.SSN = Convert.ToDecimal(Session["tempMemberSSN_Registration"]); 
profile.UserName = userName; 
profile.Password = password; 
profile.EmailAddress = email; 
profile.QuestionID = qID; 
profile.QuestionResponse = securityAnswer; 
profile.LastModDt = DateTime.Now; 
profile.LastModBy = "web"; 
context.tbl_Member_UserProfiles.InsertOnSubmit(profile); 
context.SubmitChanges(); 

Dieses Beispiel ändert sich das Passwort

MemberRegistrationDataContext dc = new MemberRegistrationDataContext(); 
    var mProfileRecord = dc.tbl_Member_UserProfiles.Single(c => c.SSN == sSSN); 
    mProfileRecord.Password = sNewPassword; 
    dc.SubmitChanges(); 

diese sicher sind? Parametriert LINQ das automatisch generierte SQL?

+2

Hinweis für Leser: Das gleiche gilt für Entity Framework. Siehe http://stackoverflow.com/questions/3473841/entity-framework-linqtosql-and-sql-injection –

Antwort

68

Ja, LINQ hilft dabei, die SQL-Injektion zu stoppen.

LINQ to SQL übergibt alle Daten über SQL-Parameter an die Datenbank . So, obwohl die SQL-Abfrage besteht dynamisch, sind die Werte Serverseite durch Parameter Schutz gegen die gängigste Ursache der SQL-Injektion Angriffe ersetzt.

Siehe auch Eliminate SQL Injection Attacks Painlessly with LINQ für einige Informationen.

+0

Es sollte angemerkt werden, dass, wenn sie sagen "alle Daten übergeben" sie "alle Daten" bedeuten - sogar hart-codiert Werte: "db.Employees.Where (e => e.Active == 1)" wird die "1" als Parameter übergeben. –

+8

Mit einer kleinen Ausnahme: Wenn Sie eine gespeicherte Prozedur oder Funktion haben, die SQL-Injection anfällig ist (aufgrund der dynamischen SQL-Zusammensetzung), dann sind alle Aufrufe an diesen SP/func natürlich anfällig. – KristoferA

14

Sie sind gut zu gehen. Linq parametrisiert die Daten, die es an die Datenbank sendet.

die Log-Eigenschaft verwenden, um zu prüfen, was passiert: dc.Log = Console.Out;

3

Es sollte, weil die SQL emittierten Verwendungen benannte Parameter, die beliebige SQL ausführen können nicht genutzt.