Я приветствую ваши усилия. Вы должны, дружелюбный член сообщества, подумать о разделении своих операций.
1) Иметь одну функцию/подпрограмму/класс/метод для фильтрации входных данных (filter_input_array()
, strip_tags()
, str_ireplace()
, trim()
и т. д.). Вы можете захотеть создать функции, которые используют циклы для фильтрации. Такие приемы, как двойное кодирование, одноразовая подмена полосы и другие, могут победить однократное использование таких вещей, как strip_tags()
.
Вот метод оболочки strip_tags()
из моего класса Sanitizer
. Обратите внимание, как он сравнивает старое значение с новым значением, чтобы убедиться, что они равны. Если они не равны, он продолжает использовать strip_tags()
. Хотя перед выполнением этого метода выполняется предварительная проверка INPUT_POST / $_POST. Другая версия этого с использованием trim()
фактически выполняется перед этой.
private function removeHtml(&$value)
{
if (is_scalar($value)) {
do {
$old = $value;
$value = strip_tags($value);
if ($value === $old) {
break;
}
} while(1);
} else if (is_array($value) && !empty($value)) {
foreach ($value as $field => &$string) {
do {
$old = $string;
$string = strip_tags($string);
if ($string === $old) {
break;
}
} while (1);
}
} else {
throw new Exception('The data being HTML sanitized is neither scalar nor in an array.');
}
return;
}
2) Есть еще один для проверки ввода (filter_var_array()
, preg_match()
, mb_strlen
и т. д.)
Затем, когда вашим данным нужно переключить контексты...
A) Для баз данных используйте подготовленные операторы (предпочтительно PDO
).
B) Для возврата/передачи ввода пользователя в браузер экранируйте вывод с помощью htmlentities()
или htmlspecialchars
соответственно.
Что касается магических кавычек, лучше всего просто отключить их в файле php.ini
.
Теперь, когда эти различные конструкции имеют свои собственные области ответственности, все, что вам нужно сделать, это управлять потоком логики и данных внутри вашего файла обработчика. Сюда входит предоставление пользователю сообщений об ошибках (при необходимости) и обработка ошибок/исключений.
Нет необходимости сразу использовать htmlentities()
или htmlspecialchars
, если данные поступают из HTML-формы непосредственно в базу данных. Смысл экранирования данных состоит в том, чтобы предотвратить их интерпретацию как исполняемые инструкции внутри нового контекста. Нет никакой опасности, которую htmlentities()
или htmlspecialchars
могут устранить при передаче данных в механизм запросов SQL (именно поэтому вы фильтруете и проверяете ввод и используете (PDO
) подготовленные операторы).
Однако после того, как данные извлекаются из таблиц базы данных и непосредственно предназначены для браузера, хорошо, теперь используйте htmlentities()
или htmlspecialchars
. Создайте function
, который использует цикл for
или foreach
для обработки этого сценария.
Вот фрагмент из моего класса Escaper
public function superHtmlSpecialChars($html)
{
return htmlspecialchars($html, ENT_QUOTES | ENT_HTML5, 'UTF-8', false);
}
public function superHtmlEntities(&$html)
{
$html = htmlentities($html, ENT_QUOTES | ENT_HTML5, 'UTF-8', false);
}
public function htmlSpecialCharsArray(array &$html)
{
foreach ($html as &$value) {
$value = $this->superHtmlSpecialChars($value);
}
unset($value);
}
public function htmlEntitiesArray(array &$html)
{
foreach ($html as &$value) {
$this->superHtmlEntities($value);
}
unset($value);
}
Вам придется адаптировать свой код к своим личным вкусам и ситуации.
Обратите внимание: если вы планируете обрабатывать данные перед их отправкой в браузер, сначала выполните обработку, а затем выйдите с помощью удобной функции цикла htmlentities()
или htmlspecialchars
.
Ты можешь это сделать!
person
Anthony Rutledge
schedule
19.02.2017
PDO
для обработки взаимодействий с базой данных. php.net/manual/en/book.pdo.php - person Anthony Rutledge   schedule 19.02.2017clean
. - person IMSoP   schedule 19.02.2017