addslashes
не имеет отношения к XSS (и в тех местах, где это действительно полезно, почти всегда что-то лучше).
htmlspecialchars
не является небезопасным подходом. Это просто недостаточно.
htmlspecialchars
защитит вас, если вы разместите контент как тело «безопасного» элемента.
Он защитит вас, если вы поместите содержимое как значение «безопасного» атрибута, если вы также правильно указали значение.
Это не защитит вас, если вы поместите его в качестве значения «опасным» атрибута или элемента (где содержание может рассматриваться как JavaScript), такие как <script>
, onmoseover
, href
или style
.
Например:
<!-- http://example.com/my.php?message=", steal_your_cookies(), " -->
<!-- URL not encoded for clarity. Imagine the definition of steel_your_cookies was there too -->
<button onclick='alert("<?php echo htmlspecialchars($_GET['message']); ?>")'>
click me
</button>
даст вам:
<button onclick='alert("", steal_your_cookies(), "")'>
click me
</button>
, что означает то же самое, как:
<button onclick='alert("", steal_your_cookies(), "")'>
click me
</button>
, который будет воровать ваши куки при нажатии кнопки кнопка.
... или используйте библиотеку для дезинфекции вашего продукта, например: http://htmlpurifier.org/ - гораздо меньше головной боли, чем подход RYO (особенно, когда вы имеете дело с языком, отличным от английского, с кодировку UTF-8, и вы хотите ß, а не 'ß'); он также обеспечивает действительную разметку. – CD001