2010-03-01 3 views
1

Я пытаюсь предотвратить инъекцию xss. Поэтому, прежде чем я отправить форму, Javascript функция называетсяjavascript string заменить эквивалент на php?

function validatefield(id) { 
    var description = document.getElementById(id).value; 
    description = description.replace(/[\"\'][\s]*javascript:(.*)[\"\']/gi, ""); 
    description = description.replace(/script(.*)/gi, "");  
    description = description.replace(/eval\((.*)\)/gi, ""); 
    document.getElementById(id).value=description; 
} 

Я wonderng, если есть способ сделать то же самое в PHP, прежде чем вставить в MySQL? если они обойдут функцию validatefield.

Благодаря

+1

Портирование этого кода javascript на php не является хорошей стратегией для предотвращения XSS. Существуют способы ввода javascript в html, которые не покрываются вашей логикой, например. атрибут onclick. Правильный (и намного более простой!) Способ заключается в том, чтобы обернуть ваши пользовательские данные в 'htmlspecialchars()' как раз перед выводом в любой html-контекст. – Asaph

+0

Но htmlspecialchars не подходит, если вы хотите разрешить некоторый HTML. –

+0

@Matthew Flaschen: Конечно, правда. Хотя у меня не было впечатления, плакат собирал HTML именно через его форму. Он не упоминает об этом нигде в вопросе. В случае сбора HTML-данных я бы пошел с использованием белого списка и разделил все не одобренные теги и атрибуты. – Asaph

ответ

4

Вы ищете preg_replace.

$description = preg_replace('regex pattern', 'regex replacement', $description); 
+0

Регулярные выражения плохо подходят для (нерегулярного) синтаксиса html. Вам также нужно будет запустить это, пока он не найдет больше совпадений для замены, чтобы позаботиться о симутациях, таких как << scriptscript ... – jasonbar

+0

Я попытался просто скопировать и вставить js-версию, но он, похоже, не работает $ text = preg_replace ('/ [\ "\'] [\ s] * javascript: (. *) [\" \ ']/Gi', '', $ text); $ text = preg_replace ('/ script (. *)/Gi', '', $ text); $ text = preg_replace ('/ eval \ ((. *) \)/Gi', '', $ text); – hao

+1

Диалог с регулярным выражением отличается. Эта функция принимает только регулярные выражения, совместимые с Perl. Вот чит-лист: http://www.phpguru.org/downloads/PCRE%20Cheat%20Sheet/PHP%20PCRE%20Cheat%20Sheet.pdf Вам нужно будет переписать свои регулярные выражения, чтобы они работали в PHP. –

3

Вообще говоря, вы можете использовать preg_replace для регулярных выражений замены в PHP. Но есть несколько проблем с вашим дизайном

  1. Вы не должны даже беспокоиться об этом на клиенте. Это замедлит работу, не обеспечивая безопасность.
  2. Вы удаляете вещи, которые совершенно безопасны (например, «Я написал сценарий, чтобы делать такие»), игнорируя многие фактические опасности, такие как атрибуты onclick (см. Также XSS Cheat Sheet).

Вообще говоря, если вы хотите разрешить какую-либо форму HTML, лучший вариант - это белый список. HTML Purifier - популярный инструмент для реализации этого в PHP.

+0

+1 для очистки html и белых списков. Бу! для регулярных выражений и html. – jasonbar

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