Статьи

5 полезных советов по созданию безопасных приложений PHP

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

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

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

1
error_reporting(0);
Избавьтесь от этих публичных ошибок!

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

Пример журнала ошибок

С самых первых дней дизайнеры PHP всегда включали некоторые
функции, чтобы сделать разработку проще. Или так они думали! Что-нибудь из этого
полезные функции могут иметь непредвиденные последствия. Я называю это «плохо
функции «, потому что они позволили кошмары проверки данных и
создал путь для ошибок, чтобы найти свой путь в скриптах. Один из
первое, что вы должны сделать, когда начинается процесс разработки, это
отключить некоторые из этих функций.

Примечание: в зависимости от вашего хоста, они могут или не могут быть отключены для
вы. Если вы разрабатываете на своем компьютере или других аналогичных локальных
среда, они, вероятно, не будут выключены. Некоторые из этих функций
также были удалены в следующем PHP6, но повсеместно распространены в PHP4
приложения и устарели только в приложениях PHP5.

Регистрировать глобалы (register_globals)

Короче говоря, register_globals должен был помочь быстрому применению
развитие. Возьмите, например, этот URL,
http: //yoursite.tld/index.php? var = 1, который включает строку запроса.
Оператор register_globals позволяет нам получить доступ к значению с помощью $ var
вместо $ _GET [‘var’] автоматически. Это может звучать полезно для вас,
но, к сожалению, все переменные в коде теперь имеют это свойство, и
Теперь мы можем легко войти в приложения PHP, которые не защищают от
это непреднамеренное последствие. Следующий фрагмент кода только один
Типичный пример, который вы увидите в скриптах PHP:

1
2
3
4
if( !empty( $_POST[‘username’] ) && $_POST[‘username’] == ‘test’ && !empty( $_POST[‘password’] ) && $_POST[‘password’] == «test123» )
{
    $access = true;
}

Если приложение работает с помощью register_globals, пользователь может
просто поместите access = 1 в строку запроса и получите доступ к
какой бы скрипт не работал.

К сожалению, мы не можем отключить register_globals из скрипта
сторона (используя ini_set, как мы обычно можем), но мы можем использовать
Файлы .htaccess для этого. Некоторые хосты также позволяют вам иметь php.ini
файл на сервере.

Отключение с помощью .htaccess

Отключение с помощью php.ini

Примечание. Если вы используете собственный файл php.ini, который не применим к
весь сервер, вы должны включить эти объявления в каждую подпапку
это PHP

Поток регистра глобальный

Магические цитаты (magic_quotes_gpc, magic_quotes_runtime, magic_quotes_sybase)

Magic Quotes была функция, предназначенная для избавления программистов от проблем
используя addlashes () и другие подобные функции безопасности в своем коде.
Есть как минимум три проблемы, связанные с магическими цитатами. Один
Проблема с этой полезной функцией заключается в том, если обе
addlashes () используются. Если это так, то вы в конечном итоге
добавляется несколько слешей, что приводит к ошибкам. Вторая проблема, если
Вы делаете предположение, что магические кавычки включены, и это на самом деле
не. Тогда все входные данные остаются непроверенными. Третья проблема в том, что магия
кавычки экранируют только одинарные и двойные кавычки, но если вы используете
ядро базы данных, есть также много специфичных для базы данных символов, которые
также необходимо избежать. Рекомендуется использовать это отключение
вместо этого используйте правильную проверку переменных (см. ниже).

К сожалению, мы также не можем отключить магические кавычки из скрипта
сторона, использующая ini_set. Как и в случае с register_globals, мы можем использовать .htaccess или
Файлы php.ini для этого.

Отключение с помощью .htaccess

Отключение с помощью php.ini

Примечание. Если вы используете собственный файл php.ini, который не применим к
весь сервер, вы должны включить эти объявления в каждую подпапку
это PHP

Пример файла htaccess

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

Например, скажем, мы создаем приложение, которое перечисляет пользователей
дни рождения и позволяет пользователям добавлять свои собственные. Мы будем хотеть
принять месяц в виде цифры от 1 до 12, день от 1 до 31 и год
в формате ГГГГ.

Наличие такой логики в вашем приложении просто и регулярно
Выражения (регулярные выражения) являются идеальным способом обработки проверки ввода.
Возьмите следующий пример:

01
02
03
04
05
06
07
08
09
10
11
12
if ( ! preg_match( «/^[0-9]{1,2}$/», $_GET[‘month’] ) )
{
    // handle error
}
if ( ! preg_match( «/^[0-9]{1,2}$/», $_GET[‘day’] ) )
{
    // handle error
}
if ( ! preg_match( «/^[0-9]{4}$/», $_GET[‘year’] ) )
{
    // handle error
}

В этом примере мы просто проверили (в первых двух операторах if)
для целых чисел [0-9] длиной один или два {1,2}, и мы сделали
то же самое в третьем операторе if, но проверено на строгую длину 4
символы {4}.

Во всех случаях, если данные не соответствуют формату, который мы хотим, мы
вернуть какую-то ошибку. Этот тип проверки оставляет очень мало
комната для любого типа атаки SQL.

Выражения регулярных выражений, подобные приведенным выше, могут быть немного сложными
сначала понять, но объяснение их выходит за рамки этого
статья. Руководство php имеет некоторые дополнительные ресурсы, которые помогут вам с проверкой. База данных PEAR также имеет несколько пакетов, таких как пакет Validate , чтобы помочь с электронными письмами, датами и URL-адресами.

Ниже приведен пример вышеуказанного скрипта в действии, использующего 200 в качестве ввода для месяца, abc для дня и просто 09 для года.

Пример запуска сценария проверки

Веб-приложение обычно принимает входные данные от пользователей и отображает их
каким-то образом. Это, конечно, может быть в самых разных формах
включая комментарии, темы или сообщения в блоге в формате HTML
код. Принимая ввод, разрешение HTML может быть опасной вещью,
потому что это позволяет выполнять JavaScript непреднамеренно.
Если хотя бы одно отверстие оставлено открытым, можно выполнить JavasScript и файлы cookie
может быть угнан. Эти данные куки могут быть использованы для подделки реального
учетной записи и предоставить нелегальному пользователю доступ к данным сайта.

Есть несколько способов защитить себя от таких атак. Один
способ полностью запретить HTML, потому что тогда нет возможности
способ разрешить выполнение любого JavaScript. Однако, если вы сделаете это, то
форматирование также не разрешено, что не всегда подходит для форума
и блог программного обеспечения.

Если вы хотите, чтобы HTML в основном был отключен, но все же хотите разрешить простой
форматирование, вы можете разрешить только несколько выбранных тегов HTML (без
атрибуты), такие как <strong> или <em>. Или, альтернативно,
Вы можете разрешить популярный набор тегов, называемых «BBCode» или «BB Tags»
обычно встречается на форумах в формате [b] test [/ b]. Это может быть
идеальный способ разрешить некоторую настройку форматирования при запрете
ничего опасного. Вы можете реализовать BBCode, используя уже существующие
пакеты, такие как HTML_BBCodeParser или напишите свою собственную реализацию BBCode с регулярными выражениями и рядом операторов preg_replace .

Пример BBCode в действии

Наконец, что не менее важно, это одна из самых известных атак безопасности
в Интернете: инъекция SQL. Атаки SQL-атаки происходят, когда данные отправляются
не проверяется, и приложение не экранирует символы, используемые в SQL
такие строки, как одинарные кавычки (‘) или двойные кавычки («).

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

Взломанный ящик для входа

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

MySQLi позволяет вам сделать это одним из двух способов. Либо с функцией mysqli_real_escape_string при подключении к серверу:

1
2
$username = mysqli_real_escape_string( $GET[‘username’] );
mysql_query( «SELECT * FROM tbl_members WHERE username = ‘».$username.»‘»);

Или с готовыми заявлениями.

Подготовленные операторы — это метод отделения логики SQL от передаваемых ей данных. Функции, используемые в библиотеке MySQLi, фильтруют наш вход для нас, когда мы связываем переменные с подготовленным оператором. Это можно использовать так (при подключении к серверу):

1
2
3
4
$id = $_GET[‘id’];
$statement = $connection->prepare( «SELECT * FROM tbl_members WHERE id = ?» );
$statement->bind_param( «i», $id );
$statement->execute();

При использовании подготовленных операторов нужно отметить одну вещь: «i» в bind_param. i обозначает целое число, но вы можете использовать s для строки, d для double и b для blob в зависимости от того, какие данные мы передаем.

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

Этот короткий урок может только поцарапать поверхность веб-безопасности.
В конечном счете, разработчики должны убедиться, что приложения, которые они
строить безопасно, узнавая о вреде сети и
наиболее распространенные виды уязвимостей и атак. Если вы хотите
Подробнее о проблемах безопасности в PHP читайте в руководстве по безопасности, посвященном их безопасности.

Каковы ваши советы?