Для моего приложения, написанного на 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 (обычный))
Что вы дезинфицируете против? Если вы [только] пытаетесь защитить свою базу данных 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 небезопасен.
Я хотел бы начать с регулярного выражения каждой переменной, применять ноль, если она не соответствует требованиям. Либо проверьте, что он ДОЛЖЕН иметь, либо что он не должен иметь, в зависимости от того, что меньше:
$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)