Хорошо, у меня есть форма для создания новой записи. Форма принимает несколько текстовых полей. Перед тем, как поместить их в базу данных, я запускаю поля через htmlentities (поле $, ENT_QUOTES). Это здорово. Я не уязвим для XSS, так как никто не может надеяться вырваться из моих полей.
Например:
Assume the user entered 'Lol <script></script>'
<div>
<div>Description</div>
<div>Lol <script></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());
});
Используйте эту функцию для дезинфекции данных перед вставкой в базу данных
function sanitize($data){
$data= htmlentities(strip_tags(trim($data)));
return $data;
}
strip_tags() -
удаляет теги
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);
перед вставкой данных
html_entity_decode()
при отображении данных, закодированныхhtmlentities()