валидация — ввод PHP GET vars sanitizing

Для моего приложения, написанного на PHP 5+, у меня есть common.php который включен со всех других страниц. В этом у меня есть include sanitize.php которая направлена ​​на санацию любых входных переменных, используемых в URL. Итак, таргетинг $_GET[] ценности.

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

Я вижу, что нет никакого аккуратного способа очистки, основанного на ожидаемых / желаемых данных. Метод, на который я сначала смотрел, был таким sanitize.php имея foreach для обхода любых переменных, найдите требуемый тип очистки и добавьте очищенные переменные в отдельный массив для использования в моем коде.

Вместо того, чтобы использовать фильтры очистки PHP, чтобы сохранить его стандарт, я решил использовать регулярные выражения. Типы, которые я хочу alphaonly, алфавитно-цифровой, Эл. адрес, пароль. Хотя «пароль» позволил бы некоторые специальные символы, я хочу удалить или даже избежать потенциально «опасных», таких как ' " чтобы затем быть включены в MySQL БД. У нас есть европейская база пользователей, поэтому возможны разные локали, но я надеюсь, что это не будет большой проблемой.

Будет ли это «хорошим» решением для начала или я пытаюсь заново изобрести колесо?

Случайная страница

/mypage.php?c=userid&p=lkasjdlakjsdlakj&z=....
(use SANITIZED_SAFE_INPUT_VARS variable only)

sanitize.php

var aryAllowedGetParamNames = array(
"c" => "alphaonly",         //login
"p" => "alphaemail",        //password
"e" => "email"              //email
//...
);

var sanitizeTypes = array (
"alphaonly" => "[a-zA-Z]",
"alphanumeric" => "[a-zA-Z0-9]",
"email" => "[a-zA-Z0-9]...etc");

var SANITIZED_SAFE_INPUT_VARS = array();

foreach ($_GET as $key => $value) {
//apply regex and add value to SANITIZED_SAFE_INPUT_VARS
}

РЕДАКТИРОВАТЬ

Кажется, что есть мнение об использовании паролей в URL. Я объясню немного подробнее. Вместо использования приглашения POST с именем пользователя и паролем я использую асинхронный вызов ajax для _db_tryLogin.php с параметрами для ИД пользователя и пароля. Имя пользователя ВСЕГДА — текстовая строка, состоящая только из 6 альф, а пароль — md5 того, что было введено. Мне известно о мнении о том, что MD5 недостаточно «безопасен».

JS в настоящее время MD5s пароль и отправляет его на _db_tryLogin.php,

-> async : _db_login.php?c=ABCDEF&p=SLKDauwfLKASFUWPOjkjafkKoAWOIFHF2733287

Это вернет асинхронный ответ «1» или «0». Оба приведут к обновлению страницы, но если _db_tryLogin.php Страница обнаруживает пароль, а идентификатор пользователя совпадает с одной записью в БД, затем устанавливаются переменные сеанса, и сайт знает, что пользователь вошел в систему.

Я использовал MD5 для асинхронного запроса просто для быстрого хеширования пароля, чтобы он не передавался в виде открытого текста.

_db_tryLogin.php принимает пароль, который md5(plainpass) снова добавляет SALT и MD5, и затем это сравнивается с пользователем в БД.

Пароль БД хранится = md5 (SALT.md5 (обычный))

2

Решение

Что вы дезинфицируете против? Если вы [только] пытаетесь защитить свою базу данных SQL вы делаете это неправильно, и должны смотреть в Подготовленные заявления.

Пользователь должен предоставить данные НИКОГДА БЫТЬ ДОВЕРЕННЫМ. Принято, да, доверено — нет.

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

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

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

3) используя критерии, определенные в (2), вы можете использовать регулярное выражение для удаления недопустимых символов, чтобы вернуть «безопасный» набор переменных.

пример:

   // Remove backtick, single and double quotes from a variable.
// using PCRE Regex.
$data = preg_relace("/[`"']/","",$data);

4) Используйте функцию PHP strip_tags() сделать это и удалить код HTML и PHP из строки.

5) Для проверки электронной почты используйте PHP $email = filter_var($data, FILTER_SANITIZE_EMAIL); функция, это будет намного лучше, чем ваш собственный регулярное выражение. использование Проверка фильтра PHP они предназначены именно для вашей ситуации.

6) НИКОГДА доверять выходным данным, даже если они проходят все проверки и регулярные выражения, которые вы можете дать, что-то может еще пройти. ВСЕГДА следует ОЧЕНЬ с осторожностью относиться к предоставленным пользователем данным. НИКОГДА доверяй этому.

7) Используйте подготовленные операторы для ваших взаимодействий SQL.

8) В качестве ярлыка для числовых типов (int / float) вы можете использовать приведение типов PHP к сила данные переменные для того, чтобы быть определенным типом и уничтожить любой шанс того, что это будет что-то еще:

$number = $_GET['number']; //can be anything.
$number = (int)$_GET['number']; //must be an integer or zero.
  • Пароли должны не быть a-z только, но должно быть столько символов, сколько вы можете выбрать, чем больше, тем лучше.

  • Если предпринимаемые вами действия направлены на защиту безопасности и целостности базы данных, вы делаете это неправильно и должны использовать Подготовленные заявления для ваших взаимодействий MySQL.

  • Прекратить использование var объявлять переменные как это из PHP4 и ОЧЕНЬ стар, гораздо лучше использовать переменную предусловие $ (такие как $variable = true;)

  • Вы заявляете:

    У нас есть европейская база пользователей, поэтому возможны разные локали

    На что я очень рекомендую исследовать PHP mb_string функции потому что изначально PHP небезопасен.

1

Другие решения

Я хотел бы начать с регулярного выражения каждой переменной, применять ноль, если она не соответствует требованиям. Либо проверьте, что он ДОЛЖЕН иметь, либо что он не должен иметь, в зависимости от того, что меньше:

$safeValue = (preg_match('/^[a-zA-Z0-9]{0,5}$/',$value) ? $value : "");

ДОЛГО с подготовленными заявлениями с параметром ввода ака

$query = "SELECT x FROM table WHERE id=?";
bind_param("si",$var,$var)

PHP также поставляется со встроенными фильтрами, такими как электронная почта и другие). Пример: filter_var($data, FILTER_SANITIZE_EMAIL)

http://php.net/manual/en/filter.filters.sanitize.php

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector