Php защита от sql инъекций функция

Защита сайта от sql инъекций

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

Сегодня мы разберем что такое sql инъекция, как она работает, а также как с ней бороться, как на уровне языка программирования, так и с помощью создания различных помех для злоумышленника с помощью веб-сервера. Это тоже достаточно эффективно.

Что такое SQL инъекция?

Как вы знаете, большинство сайтов интернета используют базу данных для хранения информации. Не удивительно, что во время формирования страницы выполняются запросы к базе данных. И тут вроде ничего такого нет, если не считать то, что при формировании запроса могут использоваться данные, введенные пользователем. Например, при создании комментария, поиске или даже переходе на другую страницу.

И тут появляется возможность для SQL инъекции. Если пользователь введет в поле определенный запрос, то он сможет создать свой запрос к базе данных. Это позволит ему делать практически все, что угодно, украсть ваши данные, стереть базу, получить доступ к паролям пользователей, добавить новых пользователей и все что ему будет угодно.

Читайте также:  Razor in javascript function

Например, вот так выглядит SQL запрос запроса id статьи при поиске:

SELECT id,title,content FROM posts WHERE title LIKE ‘%запрос_пользователя%’

А теперь представьте, что пользователь вместо ключевых слов из статьи введет такую комбинацию:

И в результате получится такой себе полностью рабочий запрос, которого вы совсем не ожидали:

SELECT id,title,content FROM posts WHERE title LIKE ‘%1%’; DROP TABLE posts LIKE ‘%%’

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

Защита сайта от sql инъекций на уровне PHP

Защита от sql атак может выполняться различными способами. Первое, на что стоит обратить внимание и что очень важно — это чтобы программист уже во время написания кода занимался экранированием кавычек с помощью таких функций, как mysql_real_escape_string или mysqli_real_escape_string. Если каждая переменная, которая используется в запросах к базе будет профильтрована ими, программистом или на уровне CMS, то никаких проблем не возникнет.

Но почему же на протяжении последних 14 лет все еще случаются атаки на SQL? Все просто. Программисты ленивы, а делать небезопасные запросы к базе так просто, в то время как безопасные — более сложны. Во всяком случае, сложнее, чем небезопасные.

Защита на уровне веб-сервера

Не всегда есть возможность исправить все недоработки в коде. Например, популярный движок Drupal имеет более 20 000 строк кода, WordPress — 60 000, а Joomla — 180 000. Было бы нецелесообразно все это переписывать. Но можно поступить по-другому. Сначала мы отфильтруем все значения из переменной REQUEST в самом начале скрипта. Вставьте этот код после подключения базы данных:

Для PHP 7 вам нужно будет использовать функцию mysqli_real_escape_string, поскольку расширение mysql было удалено из этой версии языка. Для экранирования кавычек используется лишь функция clean и все что ниже нее. То что выше применяется для совместимости с версиями PHP ниже 5.4. В них была настройка Magic Quotes, которая при включении экранировала все кавычки. Чтобы наш скрипт все не портил мы сначала все убираем экранирование если она включена.

Теперь у вас есть дополнительная защита на уровне PHP. Осталось еще позаботиться про защиту на уровне веб-сервера. Если вы используете Nginx, то можно добавить такие правила в вашу секцию server:

set $block_sql_injections 0;
if ($query_string ~ «union.*select.*\(«) set $block_sql_injections 1;
>
if ($query_string ~ «union.*all.*select.*») set $block_sql_injections 1;
>
if ($query_string ~ «concat.*\(«) set $block_sql_injections 1;
>
if ($block_sql_injections = 1) return 403;
>

Здесь мы отфильтровываем все запросы, которые содержат слова select, concat вместе с кавычками. Это явный признак, что пользователь пытается выполнить SQL инъекцию, а значит его запрос нужно заблокировать.

Также вы можете блокировать подозрительные адреса на уровне веб-сервера Apache, например, выбрать самые часто употребляемые ключевые слова SQL. Правда, это опасно, поскольку могут быть заблокированы и запросы обычных пользователей. Добавьте в вашу секцию VitualHost такие строки:

RewriteCond % [^a-z](declare¦char¦set¦cast¦convert¦delete¦drop¦exec¦insert¦meta¦script¦select¦truncate¦update)[^a-z] [NC]
RewriteRule (.*) — [F]

Но это еще не полное решение, здесь можно пойти дальше. Эта блокировка не защищает от SQL инъекций, выполняемых с помощью POST или RESTful запросов. Еще можно активировать модуль mod_security:

sudo a2enmod mod_security

Здесь тоже есть несколько правил, которые защищают от инъекций. Но желательно использовать еще и более комплексный подход.

Разделение базы данных

Чтобы сделать вашу базу данных более безопасной, вы можете разделить ее на несколько частей. В области информационной безопасности существует такое понятие, как принцип минимальных привилегий. Суть принципа состоит в том, что программа или пользователь должны иметь доступ только к тому, что им нужно и нечему больше. Например, будет разумно хранить данные о кредитных картах пользователя и форумы в разных базах данных. Особенно, если формы используют устаревшую версию phpBB. Это своеобразная дополнительная защита sql injection.

Анализ запросов перед приложением

Еще один вариант — это использования более сложных систем защиты. Это может быть аппаратное решение, которое работает поверх iptables или ipfw или же система обнаружения вторжений на сервере HIDS, такая, как OSSEC. Но такое решение намного сложнее, чем нужно и не предназначено для решения нашей задачи. Можно использовать специальные брандмауэры веб-приложений, с помощью которых, в том числе, выполняется защита от SQL инъекций. Это такие свободные решения, как ModSecurity или IronBee.

Выводы

Нет идеального решения или волшебной палочки, с помощью которой бы получалась стопроцентная защита сайта от sql инъекций, хотя PHP стремится быть все более защищенным. Начиная с версии 7.0 была удалена поддержка расширения MySQL. Теперь необходимо переходить на MySqli или PDO. И это хорошо, потому что эти расширения делают проще использование данных с подготовленными операторами. Хотя для этого все еще требуется написать несколько строк.

Существует множество способов выполнения SQL атак, но до тех пор, пока разработчики не будут писать правильный код, а на веб-серверах не будут на максимум использоваться средства защиты, эти атаки не исчезнут из списка ТОП 10 OSWAP. Настройте вашу систему так, чтобы защитить свои данные и базы данных.

Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.

Источник

Защита формы на языке программирования PHP

защита форм php

В этой статье мы поговорим как происходит защита форм в языке программирования PHP, расскажу всё максимально понятно и подробно.

Защита от ботов:

Пожалуй зашита от ботов самая простая, для этого вам надо создать капчу, для этого на сайте есть пару статей.

Лично я рекомендую использовать для этого Google ReCAPTCHA, так как это наиболее эффективный способ и подключение не очень сложное.

XSS защита в PHP:

XSS защита в PHP очень простая, у вас есть два способа, первый, через регулярные выражения, второй, через специальный функции, рассмотрим их оба.

Для тех кто не знает, что такое XSS атака, это когда в форму встраивают JS код, к примеру, и потом, когда другие пользователи видят это сообщение, у них может что-то ломаться, или даже забираться какие-то данные.

Регулярные выражения:

Суть в том, что после отправки формы, на сервере будут проходить проверку данные, которые прислал клиент, на PHP для этого будем использовать функцию preg_match() , которая находит первое попавшийся совпадение, но для начала взгляните на список самых полезных выражения.

  • « /^[A-Z0 -9. _%+-]+@[A-Z0 -9 -]+.+.[A-Z]< 2 , 4 >$/i » — Проверка Email;
  • « /^[a-z0 -9 _-]< 3 , 16 >$/ » — Простой логин;
  • « /^ \ + ?( \ d )?[- .]? \ ( ?(?: \ d ) \ ) ?[- .]? \ d \ d \ d [- .] ? \ d \ d \ d \ d $/ » — Номер телефона;
  • « /^ (?=.*[A-Z].*[A-Z]) (?=.*[!@#$&*]) (?=.*4.*8) (?=.*[a-z].*[a-z].*[a-z]) .< 8 ,>$/ » — Сложный пароль;

Теперь сделаем не большую программу на языке программирования PHP, вот как выглядит форма.

Тут просто отправляем форму прямо в этот же скрипт, где она находится, вот сама не большая программа.

Вот результат если введём правильный Email.

XSS защита в PHP

Тут стоит сказать, что так как, мы использовали тип поля «email», у нас автоматически будет проверятся, что введён именно он, но проверку всё равно надо делать, потому что злоумышленник может отправить данные отдельно, например вписав их в URL, тем более когда используете GET.

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

Функции:

Теперь разберём какие есть функции для проверки и защиты от XSS, их всего две, вот они.

  • filter_var() — Фильтрует переменные, в основном используется для проверки Email;
  • htmlspecialchars() — Функция нужна для замены некоторых знаков в строке, на HTML формат что бы браузер не понял программы.

Если с htmlspecialchars() всё понятно, вы просто в качестве параметра передаются строка, которую надо изменить, и возвращается она изменённая.

filter_var() используется в основном для проверки Email, но об этом подробнее прочитайте в статье «Проверка email в PHP на валидность», в остальном больше нечего рассказать, также посмотрите ссылку, там чуть больше узнаете о этой фукции.

Защита от SQL инъекций в PHP:

Про защиту от SQL инъекций в PHP, всё достаточно просто, вам нужно использовать класс PDO, для примера сделаем не большую функцию.

Источник

Оцените статью