【问题标题】:The provided regular expression is using multiline anchors (^ or $), which may present a security risk提供的正则表达式使用多行锚(^ 或 $),这可能会带来安全风险
【发布时间】:2017-04-06 06:45:29
【问题描述】:

我正在使用 Ruby 2.3.0 和 Rails 4.2.5,我正在关注此文档 https://www.sitepoint.com/youtube-rails/ 由于这里有正则表达式用于验证 youtube 网址。我将它复制粘贴到我的 Rails 应用程序中,它在 Rails 控制台上工作正常

[1] pry(main)> YT_LINK_FORMAT = /^(?:https?:\/\/)?(?:www\.)?youtu(?:\.be|be\.com)\/(?:watch\?v=)?([\w-]{10,})/
=> /^(?:https?:\/\/)?(?:www\.)?youtu(?:\.be|be\.com)\/(?:watch\?v=)?([\w-]{10,})/
[2] pry(main)> video_url = "https://www.youtube.com/watch?v=aZngT1Eas4w"
=> "https://www.youtube.com/watch?v=aZngT1Eas4w"
[3] pry(main)> uid = video_url.match(YT_LINK_FORMAT)
=> #<MatchData "https://www.youtube.com/watch?v=aZngT1Eas4w" 1:"aZngT1Eas4w">
[4] pry(main)> uid[2]
=> nil
[5] pry(main)> uid[1]
=> "aZngT1Eas4w"
[6] pry(main)> video_url = "https://youtu.be/aZngT1Eas4w"
=> "https://youtu.be/aZngT1Eas4w"
[7] pry(main)> uid = video_url.match(YT_LINK_FORMAT)
=> #<MatchData "https://youtu.be/aZngT1Eas4w" 1:"aZngT1Eas4w">
[8] pry(main)> uid[1]
=> "aZngT1Eas4w"

但是当我运行我的 rails 应用程序时,我得到了这个错误

"The provided regular expression is using multiline anchors (^ or $), which may present a security risk. Did you mean to use \A and \z, or forgot to add the :multiline => true option?"

我也在尝试使用这个正则表达式

/^(?:https?:\/\/)?(?:www\.)?youtu(?:\.be|be\.com)\/(?:watch\?v=)?([\w-]{10,})/
=> /^(?:https?:\/\/)?(?:www\.)?youtu(?:\.be|be\.com)\/(?:watch\?v=)?([\w-]{10,})/

但同样的问题仍然存在

【问题讨论】:

  • /\A(?:https?:\/\/)?(?:www\.)?youtu(?:\.be|be\.com)\/(?:watch\?v=)?([\w-]{10,})/ 原因是 Rails 试图阻止你注入。
  • 如果我将 ^ 替换为 \A 那么对于像这样的任何 url 'aaaaa.com/watch?v=o3m2F6CDktc'
  • 我试试你的 '/\A(?:https?:\/\/)?(?:www\.)?youtu(?:\.be|be\.com)\/ (?:watch‌​\?v=)?([\w-]{10,})/' 但它不起作用

标签: ruby-on-rails ruby


【解决方案1】:

这个正则表达式适用于 rails 5

YT_LINK_FORMAT = /(http:\/\/|https:\/\/|)(www.)?(youtu(be\.com|\.be|be\.com))\/(video\/|embed\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/

【讨论】:

  • 这是危险的,而且不可靠。它匹配任何包含的字符串。是的,我提供的正则表达式完美工作
  • 您是否使用 Rails 应用程序尝试您的答案。你为什么总是让我对否定的回答。你的常规 experession 不再工作了。为什么这么危险。它适用于 youtube 网址。尝试使用 rails Rails 4.2.5 和 ruby​​ 2.3.0 的应用程序。您的正则表达式不再起作用
  • 看看我的问题。我的正则表达式也在控制台上工作,但在 Rails 应用程序中它给我们一个错误,你的表达式不适用于 youtube url。
  • @jaillawat 什么错误?它不适用于什么输入?
  • @mudasobwa 这是您最好的表达的输出,并祝贺它不起作用 '[2] pry(main)> YT_LINK_FORMAT = /\A(?:https?:\/\/)? (?:www\.)?youtu(?:\.be|be\.com)\/(?:watch‌​\?v=)?([\w-]{10,})/ => /\ A(?:https?:\/\/)?(?:www\.)?youtu(?:\.be|be\.com)\/(?:watch\u200C\u200B\?v=)? ([\w-]{10,})/ ' '[3] pry(main)> video_url = "youtube.com/watch?v=aZngT1Eas4w" => "youtube.com/watch?v=aZngT1Eas4w"' '[4] pry(main)> uid = video_url. match(YT_LINK_FORMAT)' '=> nil' [5] pry(main)> '
猜你喜欢
  • 2014-09-15
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
  • 2014-03-17
  • 2012-08-19
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
相关资源
最近更新 更多