Замена одинарных кавычек на двойные в SQL-запросе - PullRequest
0 голосов
/ 24 июня 2018

Я создаю уязвимое приложение 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 + "@"";

Мне пока не удалось найти рабочее решение. Я либо получаю синтаксические ошибки, либо происходит сбой приложения после попытки входа в систему.

1 Ответ

0 голосов
/ 24 июня 2018

Почему бы просто не заменить имя пользователя перед передачей его на запрос?

string finalUsername = username.Contains("\"") ? username.Replace("\"", "'") : username;
string sqlQuery = "SELECT * FROM users where username='" + finalUsername + "' and password='" + password + "'";

Если бы вы хотели, вы могли бы даже запретить исходный вектор:

string finalUsername = username.Contains("\"") ? username.Replace("\"", "'") : (username.Contains("'") ? username.Replace("'", "") : username);
string sqlQuery = "SELECT * FROM users where username='" + finalUsername + "' and password='" + password + "'";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...