[ruby-list:50499] Re: [質問] 正規表現の書き方
From:
"Masa Sakano" <imagine@...>
Date:
2017-02-23 14:18:42 UTC
List:
ruby-list #50499
坂野正明です。 On 21 Feb 2017, at 4:55, AOKI Yoshihiro wrote: > Mac OS 10.10.5 > ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin14] > ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-darwin14] > UTF-8 > > という環境で, > > s = "A A A A A A A A A A A A A A A A A A A A A A A A " > /((A )+)+([((][))])/ =~ s > > 2行を実行すると, > 1.4秒という比較的長い時間がかかります。 > > % time ruby z.rb > ruby z.rb 1.42s user 0.03s system 99% cpu 1.455 total この正規表現は、いわゆるReDoS脆弱性につながるタイプのものの ように見受けられました。端的には、 「文字列の繰り返しマッチを繰り返す」 パターンです(注: ReDoS脆弱性は、それには限らないようです)。 つまり、正規表現が苦手とするパターンと言っていいのでしょうか (私は全然詳しくないので、誤っていればご指摘下さい!)。 ○参考: 「正規表現でのメールアドレスチェックは見直すべき – ReDoS」 by 大垣靖男 https://blog.ohgaki.net/redos-must-review-mail-address-validation Perlは比較的強いように聞いているので、Ruby, Perl, Pythonで 試してみました。 % ruby --version ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-darwin16] % time ruby -e 's = "A A A A A A A A A A A A A A A A A A A A A A A A ";/((A )+)+([((][))])/ =~ s;' ruby -e 1.54s user 0.02s system 97% cpu 1.598 total % perl --version # => (v5.24.0) % time perl -mutf8 -e '$s = "A A A A A A A A A A A A A A A A A A A A A A A A ";$s =~ /((A )+)+([((][))])/;' perl -mutf8 -e 0.00s user 0.00s system 53% cpu 0.009 total % python --version Python 2.7.12 % time python -c "import re;s = 'A A A A A A A A A A A A A A A A A A A A A A A A ';re.compile(ur'((A )+)+([((][))])', re.UNICODE).search(s);" python -c 6.37s user 0.03s system 99% cpu 6.425 total % ご参考までに。 # Perl が速すぎる気がしますが……。 坂野正明