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