Forum Webscript.Ru

Программирование => PHP => Тема начата: Tryapkonator от 03 Февраля 2005, 13:22:37

Название: java injection, XSS и прочее
Отправлено: Tryapkonator от 03 Февраля 2005, 13:22:37
Обрабатываю BB тэги, и не могу придумать универсальную регулярку, чтобы обработать переменную на наличие "javascript:" итп, Т.е. от "javascript:" не нужна, но ведь можно написать и так "j a v a s cript:" и скрипт выполнится. Можно записать "javascript:" и куча еще разных способов. Впринципе опасный тег только (http://). Т.е. чтобы xss заработал надо либо "/^(j|j)\\s(a|a)\\s(v|v)\\s(a|a)\\s(s|s)\\s(c|c)\\s(r|r)\\s(i|i)\\s(p|p)\\s(t|t):/i
Поправьте, пожалуйсто, если что не так...
Название: java injection, XSS и прочее
Отправлено: Макс от 03 Февраля 2005, 13:56:44
имхо надо отказаться от универсальной регулярки и для каждого ББкода сделать свою.
Название: java injection, XSS и прочее
Отправлено: Tryapkonator от 03 Февраля 2005, 14:04:49
У меня только [img], [url] и [email]. Т.е. принцип один и тот же. Мне нужно защититься только от "javascript:", обойти ковычку не получится, т.е. до "style=\'background-image:url(javascript:" не дойти.
Название: java injection, XSS и прочее
Отправлено: Макс от 03 Февраля 2005, 14:50:30
Я бы эти 3 одним регекспом не делал. Можно конечно, но слишком запутаный код получится.
Вот пример для URL-а :

function highlight_url($url) {
   if (preg_match("~^(?:(?:https?)://(?:[a-z0-9_-]{1,32}".
   "(?::[a-z0-9_-]{1,32})?@)?)?(?:(?:[a-z0-9-]{1,128}\\.)+(?:com|net|".
   "org|mil|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{2})|(?!0)(?:(?".
   "!0[^.]|255)[0-9]{1,3}\\.){3}(?!0|255)[0-9]{1,3})(?:/[a-z0-9.,_@%&".
   "?+=\\~/-]*)?(?:#[^ \'\\"&<>]*)?$~i",$url)) {
      return \'\'.htmlspecialchars($url).\'\';
   } else {
      return \'[ url]\'.htmlspecialchars($url).\'[/url]\';
   }
}
$str = "test
[ url]http://ya.ru[/url] test
[ url]javascript:alert(\'test\')[/url]";

echo preg_replace("~\\[url\\](.+?)\\[\\/url\\]~ei", "highlight_url(\'\\\\1\')", $str);

скорее всего форум некоторые слеши повырезает, поэтому смотри логику а не copy/paste
Название: java injection, XSS и прочее
Отправлено: Макс от 03 Февраля 2005, 14:55:51
как и ожидалось, форум удалил некоторые слеши
+
я вставил пробелы, чтобы он теги [url] в примере не парсил
Название: java injection, XSS и прочее
Отправлено: Tryapkonator от 03 Февраля 2005, 15:09:02
Ок. Спасибо. Но мне немного не то нужно. Мне нужно вырезать "javascript:" из указанной переменной... Т.е. мне не нужно проверять на правильность url`а. Мне нужно лишь распознать "javascript:"... А может есть какая-нить функциия встроенная, которая удалит яву?
Название: java injection, XSS и прочее
Отправлено: Макс от 03 Февраля 2005, 15:22:52
Цитировать
Tryapkonator:
но ведь можно написать и так "j a v a s cript:" и скрипт выполнится

в каком это броузере такое ?
firefox таким не страдает :

click here

Название: java injection, XSS и прочее
Отправлено: Tryapkonator от 03 Февраля 2005, 15:38:57
Цитировать
Макс:
firefox таким не страдает :

А ты предлогаешь насильно заставлять всех поситителей ставить FF? =))) Есть такое. При написании javascript: можно использовать символы пробела, табуляции и переноса коретки. Вот такая вот лажа =(

Браузер - IE. В Опере не пробовал, но IE хватит =)
Название: java injection, XSS и прочее
Отправлено: Макс от 03 Февраля 2005, 15:55:19
хмм... в IE 6 у меня не сработало
так попробуй
$str = preg_replace("~\\s*j\\s*a\\s*v\\s*a\\s*s\\s*c\\s*r\\s*i\\s*p\\s*t\\s*:~s", \'\', $str);
Название: java injection, XSS и прочее
Отправлено: Tryapkonator от 03 Февраля 2005, 15:59:06
Цитировать
Макс:
хмм... в IE 6 у меня не сработало так попробуй $str = preg_replace("~\\s*j\\s*a\\s*v\\s*a\\s*s\\s*c\\s*r\\s*i\\s*p\\s*t\\s*:~s", \'\', $str);

Ок!! Спасибо!!! Только еще нужно предусмотреть "JaVaScRiPt:" и 16-ти ричную кодировку. Как я понял что-то типа

$str = preg_replace("~\\s*(j|j)......\\s*:~si", \'\', $str);

?
Название: java injection, XSS и прочее
Отправлено: Макс от 03 Февраля 2005, 16:22:56
Цитировать
Tryapkonator:
"java script:"

так ведь такая строка  будет вырезана этим регекспом
Цитировать
Tryapkonator:
16-ти ричную кодировку.

(j|\\xFF) - вместо \\xFF - должен быть реальный код
Название: java injection, XSS и прочее
Отправлено: Tryapkonator от 03 Февраля 2005, 16:42:46
Хм... я вставил именно 16-ти ричный, но форум обработал его и вывел "j"...