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