Rails应用程序中的安全性 - 用户提交的数据

时间:2009-11-22 19:54:54

标签: ruby-on-rails security xss

我目前正在编写我的第一个Rails应用程序。我正在写一个简单的博客应用程序,允许用户评论帖子。我是Rails的新手,所以我正在寻找一些关于如何通过用户输入解决安全问题的指导。

在前端,我使用TinyMCE接受用户输入。据我了解,TinyMCE会在发布到服务器之前从用户输入中删除任何可疑标签(例如<script>)。似乎可以通过在页面上禁用javascript来绕过这一点,允许用户在文本区域中自由统治。 TinyMCE建议使用javascript来创建TextArea。因此,如果用户禁用javascript,则不会有文本区域。这是标准解决方案吗?这似乎有点像黑客。

在后端,删除恶意代码的最佳方法是什么?我是否想在注释控制器中的创建和更新方法中进行某种验证? Rails中是否有一些功能可以帮助解决这个问题?

当向用户显示信息时,我假设我不想转义HTML标记(使用<%= h *text*%>),因为这是它存储在后端的方式。这是不好的做法吗?

3 个答案:

答案 0 :(得分:1)

我通常是在将数据弹出到数据库之前清理数据的忠实粉丝。这是一个有争议的做法,但我通常倾向于此。

我使用旧版white_list插件的修改版本不会删除html,而是将我想要的任何内容转换为更安全的格式。

<tag>

变为

&lt;tag&gt;

这样我就不会真正改变提交的内容。

有一些插件专门使用白/黑名单模型处理清理。

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插件。我一直在我的一些应用程序中使用它。我发现它易于使用,几乎不需要任何配置,并且一直像魅力一样。