Как я могу избежать атак SQL-инъекций?

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

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


Обновить

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

Правильный способ избежать атак SQL Injection – это не просто запретить некоторые проблемные символы, а использовать параметризованный SQL. Короче говоря, параметризованный SQL препятствует тому, чтобы firebase database выполняла исходный ввод пользователя как часть команды SQL, это предотвращает выполнение пользователем ввода, например, «drop table». Просто экранирование символов не останавливает все формы 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 Injection в 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

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

Простой пример:

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

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

Поэтому, если я набираю «Боб», мы имеем

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

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

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

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

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

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

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

Он говорил о атаках SQL Injection , так как это совершенно правильно в том, что он сказал.

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

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

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

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

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

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

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

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

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

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

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

Это не опасно, если вы правильно избегаете данных при выполнении INSERT / UPDATE / …

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

Давайте будем гением компьютера.