从URL中删除Javascript

时间:2011-01-28 19:36:12

标签: javascript url code-injection xss

我正在编写一个服务器端脚本,用<a/>标签版本替换文本正文中的所有网址(因此可以点击它们)。

如何确保我转换的任何网址中不包含任何XSS样式的javascripts?

我目前正在过滤字符串中的“javascript:”,但我觉得这可能还不够......

3 个答案:

答案 0 :(得分:1)

任何现代服务器端语言都有某种Markdown或其他轻量级标记语言的实现。这些标记语言用可点击的链接替换URL。

除非你有足够的时间花在研究这个主题并实现这个脚本,否则我建议用你的语言发现最好的Markdown实现并挖掘它的代码,或者只是使用它在你的代码中。

Markdown通常作为图书馆发货;其中一些允许您配置他们必须处理的内容以及他们必须忽略的内容 - 在您的情况下,您要处理URL,忽略任何其他元素。

这是针对不同语言的实体Markdown实现的(不完整)列表:

答案 1 :(得分:0)

您需要对网址进行属性编码 您还应该确保它们以http://https://开头。

答案 2 :(得分:0)

这取自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);