Каковы лучшие входные функции очистки PHP?

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

file.getSignedUrl({
    action: 'read',
    expires: '03-17-2025',
    content_type: 'audio/mp3'
})

является ответом.

158
задан Abraham Hernandez 29 August 2018 в 19:17
поделиться

8 ответов

Это - 1 из способа, которым я в настоящее время практикую,

  1. Имплантат csrf, и соль заставляет маркер наряду с запросом быть сделанным пользователем и проверять их всех вместе от запроса. Относятся Здесь
  2. , гарантируют не слишком много доверия клиентским cookie и удостоверяются к практике с помощью серверных сессий
  3. , когда любые данные парсинга, удостоверьтесь, чтобы признать, что только тип данных и метод передачи (такой как POST и ДОБИРАТЬСЯ)
  4. Удостоверяются, что использовали SSL для веб-приложения/Приложения
  5. , Удостоверяются, что также генерировали запрос сессии основы времени для ограничения спам-запроса намеренно.
  6. , Когда данные анализируются к серверу, удостоверьтесь, что проверили запрос, должен быть сделан в datamethod u требуемым, таком как json, HTML, и и т.д.... и затем продолжиться
  7. Escape, который все недопустимые атрибуты от входа с помощью Escape вводят..., такие как realescapestring.
  8. после этого проверяют onlyclean формат типа данных, который Вы хотите от пользователя.
    Пример:
    - электронная почта: проверьте, находится ли вход в формате
    действующего адреса электронной почты - текст/строка: Проверьте, что только вход является только текстовым форматом (строка)
    - число: проверьте, что только числовой формат позволяется.
    - и т.д. Pelase обращаются к php библиотеке контроля ввода от php портала
    - Когда-то проверил, продолжите двигаться с помощью подготовленного SQL-оператора/PDO.
    - Когда-то сделанный, удостоверьтесь, что вышли и завершились, соединение
    - не забывают очищать выходное значение, однажды сделанное.

Thats все, чему я верю, достаточно достаточно в течение основной секунды. Это должно предотвратить все основное нападение от хакера.

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

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

0
ответ дан 23 November 2019 в 21:38
поделиться

Это зависит от типа данных, которые вы используете. Обычно лучше всего использовать mysqli_real_escape_string , но, например, вы знаете, что HTML-содержимого не будет, использование strip_tags повысит безопасность.

Вы также можете удалить символы, которые, как вам известно, недопустимы.

2
ответ дан 23 November 2019 в 21:38
поделиться

Мои 5 центов.

Здесь никто не понимает, как работает mysql_real_escape_string . Эта функция ничего не фильтрует и не «дезинфицирует».
Итак, вы не можете использовать эту функцию как некий универсальный фильтр, который избавит вас от инъекций.
Вы можете использовать его только тогда, когда понимаете, как он работает и где это применимо.

У меня есть ответ на очень похожий вопрос, который я уже писал: В PHP при отправке строк в базу данных следует ли мне заботиться о недопустимых символах с помощью htmlspecialchars () или использовать регулярное выражение?
Щелкните, чтобы получить полное объяснение безопасности на стороне базы данных.

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

Хотя я бы посоветовал воздержаться от проступков. Эта функция давно устарела. Если вы хотите заменить только символы <, > и " в целях безопасности HTML - используйте функцию, специально разработанную для этой цели - htmlspecialchars () один.

5
ответ дан 23 November 2019 в 21:38
поделиться

Стой!

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

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

Санитарная обработка и проверка данных пользователя

Когда пользователи отправляют данные, вы должны убедиться, что они предоставили то, что вы ожидаете.

Санитарная обработка и фильтрация

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

А как насчет текстовых полей произвольной формы и текстовых полей? Вам нужно убедиться, что в этих полях нет ничего неожиданного. В основном вам необходимо убедиться, что поля, которые не должны содержать HTML-содержимого, на самом деле не содержат HTML. Есть два способа решить эту проблему.

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

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

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

Проверка

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

Если вы ожидаете числа от 1 до 10, вам нужно проверить это значение. Если вы используете один из этих новых причудливых числовых входов эпохи HTML5 со счетчиком и шагами, убедитесь, что отправленные данные соответствуют шагу.

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

А как насчет ввода текста, который удовлетворяет другие потребности? Например, ввод даты должен проверяться с помощью strtotime или класса DateTime . Данная дата должна находиться в диапазоне, который вы ожидаете. А как насчет адресов электронной почты? Ранее упомянутое расширение фильтра может проверять правильность формата адреса, хотя я фанат библиотеки is_email .

То же самое верно для всех других элементов управления формой. Есть радио-кнопки? Проверить по списку. Есть флажки? Проверить по списку. Есть файл для загрузки? Убедитесь, что файл имеет ожидаемый тип, и относитесь к имени файла как к нефильтрованным данным пользователя.

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

Экранирование данных для хранения

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

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

Одним из лучших способов работы с большинством баз данных SQL в PHP является расширение PDO . Он следует общему шаблону подготовки оператора , привязки переменных к оператору , затем отправки оператора и переменных на сервер . Если вы не работали с PDO до , вот неплохое руководство по MySQL .

