Я самостоятельно изучаю PHP, и мне стало известно о функции strip_tags().Это единственный способ повысить безопасность?
-
20-09-2019 - |
Вопрос
Я новичок в PHP, и я следую приведенному здесь руководству:Ссылка
Довольно страшно, что пользователь может написать php-код во входных данных и, по сути, испортить ваш сайт, не так ли?
Что ж, теперь я немного параноик и предпочел бы сразу изучить лучшие методы обеспечения безопасности, чем пытаться впихнуть их в себя, как только у меня появятся кое-какие привычки.
Поскольку я совершенно новичок в PHP (буквально освоил его два дня назад), я могу легко выучить практически все, не запутываясь.
Каким еще способом я могу предотвратить махинации на моем сайте?:D
Решение
При разработке PHP-приложения следует учитывать несколько вещей: strip_tags()
помогает только с одним из них.На самом деле strip_tags()
, хотя и эффективен, может даже сделать больше, чем необходимо:преобразование потенциально опасных символов с помощью htmlspecialchars()
должно быть даже предпочтительнее, в зависимости от ситуации.
В целом все сводится к двум простым правилам:фильтровать весь ввод, экранировать весь вывод. Теперь вам нужно понять, что именно представляет собой ввод и вывод.
Вывод прост: все, что ваше приложение отправляет в браузер, выводится, поэтому используйте htmlspecialchars()
или любую другую экранирующую функцию каждый раз, когда вы выводите данные, которые вы не писали сами.
Ввод — это любые данные, не закодированные жестко в вашем PHP-коде:вещи, поступающие из формы через POST, из строки запроса через GET, из файлов cookie и т. д. должен фильтроваться наиболее подходящим способом в зависимости от ваших потребностей.Даже данные, поступающие из базы данных, следует считать потенциально опасными;особенно на общем сервере, вы никогда не знаете, была ли база данных скомпрометирована где-то еще, что может повлиять и на ваше приложение.
Существуют различные способы фильтрации данных:белые списки, разрешающие только выбранные значения, проверка на основе ожидаемого формата ввода и т. д.Я никогда не предлагаю исправлять данные, которые вы получаете от пользователей:пусть они играют по вашим правилам; если вы не получаете того, что ожидаете, отклоните запрос вместо того, чтобы пытаться его очистить.
Особое внимание, если вы имеете дело с базой данных, необходимо уделить SQL-инъекциям:такого рода атака основана на неправильном построении строк запроса, которые вы отправляете в базу данных, чтобы злоумышленник мог подделать их, пытаясь выполнить вредоносную инструкцию.Вы всегда должны использовать экранирующую функцию, например mysql_real_escape_string()
или, лучше, используйте подготовленные операторы с расширение mysqli или используя ПДО.
По этой теме есть что сказать, но эти моменты должны помочь вам начать.
ХТХ
РЕДАКТИРОВАТЬ:Чтобы уточнить, под «фильтрацией ввода» я имею в виду решение, что хорошо, а что плохо, а не каким-либо образом изменяю входные данные.Как я уже сказал, я никогда не буду изменять пользовательские данные, если они не выводятся в браузер.
Другие советы
Strip_tags на самом деле не лучший вариант, он не защищает во всех случаях.
HTML-очистка:http://htmlpurifier.org/
Это действительно хороший вариант для обработки входящих данных, однако он сам по себе не подходит для всех случаев использования, но это определенно хорошая отправная точка.
Я должен сказать, что Учебник вы упомянули, что это немного вводит в заблуждение относительно безопасности:
Важно отметить, что вы никогда не захотите напрямую работать со значениями $_GET и $_POST.Всегда отправляйте их значение в локальную переменную и работайте с ней там.Существует несколько последствий для безопасности, связанных со значениями при непосредственном доступе (или выводе) к $_GET & $_POST.
Это чепуха.Копирование значения в локальную переменную не более безопасно, чем прямое использование переменных $_GET или $_POST.
На самом деле, в любых данных нет ничего по своей сути небезопасного.Важно то, что что вы с этим делаете.Существуют вполне законные причины, по которым у вас может быть переменная $_POST, которая содержит ; rm -rf /
.Это прекрасно подходит, например, для вывода на HTML-странице или хранения в базе данных.
Единственный раз, когда это небезопасно, - это когда вы используете команду типа system
или exec
.И это то время, когда вам нужно беспокоиться о том, какие переменные вы используете.В этом случае вы, вероятно, захотите использовать что-то вроде белого списка или, по крайней мере, прогнать свои значения через escapeshellarg
.
Аналогично с отправкой запросов к базам данных, отправкой HTML-кода в браузеры и так далее.Экранируйте данные непосредственно перед отправкой их куда-либо еще, используя соответствующий метод экранирования для пункта назначения.
Strip_tags удаляет каждый фрагмент HTML.более сложные решения основаны на белых списках (т.е.разрешение определенных тегов HTML).хорошая библиотека белых списков — htmlpurifyer http://htmlpurifier.org/
и, конечно же, на стороне базы данных используйте такие функции, как mysql_real_escape_string или pg_escape_string
Ну, возможно я ошибаюсь, но...Во всей литературе, которую я читал, люди говорят, что гораздо лучше использовать htmlspellchars.
Кроме того, весьма необходимо привести входные данные.(например, для int, если вы уверены, что это идентификатор пользователя).
Ну и заранее, когда вы начнете использовать базу данных - используйте mysql_real_escape_string вместо mysql_escape_string, чтобы предотвратить SQL-инъекции (в некоторых старых книгах до сих пор пишется mysql_escape_string).