Я имел, это происходит со мной. К сожалению, это вызывается браузером, берущим разрывы строки между элементами списка и представляющим их как пробелы. Для фиксации измените HTML на:
<div id="footer">
<ul>
<li><a href="one.html">One</a></li><li><a href="two.html">Two</a></li><li><a href="three.html">Three</a></li><li><a href="four.html">Four</a></li><li><a href="five.html">Five</a></li>
</ul>
</div>
Это вполне разумный подход. Для типичных приложений этого будет вполне достаточно.
Самая сложная часть необработанного HTML белого списка - это атрибут стиля
и объект embed
/
. Существуют законные причины, по которым кто-то может захотеть поместить стили CSS в ненадежный блок форматированного текста или, скажем, во встроенное видео YouTube. Эта проблема чаще всего возникает с фидами. Вы можете' • доверять произвольному блоку текста, содержащемуся в записи фида, но вы не хотите вырезать, например, выделение синтаксиса CSS или флэш-видео, потому что это коренным образом изменит контент и потенциально запутает любого, кто его читает. Поскольку CSS может содержать опасные вещи, такие как поведение в IE, вам, возможно, придется проанализировать CSS, если вы решите оставить атрибут стиля . И с embed
/ объект
вам может потребоваться занести имена хостов в белый список.
Дополнение:
В худшем случае HTML-код, скрывающий все, что находится на виду, может привести к очень плохому взаимодействию с пользователем. Намного лучше использовать что-то вроде одного из парсеров HTML5, чтобы пройти через DOM с вашим белым списком. Это гораздо более гибко с точки зрения того, как вы представляете очищенный вывод своим пользователям. Вы даже можете делать такие вещи, как:
<div class="sanitized">
<div class="notice">
This was sanitized for security reasons.
</div>
<div class="raw"><pre>
<script>alert("XSS!");</script>
</pre></div>
</div>
Затем скройте материал .raw
с помощью CSS и используйте jQuery для привязки обработчика кликов к .sanitized
div
, который переключает между .raw
] и .notice
:
CSS:
.raw {
display: none;
}
jQuery:
$('.sanitized').click(function() {
$(this).find('.notice').toggle();
$(this).find('.sanitized').toggle();
});
Белый список - хороший ход. Любое решение из черного списка склонно пропускать больше, чем должно, потому что вы просто не можете думать обо всем. Я видел несколько попыток использования черных списков (например, The Code Project), и если им удается уловить все, обычно они по-прежнему вызывают дополнительные проблемы, такие как замена символов в коде, чтобы его нельзя было использовать без предварительного восстановления вручную .
Самый безопасный метод:
HTML-кодирование всего текста.
Сопоставление набора разрешенных тегов и атрибутов и их декодирование.
Используя регулярное выражение, вы даже можете потребовать, чтобы каждый открывающий тег имел закрывающий тег, чтобы незакрытый тег не мог испортить страницу.
Вы должны иметь возможность сделать это примерно в десяти строках кода, поэтому код, на который вы ссылаетесь, кажется чрезмерно сложным.