【问题标题】:Filtering user input using regex in ruby on rails在 ruby​​ on rails 中使用正则表达式过滤用户输入
【发布时间】:2015-05-24 21:33:33
【问题描述】:

我的论坛网站上有一个文本区域,想在保存到数据库之前过滤用户输入的文本。我正在使用 sanitize 函数去除所有 html 标签,然后尝试将 gsub 与正则表达式一起使用。以下是我试图在我的控制器中使用的内容-

ActionView::Base.full_sanitizer.sanitize(params[:content]).gsub(/[^0-9a-z\\s#]/im,'')

我可以使用 sanitize 去除 html,但无法为 gsub 方法获取正确的正则表达式。对于我的文本区域,我想允许以下内容进行降价编辑 -

  • ###
  • ####
  • **
  • *
  • _
  • -
  • >>
  • ~~
  • ==
  • .
  • ://
  • 多行换行符
  • 空格
  • 字母数字字符

为了安全起见,我想用空格替换所有其他字符。

我是 Rails 和正则表达式的新手,所以任何指针都会受到赞赏。任何其他提高安全性的指针也将不胜感激。

TIA

【问题讨论】:

  • 为什么你做错了一个很好的论据是:即使被编写和测试,你的代码也会过滤掉标点符号(分号、冒号、逗号等)只是为了过滤掉用户输入的内容不是安全,而是用户的默默无闻。为什么要放弃用户的数学运算 (∀ x ∈ R ⇒ ∃ ...)?
  • 请尝试gsub(/(\#{3,4}|\*{1,2}|[\w. -]+|(?:\r\n|\r|\n){2,}|>{2}|:\/{2}|~{2}|={2})|./) { |m| m == $~[1] ? $~[1] : ' ' }
  • 非常感谢@stribizhev。我已经对其进行了进一步编辑,以包括一些笑脸,! , - 它现在看起来像 - gsub(/(\#{3,4}|\*{1,2}|[\w. -]+|[\w, +]+|[\w! +]+|[\w: +]+|["\w" +]+|[:-?) +]+|[(\w) +]+|(?:\r\n|\r|\n){2,}|>{2}|:\/{2}|~{2}|={2})|./) { |m| m == $~[1] ? $~[1] : ' ' } 。但是你能解释一下花括号中的最后一点是做什么的吗{ |m| m == $~[1] ? $~[1] : ' ' }
  • @mudasobwa 感谢您的评论。您认为我应该如何在不限制允许内容的情况下保护我的应用免受恶意用户输入的影响?我是专业网络开发的新手,所以任何指针都将不胜感激......
  • @pari sanitize 应该已经可以保护您免受注射了。只需为用户提供他们不想输入的任何内容的能力,不要搞砸他们。

标签: ruby-on-rails ruby regex ruby-on-rails-4


【解决方案1】:

发表我的评论,因为它对你有用。

我的初步建议:

gsub(/(\#{3,4}|\*{1,2}|[\w. -]+|(?:\r\n|\r|\n){2,}|>{2}|:\/{2}|~{2}|={2})|./) { |m| m == $~[1] ? $~[1] : ' ' }
  • \#{3,4} - 匹配 3 或 4 #s
  • \*{1,2} - 匹配 1 或 2 *s
  • [\w. -]+ - 匹配 1 个或多个字母数字字符或下划线 (\w)、点 . 或连字符 -
  • (?:\r\n|\r|\n){2,} - 2 个或更多换行符(支持所有主要操作系统换行符)
  • >{2} - 2 >s
  • :\/{2} - 文字 ://
  • ~{2} - 2 个波浪号
  • ={2} - 2 个等号

正则表达式由一个捕获组(用圆括号 (...) 标记)组成,其中包含我们需要保留的子字符串的替代项(用 | 符号连接)(您在上面列出了它们),以及与匹配的 .我们将要替换的其余字符。

你说你想出的正则表达式是

(\#{3,4}|\*{1,2}|[\w. -]+|[\w, +]+|[\w! +]+|[\w: +]+|["\w" +]+|[:-?) +]+|[(\w) +]+|(?:\r\n|\r|\n){2,}|>{2}|:\/{2}|~{2}|={2})|.

它有一些修改部分[\w, +]+|[\w! +]+|[\w: +]+|["\w" +]+|[:-?) +]+|[(\w) +]+。你应该知道[...] 表示一个字符类,它里面的任何字符,不是一个字符序列。所以,["\w" +] 没有什么意义,因为它并不表示 a quote, alphanumeric, a quote and some spaces,它只是表示引号、字母数字、空格或加号

更令人担忧的是[:-?) +]:这里的- 创建了一个介于:ASCII table 中的 58 dec 数字)和?(63 dec 符号)之间的范围。因此,它匹配*a :,或;,或<,或=,或>,或?,或),或空格,或+

我希望这些信息能帮助您进一步调整正则表达式。

至于{ |m| m == $~[1] ? $~[1] : ' ' },它是一种Ruby方式添加一种回调函数:我们运行gsub,每次匹配到,我们将它分配给m变量,然后我们检查它是否匹配等于捕获组 1,然后我们将整个匹配替换为组 1 的内容(因此,我们保留了我们需要的内容),如果不是,我们用空格替换(因为它与最终的 . 匹配在我们的模式中)。

【讨论】:

    猜你喜欢
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    相关资源
    最近更新 更多