Безопасность PHP (strip_tags, htmlentities)

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

function clean($input){
if (is_array($input)){
foreach ($input as $key => $val){
$output[$key] = clean($val);
}
}else{
$output = (string) $input;
if (get_magic_quotes_gpc()){
$output = stripslashes($output);
}
$output = htmlentities($output, ENT_QUOTES, 'UTF-8');

}
return $output;
}

Это достаточно, или я должен использовать следующий код?

        $output = mysqli_real_escape_string($base, $input);
$output = strip_tags($output);

Извините, это может быть глупым вопросом, но я хотел бы избежать проблем со мной, код 🙂
Спасибо за вашу помощь

5

Решение

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

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, так далее…)

Затем, когда ваши данные должны поменять контекст …

) Для баз данных используйте подготовленные заявления (PDOпредпочтительно).

В) Для возвращения / передачи пользовательский ввод в браузер, экранируйте выход с помощью 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 функция зацикливания.

Ты можешь это сделать!

5

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

Сценарий использования для обоих strip_tags() and htmlentities or htmlspecialchars().

1.) Если вы хотите удалить любые html-элементы из форм ввода, которые могут быть уязвимы для атаки XSS, используйте
strip_tags() функция до внесения в базу данных
пример

$data= strip_tags('<b>Hello</b>');

Ваш вывод будет «Привет», и это то, что будет передано на сервер.

2.) Если вы хотите распечатать данные в браузере или на экране, вы можете использовать htmlentities() or htmlspecialchars()
ниже приведен сценарий использования, где его можно использовать.

//DB PDO Connect....
$result2 = $db->prepare('select * from users where uid=:uid');
$result2->execute(array(':uid' =>'1'));

while ($row = $result2->fetch()) {$pic=htmlentities($row['profilepic'], ENT_QUOTES, "UTF-8");
}

Затем вы можете распечатать $ pic в любом месте и освободиться от XSS Attack ….

0

По вопросам рекламы [email protected]