Как я могу избежать атак с использованием кода на SQL?

Вчера я говорил с разработчиком, и он упомянул что-то об ограничении вставок на поле базы данных, как, строки такой как -- (минус минус).

В том же типе, что я знаю, это - хороший подход для выхода из символов HTML как <, > и т.д. Нет --. Действительно ли это верно? Сделайте я должен волноваться о --, ++? Это больше похож на миф или старый материал?


Обновление

Большое спасибо за все ответы, легко понять как этот, так как я довольно плохо знаком со всем этим. Ну, чтобы быть более конкретным в этом случае, наше обсуждение было об и ASP.NET C# веб-сайт MVC, который мы разрабатываем, таким образом, существует комплекс, открытый форма учетной записи там с важной информацией, таким образом, я не уверен, идет ли MVC использование Linq для взаимодействия через интерфейс с базой данных уже с этим видом защиты или нет. Таким образом, если бы кто-либо мог обеспечивать некоторые подсказки об этом, это было бы большим. Еще раз спасибо

10
задан Sam 18 August 2014 в 08:47
поделиться

6 ответов

Правильным способом избежать атак SQL Injection является не просто запрещение определенных проблемных символов, а использование параметризованного SQL. Короче говоря, параметризованный SQL не позволяет БД выполнять необработанный пользовательский ввод как часть команды SQL, что не позволяет выполнять пользовательский ввод как "таблицу падения". Просто экранирующие символы не останавливают все формы атак SQL-инъекции и исключение некоторых слов, таких как "Drop", работает не во всех случаях; могут быть определенные поля, в которых "Drop" является абсолютно достоверной частью ввода данных.

Хорошие статьи на тему параметризованного SQL можно найти здесь:

https://blog.codinghorror.com/give-me-parameterized-sql-or-give-me-death/

http://www.codeproject.com/KB/database/ParameterizingAdHocSQL.aspx

Теперь, когда вы упомянули, что работаете с ASP.net, я могу дать вам несколько ссылок, которые касаются именно SQL инъекции в ASP.

https://dzone.com/articles/aspnet-preventing-sql-injectio http://www.codeproject.com/KB/aspnet/SQL_Injection_.aspx?msg=3209511

Вот более общая статья о том, как сделать ваш ASP более безопасным: http://www.codeproject.com/KB/web-security/Securing_ASP_NET_Apps.aspx

И, конечно же, статья MSDN о SQL инъекции: http://msdn.microsoft.com/en-us/library/ms998271.aspx

8
ответ дан 3 December 2019 в 16:52
поделиться

Нет ничего «опасного» во вставке строки, содержащей - , в базу данных.

Опасно вставлять что-либо в таблицу базы данных, которая поступает непосредственно из пользовательского ввода, не обрабатывая его, иначе вы оставите себя уязвимым для атак SQL-инъекций . Пример: кодировщик позволяет пользователю вводить свое имя в поле, а пользователь вводит:

Joe '); drop table users; commit transaction; --

, а затем кодировщик помещает это в свою базу данных MySQL следующим образом:

conn.execute("insert into users (username) values ('" + userInput + "')");

Boom Пользователь удалил таблицу пользователей (при условии, что у входа в базу данных есть права на это, чего не должно быть - но это другая тема), потому что кодировщик не гарантировал, что строка от пользователя была экранирована правильно, и поэтому она была отправлена ​​непосредственно в Движок БД и злоумышленник посмеялись. : -)

Используйте любые инструменты, которые предоставляет ваша среда, чтобы гарантировать правильное экранирование строк. Например, JDBC использует для этого класс PreparedStatement . В большинстве сред есть что-то похожее.

3
ответ дан 3 December 2019 в 16:52
поделиться

SQL-инъекция представляет собой высокий риск безопасности для большинства веб-сайтов, которые позволяют пользователям вводить параметры в оператор, выполняемый в базе данных.

Простым примером может быть:

Поле ввода «Имя: _________

"SELECT * FROM tblCustomer WHERE Name = '" + nameInputField + "'"

Итак, если я ввожу« Боб », мы получим

"SELECT * FROM tblCustomer WHERE Name = 'Bob'"

Но если я введу« »; DROP TABLE tblCustomer ", мы получаем более зловещий

"SELECT * FROM tblCustomer WHERE Name = ''; DROP TABLE tblCustomer"

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

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

{{ 1}}
6
ответ дан 3 December 2019 в 16:52
поделиться

Он имел в виду SQL-инъекцию , что совершенно верно в том, что он сказал.

Проблема не в том, что такие данные существуют в базе данных, а в передаче входных данных непосредственно в базу данных без ее очистки.

Не очищая его, если кто-то передает строку, оканчивающуюся на ; , он может следовать за ней чем угодно (например, select * from sys.objects ) или что-то более злонамеренное, например, отбрасывание таблиц.

Трудно полностью защититься от этого, но если вы используете хорошую библиотеку БД из своего кода и следуете известным методам, таким как использование параметризованных запросов, вы ограничиваете возможный ущерб.

Храните столько - в своей базе данных, сколько хотите, но не передавайте это в свою базу данных, не пройдя процесс очистки (здесь жизненно важна хорошая библиотека БД - она ​​должна очищать цитаты и другие потенциально опасные материалы).

3
ответ дан 3 December 2019 в 16:52
поделиться

Использовать параметризованные запросы. Эти запросы представляют переменные как заполнители в SQL, например select * from person where name =? . После создания запроса SQL вы устанавливаете значения параметров в запросе. Параметризованные запросы гарантируют, что все, что было подставлено вместо заполнителя, не будет рассматриваться как часть оператора SQL.

См. статью Джеффа Этвуда для хорошего обзора параметризованных запросов.

3
ответ дан 3 December 2019 в 16:52
поделиться

Это не опасно, если вы правильно экранируете данные при выполнении INSERT / UPDATE / ...

А экранирование символов HTML составляет НЕ хороший подход. Представьте, что вы написали функцию, которая экранирует такие символы, и сохранили некоторый экранированный текст в базе данных. Затем вы замечаете, что ваша функция не экранировала '<', поэтому вы меняете функцию ... что теперь происходит с записями, которые уже находятся в базе данных? - Их символы '<' останутся без экранирования. Таким образом, НИКОГДА не экранируйте текст перед сохранением его в базе данных (избегайте запроса SQL, конечно). Экранирование должно происходить, когда страница HTML / XML / ... создается из текста, то есть после запроса исходного текста из базы данных!

1
ответ дан 3 December 2019 в 16:52
поделиться
Другие вопросы по тегам:

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