Я самостоятельно изучаю PHP, и мне стало известно о функции strip_tags().Это единственный способ повысить безопасность?

StackOverflow https://stackoverflow.com/questions/2258808

  •  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).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top