aiscript-dev / aiscript

🔋 A lightweight scripting language runing on JavaScript
https://aiscript-dev.github.io/aiscript/
MIT License
186 stars 33 forks source link

正規表現サポート #45

Open syuilo opened 4 years ago

syuilo commented 4 years ago

正規表現エンジン実装するのは流石にめんどいから、ネイティブのものを使うことになると思うけど、そうするとReDoSが行えるようになってしまう だからAiScriptのホストが正規表現エンジンを用意するようにさせよう

syuilo commented 1 year ago

やりたい

marihachi commented 1 year ago

これって構文として用意する? それか組み込み関数の追加で実現?

syuilo commented 1 year ago

とりあえず関数で事足りそう

salano-ym commented 1 year ago

Re:match(str, pat)みたいな

syuilo commented 1 year ago

というよりは正規表現を変数に入れたりしたときあるから正規表現という値を生成する関数を作った方が良いかも

syuilo commented 1 year ago
Re:match(str, Re:new('[a-z]+'))

みたいな

salano-ym commented 1 year ago

エスケープを減らすために生文字列リテラルはあると便利

Sayamame-beans commented 8 months ago

欲しいですね…(外部に作るのが面倒だったので、AiSciprtで昨今のスパムを捌いています)

salano-ym commented 5 months ago

ホスト側でタイムアウト時間を設定できるようにして超えたらErrorを返すようにすればReDoSは回避できる?

uzmoi commented 5 months ago

そもそもタイムアウトのための標準的な機構がjsの正規表現にないかも? ブラウザでReDoSに耐性のある正規表現の選択肢としてはre2-wasmのような安全な正規表現エンジンのwasmバインディングを使うか、recheckなどで事前に計算量が爆発しないかをチェックする方法しか知らないです。 事前チェックは偽陰性があるかもしれない(よく見てないのでもしかしたら大丈夫なのかもしれない)し、recheckはScala.js製でサイズがでかい(bundlephobia見るとmin+gzipで1MBある)

タイムアウトできるライブラリはNode.jsのvmとか使ってるのでブラウザで動かない(Worker使ったらできるか?) ので、どうやっても全部ホスト側で用意しないといけなそう。

syuilo commented 5 months ago

まあ完全に信頼されたコードしか実行されないことが保証されているユースケースではReDoSの心配は無視できるから、とりあえずネイティブの正規表現で実装してオプションで外部から正規表現エンジンを設定できるようにすると良さそう