在rails上的ruby中使用正则表达式过滤用户输入

时间:2015-05-22 10:30:12

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

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

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

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

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

我想用空格替换所有其他字符以保证安全。

我是rails和regex的新手,所以任何指针都会受到赞赏。任何其他指示更好的secuirty也将不胜感激。

TIA

1 个答案:

答案 0 :(得分:1)

发布我的评论,因为它适合你。

我的初步建议:

System.out
  • 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
  • * - 匹配1个或多个字母数字字符或下划线([\w. -]+),点\w或连字符.
  • - - 2个或更多换行符(支持所有主要操作系统换行符)
  • (?:\r\n|\r|\n){2,} - 2 >{2} s
  • > - 文字:\/{2}
  • :// - 2 tildes
  • ~{2} - 2个等号

正则表达式包含一个捕获组(标有圆括号={2}),其中包含我们需要保留的子串(您在上面列出它们)的备选方案(用(...)符号连接),以及{ {1}}匹配我们将要替换的其他字符。

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

|

它有一些修改过的部分.。您应该知道(\#{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个分数)和-之间的范围(63分秒符号) )。因此,它匹配* a :,或?,或:,或;,或<或{{1} },或=,空格或>

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

对于?,它是一种Ruby方式来添加一种回调函数:我们运行),每次匹配时,我们将其分配给+变量,然后我们检查它是否等于捕获组1,然后我们将整个匹配替换为组1的内容(因此,我们保留我们需要的东西),如果没有,我们用空格替换(因为它匹配)通过我们模式中的最终{ |m| m == $~[1] ? $~[1] : ' ' }