Удалить Javascript из URL - PullRequest
       29

Удалить Javascript из URL

0 голосов
/ 28 января 2011

Я пишу сценарий на стороне сервера, который заменяет все URL в теле текста на <a/> версии тегов (чтобы их можно было щелкнуть).

Как я могу убедиться, что любые URL-адреса меняconvert не содержит в себе никаких javascripts в стиле XSS?

В настоящее время я фильтрую строку «javascript:», но мне кажется, что этого недостаточно.

Ответы [ 3 ]

1 голос
/ 28 января 2011

Любой современный серверный язык имеет своего рода реализацию Markdown или других облегченных языков разметки. Эти языки разметки заменяют URL-адреса кликабельной ссылкой.

Если у вас нет много времени, чтобы исследовать эту тему и реализовать этот скрипт, я бы посоветовал найти лучшую реализацию Markdown на вашем языке и выкопать ее код, или просто использовать в вашем коде.

Уценка обычно поставляется в виде библиотеки; некоторые из них позволяют вам настроить то, что они должны обрабатывать, и то, что они должны игнорировать - в вашем случае вы хотите обрабатывать URL, игнорируя любой другой элемент.

Вот (неполный) список надежных реализаций Markdown для разных языков:

0 голосов
/ 28 января 2011

Это было взято из инфраструктуры Kohana, связанной с фильтрацией XSS. Не полный ответ, но может помочь вам.

// Remove javascript: and vbscript: protocols
$str = preg_replace('#([a-z]*)[\x00-\x20]*=[\x00-\x20]*([`\'"]*)[\x00-\x20]*j[\x00-\x20]*a[\x00-\x20]*v[\x00-\x20]*a[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2nojavascript...', $str);
$str = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2novbscript...', $str);
$str = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*-moz-binding[\x00-\x20]*:#u', '$1=$2nomozbinding...', $str);

// Only works in IE: <span style="width: expression(alert('Ping!'));"></span>
$str = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?expression[\x00-\x20]*\([^>]*+>#is', '$1>', $str);
$str = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?behaviour[\x00-\x20]*\([^>]*+>#is', '$1>', $str);
$str = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*[^>]*+>#ius', '$1>', $str);
0 голосов
/ 28 января 2011

Вам необходимо атрибут-кодировать URL-адреса.
Вы также должны убедиться, что они начинаются с http:// или https://.

...