Безопасность 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); 

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

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

1 ) Имейте одну функцию / подпрограмму / класс / метод для фильтрации входных данных ( filter_input_array() , strip_tags() , str_ireplace() , trim() и т. Д.). Возможно, вы захотите создать функции, которые используют петли для фильтрации. Трюки, такие как двойное кодирование, одноразовое strip_tags() и многое другое, могут победить одно использование таких вещей, как 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() из выхода с помощью 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); } с 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); } с 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 .

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

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

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

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

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

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.