2012-02-27 82 views
0

我正在寻找一种验证用户输入HTML的方法,类似于您在评论表单中看到的内容。用户的输入应限制为最基本的标签,如p,ul,li,div,img。唯一允许的属性是样式。验证用户输入HTML子集

验证可能发生在客户端,通过Javascript或服务器端,通过Ruby。我希望找到一个可以做到这一点的Javascript库,或者至少找到几个RegEx来做到这一点。

感谢您的建议。

+2

你需要验证在服务器端,无论你是否有客户端 - 方面验证。绝对没有什么能够阻止用户摆脱脚本(例如通过Firebug)来解决客户端验证问题。有了这个说法,客户端验证会使页面更加友好。 – 2012-02-27 21:27:27

+0

样式可以是一个危险的属性,除非您限制它可以操作的属性。由于您不允许使用''标签,因此它不能用于点击插入,但仍可用于其他类型的恶作剧,如覆盖整个页面:'

' – 2012-02-27 21:41:16

回答

0

您可以使用Sanitize来过滤HTML。

使用你在你的问题中列出的示例元素,你会使用这样的事情在你的验证代码:

Sanitize.clean(html, 
    :elements => ['p', 'ul', 'li', 'div', 'img'], 
    :attributes => {' 
     'all' => ['style'] 
    } 
) 

正如我在我的评论中提到的上方,使style属性可能是危险的,特别是如果你允许<a>标签,因为如果用户创建一个覆盖整个页面的不可见链接,它会打开你达到clickjacking的攻击。

如果你想允许<a>标签,我会建议禁止style完全或许将rel=nofollow用户提供的链接:

Sanitize.clean(html, 
    :elements => ['p', 'ul', 'li', 'div', 'img', 'a'], 
    :add_attributes => { 
     'a' => {'rel' => 'nofollow'} 
    } 
) 
+0

这可能正是我想要的。谢谢!我会给它一个旋风。 – tmo256 2012-02-28 00:19:19