Этот код предотвращает Внедрение SQL?

CreateHiddenFolder(string name)  
{  
  DirectoryInfo di = new DirectoryInfo(name);  
  di.Create();  
  di.Attributes |= FileAttributes.Hidden;  
}  
16
задан Ry- 14 November 2011 в 01:11
поделиться

7 ответов

В ответ на ваш прямой вопрос: предотвращает ли этот код SQL-инъекцию: Нет

Вот доказательство - протолкните эту строку через метод PrepareString:

Dim input = "'" & Chr(8) & "; Drop Table TableName; - " & Chr(8) & "-"
Dim output = PrepareString(input)

Console.WriteLine(input)
Console.WriteLine(output)

Я изменил опубликованный вами метод GetRecord чтобы вернуть полностью подготовленную строку SQL, а не получать запись из базы данных:

Console.WriteLine(GetRecord(output))

И это результат

Input  = ; Drop Table TableName; --
Output = '; Drop Table TableName; --
Query  = SELECT * FROM TableName WHERE Key = ''; Drop Table TableName; --'

Добавьте 1 дополнительную строку кода:

My.Computer.Clipboard.SetText(input)

И у вас есть строка, которую нужно скопировать прямо в ваш буфер обмена для вставки в поле ввода на веб-сайте для выполнения SQL-инъекции:

'; Drop Table TableName; - -

[Обратите внимание на то, что управляющие символы были опущены StackOverflow в выводе сообщения, поэтому вам придется следовать примеру кода для создания вывода]

После запуска метода PrepareString он будет иметь то же самое вывод - ASCII-код Chr (8) - это обратное пространство, которое удалит лишний «'», который вы добавляете к моему, который закроет вашу строку, а затем я могу добавить все, что захочу, в конце. Ваша PrepareString не видит мой - потому что я на самом деле использую - с символом возврата, чтобы удалить пробел.

Результирующий код SQL, который вы создаете, затем беспрепятственно выполнит мой оператор Drop Table и сразу же проигнорирует остальная часть вашего запроса.

Самое интересное в этом то, что вы можете использовать непечатаемые символы, чтобы в основном обойти любую проверку символов, которую вы можете изобрести.

23
ответ дан 30 November 2019 в 16:19
поделиться

Я думаю, что это безопасно (по крайней мере, для SQL-сервера), и я также думаю, что единственное, что вам действительно нужно сделать, это s = s.Replace ("'", "' '") . Конечно, вам следует использовать параметризованные запросы, но вы это уже знаете.

2
ответ дан 30 November 2019 в 16:19
поделиться

Я думаю, что это невозможно взломать, если вы просто замените "на" ". Я слышал, что можно изменить символ escape-кавычек, что потенциально может нарушить это, однако я не уверен. Я думаю, вы в безопасности.

3
ответ дан 30 November 2019 в 16:19
поделиться

Чтобы ответить на ваш сомнительный вопрос, нет, это не сработает.

.Replace ("` `", "''") предотвратит допустимые запросы с помощью '' '

.Replace ("´", "''") предотвратит допустимые запросы с '´'

.Replace ("-", "") предотвратит допустимые запросы с '- - 'в них

.Replace ("' '", "'") некорректно изменяет допустимые запросы с '' '' в них

и т. д.

Кроме того, полный набор escape-символы могут отличаться от одной СУБД к другой. Параметризованные запросы FTW.

16
ответ дан 30 November 2019 в 16:19
поделиться

Это Статья MSDN охватывает большую часть того, на что вам нужно обратить внимание (я боюсь сказать все, когда дело доходит до SQL-инъекции).

Но я повторю мнение всех остальных о параметрах параметры параметры.

Что касается вашего примера, некоторые ошибки [Edit: Обновлено это]:

  • строка «1 OR 1 = 1» не позволит пользователю вернуть все

  • или хуже «1; drop table sometablename»

Согласно статье вы хотите проверить:

; - Разделитель запроса.

'- Разделитель строки символьных данных.

- - Разделитель комментариев.

/ * ... / - Разделители комментариев. Текст между / и * / не оценивается сервер.

xp_ - используется в начале имени расширенные в каталог хранимые процедуры, например xp_cmdshell.

1
ответ дан 30 November 2019 в 16:19
поделиться

Вы пытаетесь внести символы в черный список, чтобы реализовать собственную версию экранирования SQL. Я бы посоветовал просмотреть этот URL - экранирование SQL - не обязательно худший вариант (т.е. быстрое исправление существующих приложений), но его нужно делать правильно, чтобы избежать уязвимостей.

Этот URL ссылается на другой страница для экранирования в SQL Server, где автор дает предложения, которые помогут вам избежать уязвимостей без ограничения функциональности.

Если это помогает, в статьях также предлагается экранирование скобок (я называю их квадратными скобками - но []).

0
ответ дан 30 November 2019 в 16:19
поделиться

Если вы попытаетесь использовать свой код, кто-то может передать ключ (; выбрать * из таблицы; и получить список из любой таблицы, которую они хотят.

В вашем коде вы не проверяете для точки с запятой, которая позволяет вам завершить оператор t-sql и начать другой.

Я бы пошел с параметризованным запросом.

-4
ответ дан 30 November 2019 в 16:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: