我目前正在编写我的第一个Rails应用程序。我正在写一个简单的博客应用程序,允许用户评论帖子。我是Rails的新手,所以我正在寻找一些关于如何通过用户输入解决安全问题的指导。
在前端,我使用TinyMCE接受用户输入。据我了解,TinyMCE会在发布到服务器之前从用户输入中删除任何可疑标签(例如<script>
)。似乎可以通过在页面上禁用javascript来绕过这一点,允许用户在文本区域中自由统治。 TinyMCE建议使用javascript来创建TextArea。因此,如果用户禁用javascript,则不会有文本区域。这是标准解决方案吗?这似乎有点像黑客。
在后端,删除恶意代码的最佳方法是什么?我是否想在注释控制器中的创建和更新方法中进行某种验证? Rails中是否有一些功能可以帮助解决这个问题?
当向用户显示信息时,我假设我不想转义HTML标记(使用<%= h *text*%>
),因为这是它存储在后端的方式。这是不好的做法吗?
答案 0 :(得分:1)
我通常是在将数据弹出到数据库之前清理数据的忠实粉丝。这是一个有争议的做法,但我通常倾向于此。
我使用旧版white_list插件的修改版本不会删除html,而是将我想要的任何内容转换为更安全的格式。
<tag>
变为
<tag>
这样我就不会真正改变提交的内容。
有一些插件专门使用白/黑名单模型处理清理。
http://github.com/rgrove/sanitize/#没用过,但看起来很有趣
http://github.com/imanel/white_list_model#已使用,不错
还有act_as_sanitized,但我没有真正的信息。
当然使用h()。
答案 1 :(得分:0)
您的怀疑是合理的,但在javascript中创建文本区域不会让您更容易受到攻击。用户可以始终使用curl之类的东西来强制提交表单,而无需通过Web浏览器访问您的站点。
您应该假设用户可以将恶意脚本发布到评论中,并在前端对其进行转义。使用<%= h(...) %>
是一种方法,或者您可以以相同的方式使用sanitize
方法。它将删除所有脚本并转义所有其他html,除了一些无害的常见标记。 Documentation for sanitize
答案 2 :(得分:0)
除了nowk的建议外,还有xss_terminate插件。我一直在我的一些应用程序中使用它。我发现它易于使用,几乎不需要任何配置,并且一直像魅力一样。