Ruby on rails 提供的正则表达式正在使用多行定位(^或$),这可能会带来安全风险

Ruby on rails 提供的正则表达式正在使用多行定位(^或$),这可能会带来安全风险,ruby-on-rails,ruby,Ruby On Rails,Ruby,我使用的是Ruby 2.3.0和Rails 4.2.5,我遵循这篇文档 因为这里有正则表达式用于验证youtubeurl。我正在将它复制粘贴到我的rails应用程序中,它在rails控制台上运行良好 [1] pry(main)> YT_LINK_FORMAT = /^(?:https?:\/\/)?(?:www\.)?youtu(?:\.be|be\.com)\/(?:watch\?v=)?([\w-]{10,})/ => /^(?:https?:\/\/)?(?:www\.)?yo

我使用的是Ruby 2.3.0和Rails 4.2.5,我遵循这篇文档 因为这里有正则表达式用于验证youtubeurl。我正在将它复制粘贴到我的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"
我也尝试使用这个正则表达式

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

但是同样的问题仍然存在

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

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

/\A(?:https?:\/\/)(?:www\)?youtu(?:be | be\.com)\/(?:watch\?v=)([\w-]{10,})/
原因是Rails试图阻止你注射。如果我替换^to\A,那么像这样的url“我尝试了你的”/\A(?:https?:\/\/)(?:www.)?youtu be(?:be | be | be\.com)/(:watch‌​\?v=)?([\w-]{10,})/'但它不起作用这是危险的,也不可靠。它匹配包含字符串的任何内容。是的,我提供的正则表达式非常有效。您是否在rails应用程序中尝试您的答案。你为什么总是给我否定的答案。你的日常表达不再有效了。为什么这么危险。它在youtube url上运行良好。尝试使用rails 4.2.5和ruby 2.3.0的应用程序。你的正则表达式不起作用了看看我的问题。我的正则表达式也可以在控制台上运行,但在rails应用程序中,它会给我们一个错误,并且您的表达式不能在youtube url上运行。@Jailawat什么错误?它对什么输入不起作用?@mudasobwa这里是你最好的表达式的输出,祝贺它不起作用“[2]pry(main)>YT\u LINK\u 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\u url=”“>''[4]pry(main)>uid=video\u url.match(YT LINK格式)'>nil'>pry(main)'>
YT_LINK_FORMAT = /(http:\/\/|https:\/\/|)(www.)?(youtu(be\.com|\.be|be\.com))\/(video\/|embed\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/