2014-12-02 1 views
4

Предположим, что некоторый PHP-код, который перекликается с входом, дезинфицированным, сначала применяя addslashes(), а затем htmlspecialchars() к HTML-документу. Я слышал, что это небезопасный подход, но не могу понять, почему.Обтекание htmlspecialchars (добавление) (для ввода)) для инъекции HTML/JavaScript

Любые предложения относительно того, какое форматирование может быть применено к опасному вводу, например JavaScript в тегах скриптов, можно обойти меры безопасности, наложенные этими двумя функциями.

+0

... или используйте библиотеку для дезинфекции вашего продукта, например: http://htmlpurifier.org/ - гораздо меньше головной боли, чем подход RYO (особенно, когда вы имеете дело с языком, отличным от английского, с кодировку UTF-8, и вы хотите ß, а не 'ß'); он также обеспечивает действительную разметку. – CD001

ответ

3

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("&quot;, steal_your_cookies(), &quot;")'> 
    click me 
</button> 

, что означает то же самое, как:

<button onclick='alert("", steal_your_cookies(), "")'> 
    click me 
</button> 

, который будет воровать ваши куки при нажатии кнопки кнопка.

+0

Я думал, что было бы прекрасно вставлять переменные внутри «небезопасных» элементов и атрибутов, если это значение сбрасывается с помощью htmlspecialchars И правильно цитируется. Ускорение удаляет символы кавычек, поэтому вам нужно снова окружить содержимое. Например. var a = ' '; – Phil

+0

@ Phil_1984_ - Нет. Он не удаленно безопасен. Escaping не удаляет символы кавычек. Это ускользает от них, поэтому они обрабатываются как контент, а не HTML. Это означает, что в небезопасном контексте (например, 'onclick = 'alert (" ");'' Пользователь может ввести '' 'и иметь его обрабатывается как JavaScript '' 'вместо HTML' ''. Это позволяет им помещать туда любой JS, который им нравится. Это не безопасно! – Quentin

+0

@ Phil_1984_ - Использование 'ENT_QUOTES' не изменит (для этого примера) поскольку нет никаких '' 'в экранируемых данных. – Quentin

Смежные вопросы