タグ

studyと正規表現に関するraimon49のブックマーク (26)

  • 正規表現の脆弱性 (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) と呼ばれる脆弱性です。正確に理解するのが難しい脆弱性なので、少し解説してみたいと思います。 結論 長い記事になるので、最初に「とりあえずこれだけ知っ

  • Vimmerに捧げる正規表現の基礎中の基礎 — KaoriYa

    正規表現はVimに限らずコンピューター上でのテキスト操作において非常に強力です。 しかし学習の難しさも非情で多くのIT技術者、Vimmerが正規表現に苦しんでいるのを幾度となく目の当たりにしています。 ただ正規表現は当にそんなに難しいのでしょうか。 いいえそんなことはありません。 正規表現は来とても簡単な原理で学習も容易なのです。 にも関わらず難しいと思われてしまうのは、原理を理解しないまま外見上の機能をそのまま覚えようとするからです。 記事では正規表現の原理にフォーカスし解説することで、Vimを含む様々な正規表現実装の利用難度を適切にしようという記事です。 記事は Vim Advent Calendar 2019 の1日目の記事です。 「正規表現」はもともと形式言語という言語学の一分野の研究から生まれました。 言語学というのは言葉を科学的に研究する学問です。 形式言語はその中でも

  • Masato Kinugawa Security Blog: ユーザ入力を使った正規表現から生じるDOM based XSS

    お久しぶりです&あけましておめでとうございます。昨年はブログを書く時間をうまく作ることができず、あまり記事を書けませんでした。今年はできるだけ月に1回程度何か書いていきたいと思っています。今年もよろしくお願いします! さて、ブログを書かなかった間にXSSからSQLインジェクションへ興味が移った、なんてことはありませんでしたので、今日もいつも通り大好きなXSSの話をしたいと思います! 最近、正規表現にユーザ入力を使っていることに起因するDOM based XSSに連続して遭遇しました。あまり見慣れていない注意が必要な問題だと思うので、この記事では、見つけたもの2つがどのように生じたか、また、問題を起こさないためにどうすればよいかを紹介します。 そのうちの1つはLINEのBug Bounty Programを通じて報告した問題です。 賞金と、"LINE SECURITY BUG BOUNTY"

    raimon49
    raimon49 2018/02/07
    >いずれの修正も正規表現を組み立てない方法で書き直すことができているように、たいていの場合、ユーザ入力から正規表現を組み立てる必要はないはずです。 / 強力過ぎる正規表現を安易に使ってはいけないという話。
  • git grepでソースコード内検索のあれこれ - エンジニアをリングする

    FOLIOアドベントカレンダー 21日目です。 12月は読み応えのある記事が多いので、わたしからはさくっとしたTipsを。 いま作業してるリポジトリのファイル群から、目当ての文字列を1秒でも早く見つけるための話。 おすすめのコマンド grep だと対象指定が面倒だったり、カレントディレクトリ以下を指定すると巨大なnode_modules以下のファイルも対象になってしまったりするので、git管理下のファイルのみを対象に検索できて高速な git grep がおすすめ。 git grep 検索したい文字列 だけで検索できる。 ~/.bashrc や ~/.zshrcなどに以下のエイリアスを書いておくと、 gg hoge だけでgit管理下のファイルにあるhogeをハイライトつきでリストアップしてくれてめちゃ手軽。 alias gg='git grep' もちろん日語も gg ほげほげ でいける

    git grepでソースコード内検索のあれこれ - エンジニアをリングする
  • PHPで学ぶVM型正規表現エンジンの仕組み

    PHPカンファレンス福岡での発表資料です。

    PHPで学ぶVM型正規表現エンジンの仕組み
  • Revenge of the Types: 型の復讐 - Qiita

    稿は Python に型アノテーションを追加するという提案が行われたときに起こった Python コミュニティの議論の後、2014年8月24日 (日) に Armin Ronacher (@mitsuhiko) 氏によって書かれた記事の翻訳です。 Revenge of the Types Revenge of the Types by Armin Ronacher : Python (REDDIT) Revenge of the Types | Hacker News Python 3.5 で導入を検討している型アノテーションについて興味がある方は以下を参考にしてください。 mypy で静的型付け Python プログラミング 私自身、型システムや他言語に明るくないため、一部未訳の部分があったり、勘違いや誤訳もあると思います。そういった誤りを見つけたら編集リクエストを送ってもらえると助か

    Revenge of the Types: 型の復讐 - Qiita
    raimon49
    raimon49 2015/01/13
    >言語としての Python は、アノテーションとうまくやるにはあまりに動的過ぎます。 / ジェネリクス、nullableやOptional型の導入されている言語との比較。re.compile()が返すオブジェクトの掘り下げやJavaScriptの評価が興味深い。
  • 正規表現によるバリデーションでは ^ と $ ではなく \A と \z を使おう

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

    raimon49
    raimon49 2014/03/04
    >Rubyの正規表現機能は、デフォルトで複数行モードである / ひー。知らなかった。PHPも末尾が改行コードだと挙動が変わる。
  • iOSで使う正規表現の注意すべき落とし穴 | DX.univ

    iOSアプリ開発担当の菅原です。 今日はみんな大好き正規表現[...]iOSアプリ開発担当の菅原です。 今日はみんな大好き正規表現についてのお話です。 iOSにおける正規表現の基礎は NSRegularExpression iOSで使う正規表現 をご覧ください。 正規表現が正常に動作しない問題 それはFalconの開発中に発生しました。 Falconでは正規表現を使って文字列の置換やチェックを行なっています。チェックする対象とチェックワードが動的に決まる箇所があるのですが、チェックワードに不正な文字列が入ると正規表現が正常に動作しない問題にあたりました。 例えば以下の様なコードで動的に決定していると不具合が生じる可能性があります。 NSRegularExpression *regexp = [NSRegularExpression regularExpressionWithPattern:

    raimon49
    raimon49 2013/10/10
    “+ (NSString *)escapedPatternForString:(NSString *)string”がNSRegularExpressionに存在
  • Javascriptによる正規表現まとめ - Y's note

    Index JavaScriptで利用できる正規表現についてまとめました。 最後の後読み、否定後読み以外は利用可能かと思います。 モード修飾子(i,m,g) \n,\r,\u2028,\u2029以外の任意の1文字 空白文字以外( \S ) 数字( \d ) 数字以外( \D ) 先頭( ^ ) 末尾( $ ) 単語区切り( \b ) 単語区切り以外( \B ) 0以上の繰り返し( * ) 1以上の繰り返し( + ) 0または1回( ? ) 最短マッチ( .*? ) nの繰り返し( {n} ) n以上の繰り返し( {n,} ) n以上,m以下の繰り返し( {n,m} ) いずれかの文字( [▲◎■] ) いずれかのパターン( (▲|◎|■) ) 後方参照( \n ) エスケープ( \ ) 先読み( ?=◎◎◎ ) 先読み否定( ?!◎◎◎ ) 後読み( ?<=◎◎◎ ) 否定後読み( ?<

    Javascriptによる正規表現まとめ - Y's note
    raimon49
    raimon49 2013/08/20
    それぞれのパターンとマッチ結果サンプル集
  • ApacheのRewriteRuleで検索条件に^/がマッチしない場合がある理由 - このブログはURLが変更になりました

    ApacheのRewriteRuleで「/hoge/配下にアクセスがあったら http://example.jp/fuga/ に301リダイレクトを行う」ってな処理を書く場合、先頭に/が必要な場合と必要ない場合がある。 RewriteEngine on # これでいける場合もある RewriteRule ^/hoge/(.*) http://example.jp/fuga/$1 [R=301,L] # こう書かないとダメな場合もある RewriteRule ^hoge/(.*) http://example.jp/fuga/$1 [R=301,L] この先頭に/が必要不要の違いはなんだろうなーと思っていたが、先日理由がわかった。 Apacheのドキュメントにしっかり書いてあった。 RewriteRule Directive What is matched? In VirtualHost c

    ApacheのRewriteRuleで検索条件に^/がマッチしない場合がある理由 - このブログはURLが変更になりました
    raimon49
    raimon49 2013/07/30
    VirtualHostディレクティブとDirectoryディレクティブ、.htaccess 両対応のコツ
  • Rubyのエンコーディング - tmtms のメモ

    Ruby 1.9 から文字列や正規表現オブジェクトはそれぞれエンコーディング(いわゆる文字コード)を保持するようになりました。 たとえば 0xB1 0xB2 という2バイトは EUC-JP エンコーディングでは「渦」、SHIFT_JIS エンコーディングでは「アイ」という文字になります。つまり同じバイト列でもエンコーディングが異なれば異なる文字として解釈されます。 1.8 では文字列はただのバイト列でした。なので、それがどのような文字を表しているのか、つまりエンコーディングが何なのかはプログラムが知っている必要がありました。 1.9 では文字列オブジェクト自身が自分が何のエンコーディングかを知っています。同じ 0xB1 0xB2 というバイト列でも、それが EUC-JP の「渦」なのか SHIFT_JIS の「アイ」なのかは、文字列自身が知っています。 スクリプトエンコーディング スクリプ

    Rubyのエンコーディング - tmtms のメモ
    raimon49
    raimon49 2012/09/27
    マジックコメントと正規表現のオプション
  • 僕が一番 Vim の正規表現をうまく使えるんだ(\zs \ze 編) | Webシステム開発/教育ソリューションのタイムインターメディア

    問題 Vim の正規表現はとても豊富で、ベーシックなものからアドバンスドなものまでかなりの道具が揃っています。 これを駆使すればありとあらゆる……は言い過ぎですが、 世の中のテキスト処理の九分九厘を快適に行うことができます。 ただ、あまりにも数が多いので、一体どこから覚えていけばいいのか困りますし、 :help に記載されているものの中には今後の人生で活用する機会があるかどうか分からないものもあります。 手っ取り早く正規表現力を高めて生産性を向上するには一先ずどれを覚えれば良いのでしょうか。 解答 まずは\zsと\zeを覚えましょう。 この2つは正規表現のマッチの開始位置/終了位置を指定することができます。 これだけでは何のことやらさっぱりですが、以下のように応用することができます: 「foobar」の「foo」を指定 foo\zebar で表現できます(Perl 語で言うところの foo

    僕が一番 Vim の正規表現をうまく使えるんだ(\zs \ze 編) | Webシステム開発/教育ソリューションのタイムインターメディア
  • メールアドレスの正規表現がめちゃめちゃ遅くなることがある件について - 木曜不足

    Solr 3.5 から新たに加わる言語判定機能に、拙作の言語判定ライブラリ langdetect が正式に採用されたようで。 言語判別機能の追加 (Solr 3.5) http://lucene.jugem.jp/?eid=455 LanguageDetection - Solr Wiki http://wiki.apache.org/solr/LanguageDetection もともと Apache Nutch などの言語判定に不満で作り始めたこと、そして実際に社内(サイボウズ)で langdetect を Solr に組み込んで利用していることを考えれば、懐と言ってもいいくらい。 ありがたや。 でも、今日の話はそっちではなくて。 その langdetect の Issue Board にて教えていただいた「メールアドレスの正規表現がめちゃめちゃ遅くなることがある」件について。 論よ

    メールアドレスの正規表現がめちゃめちゃ遅くなることがある件について - 木曜不足
    raimon49
    raimon49 2011/10/29
    ありがちな「メールアドレスっぽいもの」を判定する正規表現パターンで学ぶオーダーの違い。正規表現エンジンに鬼車を採用するRubyではエイリアス部に文字制限を入れてもパフォーマンスが変わらない。
  • 誤った判定 - 学校では教えてくれないバッドノウハウ英語 #13 - bkブログ

    誤った判定 - 学校では教えてくれないバッドノウハウ英語 #13 学校では教えてくれないバッドノウハウ英語の13回は、誤った判定(間違った判定)に関する表現を取り上げたいと思います。 スパムフィルタによるスパムの判定や、メモリチェックツールによるメモリリークの判定など、コンピュータの世界では、ソフトウェアを用いて何かを自動で判定することがよくあります。 ここで問題となるのが、誤った判定です。スパムフィルタの例で言えば、「当はスパムじゃないのにスパムと判定された(大切なメールがスパムフォルダに行ってしまった)」と「当はスパムなのにスパムじゃないメールとして判別された(スパムが受信箱に入ってきた)」という2つの場合があります。 英語では前者の場合を false positive、後者の場合を false negative と呼びます。日語では偽陽性、偽陰性となりますが、基的に医学用語な

    raimon49
    raimon49 2011/07/04
    false positive 誤ったマッチ
  • 最近の Wedata のこと - xK.memo

    Wedata 落ちてるし、最近投稿された AutoPagerize 用の SITEINFO は腐ったのが多いという話を書く。 自分が把握している限りでは、まず29日の午前12時あたりに jqwerty と vavo という人が、このような感じの SITEINFO を大量に追加していった。正確な件数はちょっとわからないけれど、100件以上はあったと思う。 20c0da7e7383afdd6567306f83b947cf pageElement //div[@id=‘outer-wrapper’]/div[@id='wrap2’] url http://idreamofplum.blogspot.com/* nextLink //div[@class=“blog-pager”]//a[@class=“blog-pager-older-link”] 特徴としては、 - SITEINFO の名称を

    最近の Wedata のこと - xK.memo
    raimon49
    raimon49 2011/03/24
    変なハッシュ値を持つデータの正体。ダメなSITEINFOのアンチパターンとして。
  • もっと速くするために(スコープ解決コストと正規表現オブジェクトの置き場所) - latest log

    正規表現オブジェクトをどのように配置すれば効率的なのか調べました。 配置パターン A. ループ内にべた書き function job(expr, n) { var i = 0, match; for (var i = 0; i < n; ++i) { match = /regexp1/.exec(expr); match = /regexp2/.exec(expr); } } B. スコープ内(ループの外)に配置 function job(expr, n) { var i = 0, match, REX1 = /regexp1/, REX2 = /regexp2/; for (var i = 0; i < n; ++i) { match = REX1.exec(expr); match = REX2.exec(expr); } } C. 5つ外側のスコープに配置 (function() {

    もっと速くするために(スコープ解決コストと正規表現オブジェクトの置き場所) - latest log
    raimon49
    raimon49 2011/02/22
    繰り返し使う正規表現オブジェクトは、見付ける手助けをしてやる。
  • 正規表現モジュールからはじめるスクレイピング - YAMAGUCHI::weblog

    はじめに こんにちは、Python界のつけ麺大王@麻布十番です。先日はpyqueryを使ってWebでスクレイピングをする方法をご紹介いたしましたが、そもそも昨今のプログラミング言語ではたいてい正規表現が使えるようになっていまして、単純なものならこれを使ってスクレイピングするのもいいですよねー、っつー話。ほんの10分やってみればわかると思います。 リンク 全部標準ドキュメントの正規表現操作のところに載ってます。日語ドキュメントはローカルに置いときましょう。 7.2. re — 正規表現操作 — Python 2.7ja1 documentation 確認したい点 パターンマッチさせようとしている文字列はstrかUnicodeか パターンもUnicodeにしなければいけなくなる re.UNICODEを付ける VERBOSEを使うのかどうか 長すぎるパターンでは積極的に使うべき エスケープすべ

    正規表現モジュールからはじめるスクレイピング - YAMAGUCHI::weblog
    raimon49
    raimon49 2011/01/24
    多バイト文字のハマりポイント
  • 正規表現エンジンを作ろう (1)

    はじめに こんにちは。hirataraです。 私が初めて正規表現を使ったのは、PerlによるCGIでの文字列処理でした。それから私はPerlを使い続け、今では正規表現なしのコーディングは考えられないほど、正規表現を当たり前の機能として日常的に使っています。昔は標準では正規表現をサポートしていなかったJavaも、今では正規表現をサポートするようになりました。Javaだけではなく、今日ではほとんどの高級言語にとって、正規表現はなくてはならない機能であると言っても過言ではないほどメジャーな機能となっています。 記事では、この正規表現の舞台裏に光を当てます。一見すると作ることが難しそうな正規表現エンジンですが、その根底には数学的な概念があり、その概念さえ知っていれば基礎となる機能の実装はそんなに難しくありません。この連載ではその数学的な概念をPythonを使って表現しながら、実際に動作する正規表

    正規表現エンジンを作ろう (1)
    raimon49
    raimon49 2011/01/10
    正規表現の定義
  • 正規表現で素数判定 - NO!と言えるようになりたい

    追記:ハッキリ言ってこの正規表現はネタなので,実際に素数判定を行いたい場合は,もっと別な賢いアルゴリズムを使ったほうが良いです 正規表現で素数が判定できるという記事を見たので試してみた. http://www.noulakaz.net/weblog/2007/03/18/a-regular-expression-to-check-for-prime-numbers/ この記事によると /^1?$|^(11+?)\1+$/ という正規表現を使うと,素数判定が出来るらしい.ある整数 n が素数かどうか判定したい場合は,"1" * nという文字列がこの正規表現にマッチするかどうかを調べればよく,マッチすれば非素数,マッチしなければ素数となる.ただし,"1" * n は,例えば,n が 4 ならば "1111" と 1 が 4 回連続して続く文字列となる. Rubyで書いた素数判定プログラムはこん

    正規表現で素数判定 - NO!と言えるようになりたい
  • アイテム: Twitter status - データベース: AutoPagerize - wedata

    //span[contains(concat(" ",normalize-space(@class)," "), " meta ")]/a[contains(text(),"in reply to")]

    raimon49
    raimon49 2010/06/23
    正規表現とXPathのお手本 個々の更新履歴も面白い。