Я создаю уязвимое приложение Windows Forms, используя C #, чтобы попрактиковаться в SQL-инъекции и понять, почему эта уязвимость возникает в первую очередь. Я знаю, что должен использовать параметризованные запросы для разработки безопасного приложения.
Приложение требует, чтобы пользователь ввел свое имя пользователя и пароль для входа в систему. Следующий код отвечает за динамическую генерацию SQL-запроса на основе ввода пользователя:
public SqlDataReader performLogin(String username_input, String password_input)
{
String username = username_input;
String password = password_input;
String sqlquery = "SELECT * FROM users where username='" + username + "' and password='" + password + "'";
SqlCommand query = new SqlCommand(sqlquery, conn);
SqlDataReader reader = query.ExecuteReader();
return reader;
}
База данных SQL Server содержит имя пользователя с именем «admin», и я могу войти в систему как этот пользователь, не зная его пароля, введя следующие данные в поле имени пользователя:
admin'--
Однако я хотел бы изменить динамически сгенерированный SQL-запрос так, чтобы мне приходилось вводить двойные кавычки (не две одинарные кавычки) вместо одной одинарной кавычки, чтобы войти в систему как администратор:
admin"--
Я пытался заменить каждый символ двойной кавычки одинарной кавычкой, а каждую отдельную кавычку - двойными кавычками. Я также пытался заменить каждый символ одинарной кавычки двойными кавычками и экранировать их следующим образом:
String sqlquery = "SELECT * FROM users where username=\"" + username + "\" and password=\"" + password + "\"";
String sqlquery = "SELECT * FROM users where username=@"" + username + "@" and password=@"" + password + "@"";
Мне пока не удалось найти рабочее решение. Я либо получаю синтаксические ошибки, либо происходит сбой приложения после попытки входа в систему.