CreateHiddenFolder(string name)
{
DirectoryInfo di = new DirectoryInfo(name);
di.Create();
di.Attributes |= FileAttributes.Hidden;
}
В ответ на ваш прямой вопрос: предотвращает ли этот код 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 и сразу же проигнорирует остальная часть вашего запроса.
Самое интересное в этом то, что вы можете использовать непечатаемые символы, чтобы в основном обойти любую проверку символов, которую вы можете изобрести.
Я думаю, что это безопасно (по крайней мере, для SQL-сервера), и я также думаю, что единственное, что вам действительно нужно сделать, это s = s.Replace ("'", "' '")
. Конечно, вам следует использовать параметризованные запросы, но вы это уже знаете.
Я думаю, что это невозможно взломать, если вы просто замените "на" ". Я слышал, что можно изменить символ escape-кавычек, что потенциально может нарушить это, однако я не уверен. Я думаю, вы в безопасности.
Чтобы ответить на ваш сомнительный вопрос, нет, это не сработает.
.Replace ("` `", "''")
предотвратит допустимые запросы с помощью '' '
.Replace ("´", "''")
предотвратит допустимые запросы с '´'
.Replace ("-", "")
предотвратит допустимые запросы с '- - 'в них
.Replace ("' '", "'")
некорректно изменяет допустимые запросы с '' '' в них
и т. д.
Кроме того, полный набор escape-символы могут отличаться от одной СУБД к другой. Параметризованные запросы FTW.
Это Статья MSDN охватывает большую часть того, на что вам нужно обратить внимание (я боюсь сказать все, когда дело доходит до SQL-инъекции).
Но я повторю мнение всех остальных о параметрах параметры параметры.
Что касается вашего примера, некоторые ошибки [Edit: Обновлено это]:
строка «1 OR 1 = 1» не позволит пользователю вернуть все
или хуже «1; drop table sometablename»
Согласно статье вы хотите проверить:
; - Разделитель запроса.
'- Разделитель строки символьных данных.
- - Разделитель комментариев.
/ * ... / - Разделители комментариев. Текст между / и * / не оценивается сервер.
xp_ - используется в начале имени расширенные в каталог хранимые процедуры, например xp_cmdshell.
Вы пытаетесь внести символы в черный список, чтобы реализовать собственную версию экранирования SQL. Я бы посоветовал просмотреть этот URL - экранирование SQL - не обязательно худший вариант (т.е. быстрое исправление существующих приложений), но его нужно делать правильно, чтобы избежать уязвимостей.
Этот URL ссылается на другой страница для экранирования в SQL Server, где автор дает предложения, которые помогут вам избежать уязвимостей без ограничения функциональности.
Если это помогает, в статьях также предлагается экранирование скобок (я называю их квадратными скобками - но []).
Если вы попытаетесь использовать свой код, кто-то может передать ключ (; выбрать * из таблицы; и получить список из любой таблицы, которую они хотят.
В вашем коде вы не проверяете для точки с запятой, которая позволяет вам завершить оператор t-sql и начать другой.
Я бы пошел с параметризованным запросом.