从URL中删除Javascript

从URL中删除Javascript,javascript,url,code-injection,xss,Javascript,Url,Code Injection,Xss,我正在编写一个服务器端脚本,用标记版本替换正文中的所有URL(以便单击它们) 如何确保我转换的任何URL中不包含任何XSS样式的Java脚本 我目前正在筛选字符串中的“javascript:”,但我觉得这可能不够。您需要对URL进行属性编码。 您还应该确保它们以http://或https://开始,任何现代服务器端语言都有某种实现或其他轻量级标记语言。这些标记语言将URL替换为可单击的链接 除非您有很多时间来研究这个主题并实现这个脚本,否则我建议您找出您的语言中最好的标记实现并挖掘其代码,或者干

我正在编写一个服务器端脚本,用
标记版本替换正文中的所有URL(以便单击它们)

如何确保我转换的任何URL中不包含任何XSS样式的Java脚本


我目前正在筛选字符串中的“javascript:”,但我觉得这可能不够。

您需要对URL进行属性编码。

您还应该确保它们以
http://
https://

开始,任何现代服务器端语言都有某种实现或其他轻量级标记语言。这些标记语言将URL替换为可单击的链接

除非您有很多时间来研究这个主题并实现这个脚本,否则我建议您找出您的语言中最好的标记实现并挖掘其代码,或者干脆在代码中使用它

降价通常以库的形式提供;其中一些允许您配置必须处理的内容和必须忽略的内容——在您的情况下,您希望处理URL,忽略任何其他元素

以下是针对不同语言的可靠标记实现的(不完整)列表:

  • 对于Python
  • 为了Ruby
  • 对于PHP

这是取自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);
//删除javascript:和vbscript:协议
[a-z].[\x00-\x20.[\x00-\x20,,[\x00-\x20,,[\x00-\x20,*(““““,””....[[[x00-\x00-\x20][[[[[[[[a-z].[[a-a-z].[[[[[a-z]可能会]将将]将在未来一一个孕孕孕孕孕的一次次次次的未来取代取代取代取代取代取代取代,,,,,,,,[[[[c.[未来将]将将将,[未来将]将,[未来将]将,[将]将,[将]将,[将]将]将,[将]将]将取代取代取代取代取代取代取代取代取代取代取代取代,,,[未来未来的,[未来的,[未来的,[将,[将,[将,[现现现现现现现现现现现现Avascript…,$str);
$str=preg\u 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]*:\x00-\x20]:\x00-\x20]:\x00-\x00-\x20]:$1、$str、$1);
$str=preg\u replace(“#([a-z]*)[\x00-\x20]*=([\'”]*)[\x00-\x20]*-moz绑定[\x00-\x20]*::#u',“$1=$2nomozbinding…”,$str);
//仅适用于IE:
$str=preg\u replace(“#(]+?)样式[\x00-\x20]*=[\x00-\x20]*[`\'”]*.*?表达式[\x00-\x20]*\([^>]*+>#is',“$1>”,$str);
$str=preg\u replace(“#”(]+?)样式[\x00-\x20]*=[\x00-\x20]*[`\'”]*.*?行为[\x00-\x20]*\([^>]*+>\is',“$1>”,$str);
$str=preg\u replace('.#(]+?)style[\x00-\x20]*=[\x00-\x20]*[`'''''''']*.*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:[\x00-\x20]+++*:*[\x00-\x00-\x20]*:[\x00-\x20]*:[\x00-\x00-\x20]]++++>ius'''''''';

还有
onclick
onmouseout
onwhatever
。这应该不是问题,因为我正在做
这两个字符串都不能有
您使用的服务器端语言是什么?有很多开源XSS过滤器可用。PHP,我总是可以使用htmlspecialchars()内容,但我不确定这是否足够…
http://javascript:
我相信在某些浏览器中可以使用……我还想允许“www.example.com"为了成为可链接的……我选择了不做任何形式的降价,因为它包含的内容远远超出了我的需要,我不希望人们开始使用替代语法,因为我正在制作一个消息传递系统,这只是为了允许URL可点击,就是这样。我已经设置了正则表达式来识别URL,我只需要一种方法要从链接中筛选出任何潜在的JS。如果您无法配置标记以使URL可单击并忽略其他标记,我将找到与使URL可单击相关的代码,从标记实现中提取并使用它。