Как правильно использовать htmlentities () и работать с XSS, но при этом разрешать кавычки

0

Хорошо, у меня есть форма для создания новой записи. Форма принимает несколько текстовых полей. Перед тем, как поместить их в базу данных, я запускаю поля через htmlentities (поле $, ENT_QUOTES). Это здорово. Я не уязвим для XSS, так как никто не может надеяться вырваться из моих полей.

Например:

Assume the user entered 'Lol <script></script>'

<div>
  <div>Description</div>
  <div>Lol &lt;script&gt;&lt;/script%gt</div>
</div>

Это хорошо и хорошо. Текстовый дисплей хорошо для пользователя. Выдается следующий вопрос

Assume the user entered "John O'Conner"

<div>
  <div>Name</div>
  <div><input name="name" value="John O&#u0039;Conner"</div>
</div>

Это не очень хорошо и хорошо, потому что поле litteraly отображается как "John O & # U0039; Conner". Если я разрешаю кавычки, тогда люди могут выйти из моих полей ввода и ввести XSS.

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

Так же, как на SO. Когда я редактирую сообщение, кавычки и любой случайный текст все еще находятся в поле, но SO невосприимчив к XSS.

Поля заполняются запросом AJAX, который возвращает данные JSON для всех полей.

РЕДАКТИРОВАТЬ:

Босс, ты промахнулся. Я хочу поля ввода. Я просто хочу, чтобы VALUES отображались правильно.

<input id="name" name="name" value="" />
.
.
.
<script>
    //AJAX request to fill fields here
</script>

Если пользователь вводит "cat", поле ввода становится:

  <input id="name" name="name" value="cat" />

и в поле отображается слово "cat".

Если пользователь входит в John O'Conner, поле ввода становится:

  <input id="name" name="name" value="John O&#u0039;Conner" />

и слово "Джон О'Коннер" отображается в поле (не хорошо).

Если бы я разрешил кавычки, которые пользователь мог бы ввести в "John" onmouseover = "alert (3)", "data-dummy =" Conner "и поле ввода станет:

  <input id="name" name="name" value="John" onmouseover="alert(3);" data-dummy="Conner" />

EDIT: Я закончил делать:

                      var dummy = $("<div></div>");
          //Itterate through the JSON object 
          $.each(returned_data, function(key,val) {
              dummy.html(val)
              $("#"+key).val(dummy.html());
          });
  • 0
    html_entity_decode() при отображении данных, закодированных htmlentities()
  • 0
    Да, но тогда это оставляет мой сайт открытым для уязвимостей, так как пользователь может ввести следующее: John O "onmouseover =" alert (3); "data-dummy =" Conner
Показать ещё 4 комментария
Теги:
xss
html-entities

1 ответ

1

Используйте эту функцию для дезинфекции данных перед вставкой в базу данных

function sanitize($data){
    $data= htmlentities(strip_tags(trim($data)));
    return $data;
} 

strip_tags() - удаляет теги

PHP Doc

html_entity_decode() - это противоположность htmlentities() тем, что он преобразует все объекты HTML в строку в соответствующие символы.

Обновить:

Используйте их лучше всего для вас:

<?php    
$str = '<input value="John O" onmouseover="alert(3);" data-dummy="Conner" /> say me';
    $search = array('@<script[^>]*?>.*?</script>@si',  // Strip out javascript
                   '@<[\/\!]*?[^<>]*?>@si',            // Strip out HTML tags
                   '@<style[^>]*?>.*?</style>@siU',    // Strip style tags properly
                   '@<![\s\S]*?--[ \t\n\r]*>@'         // Strip multi-line comments including CDATA
    ); 
    $str = preg_replace($search, '', $str); 
    echo htmlentities(strip_tags($str));
?>

Вывод:

say me

Я беру эту часть из моего другого ответа, прочитав этот вопрос. Безопасный путь

$name = "Mom's";
$db = new PDO('mysql:host=localhost;dbname=databasename', $user, $pass); 
//establish new connection

$statement = $database->prepare("UPDATE TABLE xyz SET name=?");
$statement->execute(array($name));

Это будет более безопасно. Вам не нужно делать ручные экраны.

Или используйте

$msg =  mysql_real_escape_string($string);

перед вставкой данных

  • 0
    Как указано в моем комментарии Да, но тогда это оставляет мой сайт открытым для уязвимостей, так как пользователь может ввести следующее: John O "onmouseover =" alert (3); "data-dummy =" Conner. Что означает <input value = "John O" onmouseover = "alert (3);" data-dummy = "Conner" />
  • 0
    Я отредактировал свой оригинальный вопрос

Ещё вопросы

Сообщество Overcoder
Наверх
Меню