1

我正在使用以下插件:https ://github.com/jhollingworth/bootstrap-wysihtml5/

这就是我在 Rails 应用程序中清理输入/输出的方式:

post.rb:

  protected

  def clean_input
    self.content = sanitize(self.content, :tags => %w(b i u br p span blockquote pre code), :attributes => %w(id class style))
  end

帖子/show.html.rb:

  <p><%= sanitize @post.content, :tags => %w(b i u p span br blockquote pre code), :attributes => %w(id class style) %></p>

此解析器规则适用于wysihtml5(当然,编辑器默认允许 b、i 等标签):

共享/编辑器工具栏:

  parserRules: {
      classes: {
        "ruby": 1,
        "variable": 1,
        "string": 1
      },
      tags: {
        span: {},
        code: {},
        pre: {}
      }
    },

所以,现在用户可以输入,应用程序可以输出如下内容:

  <pre class="ruby">
   <code>
    <span class="variable">
    $(</span><span class="string">'.wysihtml5'</span>).wysihtml5({<span class=
    "string">'stylesheets'</span>: false});
   </code>
  </pre>

(用户可以从视觉和html视图切换)

我希望这不是一个愚蠢的问题(我对安全性不是很熟悉),但这相对安全还是危险?如果有,如何预防?

4

1 回答 1

3

我真的不了解 Ruby,但是在 PHP 中你可以允许这样的标签,从我的实验来看,它根本不安全......原因是因为这些授权标签上的属性没有被清理所以任何用户可以输入一个非常温和且无害的<span></span>标签,但将其添加到其中:

<span onmouseover="hack_the_whole_fucking_website();">contenthere</span>

这样,当用户将鼠标移到它上面时,JavaScript 就会被执行!从那里我猜黑客可能会窃取用户的 cookie + 窃取会话 cookie + 劫持用户会话 + 可能劫持管理会话,然后炸毁你的网站。这是为黑客敞开的大门。

我为此使用的解决方案是 BBcode 标签。它们是现有 HTML 标记的一种“替代品”。一些例子 :

  • <i>=[i]
  • <img src="#">=[img=#]
  • <a href="#">text</a>=[url=#]text[/url]
  • ...

编辑器的输出应该是这种格式,这样您就可以运行一个清理脚本来正确删除所有真实的 HTML 标记。然后,当需要将此数据输出给用户时,您可以使用一些正则表达式将这些替换标记替换为真正的 HTML 标记。:)

于 2012-12-09T07:56:45.477 回答