Некоторые базы данных SQL имеют свои собственные специальные расширения в PHP, включая SQL Server , PostgreSQL и SQLite 3 . Каждое из этих расширений имеет поддержку подготовленных операторов, которая работает в том же режиме подготовки-связывания-выполнения, что и PDO. Иногда вам может потребоваться использовать эти расширения вместо PDO для поддержки нестандартных функций или поведения.

MySQL также имеет свои собственные расширения PHP. Фактически их двое.Вы хотите использовать только тот, который называется mysqli . Старое расширение "mysql" было устаревшим и небезопасно и небезопасно для использования в современную эпоху.

Я лично не поклонник mysqli.То, как он выполняет привязку переменных к подготовленным операторам, негибко и может быть проблематичным в использовании. В случае сомнений используйте PDO.

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

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

Экранирование данных для презентации

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

При отправке HTML вы почти всегда должны передавать любые данные, которые изначально были предоставлены пользователем через htmlspecialchars . Фактически, единственный раз, когда вы не должны этого делать, - это когда вы знаете , что пользователь предоставил HTML, и что вы знаете , что он уже был очищен с помощью белого списка.

Иногда вам нужно сгенерировать некоторый Javascript с помощью PHP. Javascript не имеет тех же правил экранирования, что и HTML! Безопасный способ передать пользовательские значения в Javascript через PHP - использовать json_encode .

И многое другое

Есть еще много нюансов проверки данных.

Например, кодирование набора символов может быть огромной ловушкой . Ваше приложение должно следовать методикам, изложенным в « UTF-8 на всем протяжении ».Существуют гипотетические атаки, которые могут возникнуть, если вы обрабатываете строковые данные как неправильный набор символов.

Ранее я упоминал инструменты отладки браузера. Эти инструменты также можно использовать для управления данными файлов cookie. Файлы cookie следует рассматривать как ненадежный пользовательский ввод .

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

421
ответ дан 23 November 2019 в 21:38
поделиться

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

Что касается удаления HTML, strip_tags, вероятно, является лучшей идеей для удаления HTML, поскольку он просто удалит все. htmlentities делает то, на что похоже, так что это тоже работает. Если вам нужно разобрать, какой HTML разрешить (то есть, вы хотите разрешить некоторые теги), вам следует использовать зрелый существующий парсер, такой как HTML Purifier

32
ответ дан 23 November 2019 в 21:38
поделиться

Для вставки базы данных все, что вам нужно, это mysql_real_escape_string (или используйте параметризованные запросы). Обычно вы не хотите изменять данные перед их сохранением, что могло бы произойти, если бы вы использовали htmlentities . Это приведет к беспорядку позже, когда вы снова запустите его через htmlentities , чтобы отобразить его где-нибудь на веб-странице.

Используйте htmlentities , когда вы показываете данные где-нибудь на веб-странице.

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

$input = preg_replace('/\s+/', ' ', $input);

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

2
ответ дан 23 November 2019 в 21:38
поделиться

Ввод данных в базу данных - как предотвратить SQL-инъекцию

  1. Проверьте правильность данных типа integer, например, убедившись, что это действительно целое число.
    • В случае нестроковых данных необходимо убедиться, что данные действительно являются правильным типом
    • В случае строковых данных необходимо убедиться, что строка окружена кавычками в запросе (очевидно, иначе это даже не будет работать)
  2. Введите значение в базу данных, избегая SQL инъекций (mysql_real_escape_string или параметризованные запросы)
  3. При извлечении значения из базы данных убедитесь, что атаки Cross Site Scripting не могут быть внедрены в страницу (htmlspecialchars)

Вам нужно экранировать пользовательский ввод перед вставкой или обновлением в базе данных. Вот старый способ сделать это. Сейчас вы хотите использовать параметризованные запросы (вероятно, из класса PDO).

$mysql['username'] = mysql_real_escape_string($clean['username']);
$sql = "SELECT * FROM userlist WHERE username = '{$mysql['username']}'";
$result = mysql_query($sql);

Вывод данных из базы данных - Как предотвратить XSS (Cross Site Scripting)

Используйте htmlspecialchars() только при выводе данных из базы данных. То же самое относится и к HTML Purifier. Пример:

$html['username'] = htmlspecialchars($clean['username'])

И наконец... то, что вы просили

Я должен отметить, что если вы используете объекты PDO с параметризованными запросами (правильный способ сделать это), то действительно нет простого способа достичь этого. Но если вы используете старый способ 'mysql', то вот что вам понадобится.

function filterThis($string) {
    return mysql_real_escape_string($string);
}
11
ответ дан 23 November 2019 в 21:38
поделиться

Вы используете mysql_real_escape_string () в коде, аналогичном приведенному ниже.

$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
  mysql_real_escape_string($user),
  mysql_real_escape_string($password)
);

Как сказано в документации, его цель - экранирование специальных символов в строке, переданной в качестве аргумента, с учетом текущего набора символов соединения, чтобы его можно было безопасно поместить в mysql_query () . В документации также добавлено:

Если должны быть вставлены двоичные данные, необходимо использовать эту функцию.

htmlentities () используется для преобразования некоторых символов в сущностях, когда вы выводите строку в содержимом HTML.

0
ответ дан 23 November 2019 в 21:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: