Powiel możliwe:
Can I protect against SQL Injection by escaping single-quote and surrounding user input with single-quotes?Jak ten kod zapytania SQL może zostać złamany/wykorzystany przez dane wejściowe użytkownika?
Mamy aplikację starszych, które nie robi zapytań z wykorzystaniem parametrów pozycyjnych, a tam wszędzie SQL. Zdecydowano (zanim zacząłem tutaj), że ponieważ dane wprowadzane przez użytkownika mogą zawierać apostrofy, każdy ciąg wejściowy powinien być ręcznie unikany dla tych apostrofów.
Oto zasadniczy oryginalny kod (nie napisane przez mnie), w języku C# dla łatwiejszego spożycia:
private string _Escape(string input)
{
return input.Replace("'", "''");
}
private bool _IsValidLogin(string userName, string password)
{
string sql =
string.Format
(
@"SELECT COUNT(*) FROM UserAccounts
WHERE UserName = '{0}' AND Password = '{1}'",
_Escape(userName),
_Escape(password)
);
// ...
}
To naprawdę wydaje się, że to może być uszkodzony w jakiś sposób, ale jestem ze stratą co do sposobu, w jaki może być wykorzystany przez dane wejściowe użytkownika. Załóżmy, że dane wejściowe użytkownika są niefiltrowane, dopóki nie trafią na _IsValidLogin
i zapominają, że hasła wydają się być zapisane w postaci zwykłego tekstu.
Rozwiązanie tego problemu na dobre jest oczywiste - użyj parametrów pozycyjnych - ale potrzebuję trochę amunicji, aby zademonstrować kierownictwu, dlaczego/jak ten kod jest niepewny, dzięki czemu czas/$ może zostać przydzielony, aby uzyskać poprawkę.
Uwaga: Jestem przy założeniu, że może to zostać zerwane, ale może tak nie być. Nie jestem gwiazdą SQL.
Uwaga 2: Przedstawiłem to pytanie jako agnostykę bazy danych, ale jeśli można wykorzystać ten kod do określonego silnika, z zadowoleniem przyjmuję twój wkład.
Warto przeczytać tutaj, jeśli jeszcze tego nie zrobiłeś: http://stackoverflow.com/questions/139199/can-i-protect-against-sql-injection-by-escaping-single-quote-and- użytkownik otaczający –
@Nick: Dzięki, nie widziałem tego. Zamknę to pytanie jako duplikat. –
Zamknięte na prośbę autora. –