タグ

正規表現に関するwakuworksのブックマーク (44)

  • 正規表現の脆弱性 (ReDoS) を JavaScript で学ぶ

    先日、このようなツイートを書いたところ、かなりの反響がありました。 JavaScript の正規表現の脆弱性の例でいうと、例えば /\s+$/ は脆弱性があると言える console.time(); /\s+$/.test(" ".repeat(65536) + "a"); console.timeEnd(); 結構時間がかかるのがわかる。でも /\s+$/ を見て「これは危険だな」と理解出来る人はそんなにいない。JavaScript に限らないけれど。 — Takuo Kihira (@tkihira) February 17, 2022 これは一般に ReDoS (Regular expression Denial of Service) と呼ばれる脆弱性です。正確に理解するのが難しい脆弱性なので、少し解説してみたいと思います。 結論 長い記事になるので、最初に「とりあえずこれだけ知っ

  • 【文字コード】SJISで半角カタカナチェックに正規表現を使った際の落とし穴【正規表現】 - 俺のメモ帖

    フォームに、半角カタカナ限定の入力項目をおいて、入力項目チェックを正規表現を使って行った際の落とし穴。 まあこれも知ってる人には何を今更って感じなんだろうけど。 ちゃんと表示されるかわからないんだけど、 「^[ア-ンァ-ッ]*$」とか書いたんだけど、これで半角の「ア」~「ン」、「ァ」~「ョ」、「ッ」がチェックできると思って、全文字入力チェックしたんですよ。 すると、何故か「ヲ」だけチェックをすり抜ける。。。 ※省いてるけど、濁点・半濁点・長音符も含んでました 原因は文字コード表見ると一目瞭然でした。 半角カタカナの文字コード上での並び順が酷い(笑) 誰がこんな並びにしたのか・・・ 見てわかるんだけど、なんで「ヲ」が「ァ」の前にあるの・・・??? 「^[ア-ンヲ-ッ]*$」で解決。ふざけんな。 軽く調べてみたら、以下のような情報が。 oshiete.goo.ne.jp なんか大正時代に山下芳

    【文字コード】SJISで半角カタカナチェックに正規表現を使った際の落とし穴【正規表現】 - 俺のメモ帖
  • Regex Cheat Sheet

    The tables below are a reference to basic regex. While reading the rest of the site, when in doubt, you can always come back and look here. (It you want a bookmark, here's a direct link to the regex reference tables). I encourage you to print the tables so you have a cheat sheet on your desk for quick reference. The tables are not exhaustive, for two reasons. First, every regex flavor is different

    wakuworks
    wakuworks 2018/10/29
    “character class intersection”
  • 覚えておくと便利な正規表現のパターンをまとめた・「Regex Hub」

    Regex Hubは覚えておくと便利な正規表現のパターンをまとめているプロジェクトサイトです。メールやHTMLタグ、日付、カラーコードや電話番号などに対応出来る正規表現が用意されており、その場でマッチするかをテストする事が出来ます。日で使う場合は一工夫必要なものもありますが、こうしてまとめてあると便利ですね。プロジェクトはMITライセンスの元、ソースコードが公開されています。 Regex HubOn Github

    覚えておくと便利な正規表現のパターンをまとめた・「Regex Hub」
  • 正規表現インジェクション

    (Last Updated On: 2018年8月13日)一文字でも意味がある文字があるとインジェクション攻撃が可能な場合が多いです。正規表現も例外ではありません。 正規表現インジェクションとは 正規表現に対する攻撃にはReDoS攻撃(検索対象の文字列を使って攻撃)がありますが、正規表現自体を使ってインジェクション攻撃が可能です。ヌル文字インジェクションと組み合わせて攻撃も可能です。 正規表現インジェクションで攻撃可能なパターンは正規表現の一部が変更可能で、検索可能な文字列を制限している場合です。 正規表現インジェクションのパターン 以下のようなログファイルがあるとします。 14:14:15 bob[14] Login from IP 10.10.10.123 14:14:30 tom[14] Login from IP 10.10.20.234 14:15:27 bob[34] Upda

    正規表現インジェクション
  • 汎用的なコードの依存関係の抽出ツール rexdep を作りました! ― 正規表現で依存関係を大雑把に抽出しよう! - プログラムモグモグ

    あらすじ ソフトウェアの中の依存関係について 正規表現で抽出できることとその限界 コードの依存関係を抽出するツール rexdep を作りました ソフトウェアの構造を概観するには あなたは、大きなソフトウェアを目にした時、何をしますか? ファイルが何十、何百もある時、どこから読みますか? ソフトウェアが巨大になると、そのコードの構造を把握するのは難しくなります。 特にプロジェクトに入りたての人にとって巨大なコードベースを一目で理解することは難しく、細かなタスクをこなしていく中で徐々に「どこに何が書いてあるか」を理解していくしかありません。 ソフトウェアによってはモデルとコントローラ、データベースとビューと言った具合にコードが分かれており、これくらいの分類はディレクトリ名を見れば理解できるかもしれません。 しかしそのようなざっくりとしたコードの分類が分かったところで、ソフトウェアの構造を理解し

    汎用的なコードの依存関係の抽出ツール rexdep を作りました! ― 正規表現で依存関係を大雑把に抽出しよう! - プログラムモグモグ
  • 本当にキモい Vim script - 正規表現編 - 永遠に未完成

    Vim Advent Calendar 2012 の 339 日目の記事です。 先日、Lingr で :s コマンドの引数をパースする方法についての話になりました。 :s はご存知の通り、置換コマンドです。 :[range]s[ubstitute]/{pattern}/{string}/[flags] [count]今回 [range] と [count] は無視するとして、それ以外の {pattern} と {string} と [flags]、あとはパターン内でエスケープされているかもしれない区切り文字(多くの場合は /) が何になるか知りたい。 結果的にできたのは以下のような正規表現です。 \v^s%[ubstitute]([\x00-\xff]&[^\\"|[:alnum:][:blank:]])(%(\\.|.){-})%(\1(%(\\.|.){-})%(\1([&cegiIn

    本当にキモい Vim script - 正規表現編 - 永遠に未完成
  • 正規表現:悪い表現、いい表現、最良の表現 | POSTD

    わずかな文字がいかにしてパフォーマンスに大きな違いを生めるかというお話 正規表現は、私たち開発者がことあるごとに駆使する呪文のようなものですが、私たちはそれをどんな時も巧みに使いこなしていると言えるでしょうか。正規表現は繊細で精密な言語です。入念な慎重さで記述してやれば、ボウリングで一瞬にして完璧なストライクを取るような強力なテキストとなり得ます。 しかし、正規表現が精密さに欠ける状態で投げ出されると、さながら酔っ払いがよろよろとつまずきながらテキストの上を歩くがごとく、そのボールはぎこちなくボウリングのレーンを転がり、ピンを1つか2つ倒すだけで終わってしまうのです。 これら2つの正規表現の違いは何なのか。何がいい表現と悪い表現を分けるのか。正規表現に素晴らしい力を与えるメカニズムを、この投稿で明かしてみようと思います。効果的な表現とそうでない表現との大きな違いをきっと分かってもらえるはず

    正規表現:悪い表現、いい表現、最良の表現 | POSTD
  • 独自のバリデーションルールを作成

    CakePHPで組み込みバリデーションルールをつくる方法は、正規表現を定義する方法と独自メソッドを定義する方法の2つがあるようです。 参考 Custom Validation Rules 正規表現を使用 'rule'に正規表現を直書きしてもいいようです。 正規表現はスラッシュで囲まれている必要があります。最後にiを付与すると大文字・小文字を区別しなくなります。 ここでは、「文字と数字のみで3文字以上となる値を入力」というバリデーション public $validate = array( 'code' => array( 'rule' => '/^[a-z0-9]{3,}$/i', 'message' => 'Only letters and integers, min 3 characters', 'allowEmpty' => true ), ); 「custom」ルールを使用 コアにも

    独自のバリデーションルールを作成
  • 99%のEmailアドレスにマッチする正規表現公開される | ソフトアンテナ

    一見Emailアドレスにマッチする正規表現を組み立てるのは簡単そうに思えますが、RFC 5322に厳密に準拠した正規表現を創りだそうとするととんでも無い努力が必要となるようです。 「Email Address Regular Expression That 99.9% Works」は、様々なプログラミング言語ごとに、Emailアドレスに99%マッチする正規表現を掲載したサイトで、例えばPerl 5.10より前のバージョンのPerl用として、掲載されている長大な正規表現を見れば、その難易度の高さを確認することができます。 正規表現にはなんの解説もなくどのような意図をもって作られたのか説明はありません(よって99%マッチするかどうかは当のところは不明)。ちなみに日語で読める貴重な情報「Perlメモ」では、「perl5.6.0以前の perl ではメールアドレスの正規表現を正確に記述すること

    99%のEmailアドレスにマッチする正規表現公開される | ソフトアンテナ
  • RegViz: Visual Debugging of Regular Expressions

    ^ / $ line beginning / ending \b word border position \B in-word position (?=x) lookahead if x comes next . any character \d / \D digit / any other \s / \S whitespace / any other \w / \W alpha-numeric / any other [ab] any character a or b [^ab] any character but a and b About the Project RegViz is a tool for debugging JavaScript regular expressions in a visual way. The goal of the project is to cr

  • 正規表現を解析して可視化してくれるサイトが凄すぎる件

    ある正規表現に対して、特定の文字列がマッチするかどうかをチェックするツールやサイトは沢山ありますが、正規表現そのものが何を意味しているのか、どんな文字列を期待しているのかを解析・解読・説明してくれるツールやサイトってなかなか見ない気がします。 他人の書いた正規表現を見て、「ん?」ってなったことはありませんか? 例えばこれ。 1 ^[a-zA-Z0-9-_.]@([a-zA-Z0-9_-]+\.)+[a-zA-Z]{2,4}$ これくらいなら分かりますが、複雑になってくるとつらい… いつかはマスターしたいけど…今は楽したい。 そう思ってググってみると…ありました! それがこちら。 Regexper http://www.regexper.com/ 正規表現を入力して Display をクリックすると、その正規表現が表す内容を図にして表示してくれます。 例えば先程の正規表現は、当記事の一番上の

    正規表現を解析して可視化してくれるサイトが凄すぎる件
  • vimで改行に置換 : Mazn.net

    2009年01月06日22:29 vimで改行に置換 カテゴリIT技術vi viで改行を置換(削除)するには、 :%s/\\n//g とすればよいですが、改行に置換するには置換先に\nを入れても置換できません。 :%s/hoge/\\n/g Debian Etchでは hoge12hoge34 hoge56hoge78 は ^@12^@34 ^@56^@78 となってしまいました。 \nの代わりにCtrl-v に続いてリターンを入力すると改行コード(^M)を挿入できます。 :%s/hoge/^M/g hoge12hoge34 hoge56hoge78 は無事 12 34 56 78 になりました。 「IT技術」カテゴリの最新記事

    vimで改行に置換 : Mazn.net
  • RegExr: Learn, Build, & Test RegEx

    RegExr is an online tool to learn, build, & test Regular Expressions (RegEx / RegExp). Supports JavaScript & PHP/PCRE RegEx. Results update in real-time as you type. Roll over a match or expression for details. Validate patterns with suites of Tests. Save & share expressions with others. Use Tools to explore your results. Full RegEx Reference with help & examples. Undo & Redo with {{getCtrlKey()}}

    RegExr: Learn, Build, & Test RegEx
  • 正規表現によるバリデーションでは ^ と $ ではなく \A と \z を使おう

    正規表現によるバリデーション等で、完全一致を示す目的で ^ と $ を用いる方法が一般的ですが、正しくは \A と \z を用いる必要があります。Rubyの場合 ^ と $ を使って完全一致のバリデーションを行うと脆弱性が入りやすいワナとなります。PerlPHPの場合は、Ruby程ではありませんが不具合が生じるので \A と \z を使うようにしましょう。 はじめに 大垣さんのブログエントリ「PHPer向け、Ruby/Railsの落とし穴」には、Rubyの落とし穴として、完全一致検索の指定として、正規表現の ^ と $ を指定する例が、Ruby on Rails Security Guideからの引用として紹介されています。以下の正規表現は、XSS対策として、httpスキームあるいはhttpsスキームのURLのみを許可する正規表現のつもりです。 /^https?:\/\/[^\n]+$/

  • unix: how to tell if a string matches a regex

    wakuworks
    wakuworks 2013/11/02
    fish で正規表現は、grep などを使う必要がある
  • [Bash]正規表現マッチした部分文字列を再利用する方法 · DQNEO日記

    Bashでは正規表現マッチを使ってマッチした部分文字列を再利用することができます。 つまり文字列の加工を自由自在にすることができます。 例:"foo_bar"から"foo"や"bar"を取り出したい [[ "foo_bar" =~ ^(*)_(*)$ ]] ここでマッチした部分文字列は、BASH_REMATCHという配列に格納されています。 # マッチした全体を参照したい場合 TOTAL=${BASH_REMATCH[0]} echo $TOTAL # => foo_bar # ()でマッチした部分文字列を取り出したい場合 LEFT=${BASH_REMATCH[1]} echo $LEFT # => foo シェルスクリプトで書くなら下記ような感じで。 #!/bin/bash if [[ "foo_bar" =~ ^(.+)_(.+)$ ]] ; then echo ${BASH_REM

  • シェル制御構造と正規表現の基礎・UNIXテクニック集

    次のように、拡張子の除去やファイル名の取得などで、よく使われます。 $ mypath=/home/hoge/foo.txt $ echo ${mypath%.*} → 拡張子を除く /home/hoge/foo $ echo ${mypath##/*/} → ファイル名のみを得るfoo.txt 理解しておくと便利なシェルの制御構造 bashは単純なコマンドだけではなく制御文も受けつけます。制御構造を使うと定型的な処理を行うのが楽になります。 コマンドの繰り返し シェルで繰り返しを行うにはfor文、while文、until文などがあります。ここでは、コマンドライン上でよく利用されるfor文、while文を紹介します。 for文 for文ではリストから項目を1つずつ取り出します。取り出した値は、指定した一時変数に格納され、処理内容が実行されます。処理内容はdoとdoneの間に記述します。 $

    シェル制御構造と正規表現の基礎・UNIXテクニック集
  • bashでファイルから一行ずつ読み込み、正規表現で処理 - torutkのブログ

    最近のbash (3.0)は、他のプログラミング言語並みに正規表現が使えることが分かりました。また、ファイルから一行ずつ読み込んで処理する記述がwhile制御構文で書けることも今回知ることができました。 while read line; do [[ "$line" =~ "^error in (.*):[0-9]* .*$" ]] && echo "file ${BASH_REMATCH[1]}" done < input.txt正規表現では、グループ化の括弧はエスケープ不要です。 この正規表現の形式はバージョン3から導入された新しい機能で、あまり知られていないようです。

    bashでファイルから一行ずつ読み込み、正規表現で処理 - torutkのブログ
  • 複雑な正規表現を分かりやすくするライブラリ VerbalExpressions の Objective-Cバージョンを書きました - 24/7 twenty-four seven

    https://github.com/VerbalExpressions/ObjectiveCVerbalExpressions ↑ 家にマージされました。 https://github.com/kishikawakatsumi/ObjectiveCVerbalExpressions 概要 VerbalExpressions はメソッドチェーンとわかりやすい名前を使って、正規表現を読みやすくしようという試みです。 ↓ オリジナルはJavaScriptのライブラリのようです。 https://github.com/VerbalExpressions/JSVerbalExpressions iOS Dev Weeklyの106号でObjective-Cの移植はまだ無いみたいに書いてあったので、やってみました。 (実際は2つほど先に書かれたものがありました) ↓ 私が書いた Objective

    複雑な正規表現を分かりやすくするライブラリ VerbalExpressions の Objective-Cバージョンを書きました - 24/7 twenty-four seven