1. tanaken on Rails
  2. #043: DATABASE_URL query_cac..
2024-11-02 07:50

#043: DATABASE_URL query_cache, Regexp.timeout

サマリー

第43回では、Database URLに関するクエリキャッシュの挙動と、正規表現のタイムアウト設定について解説しています。特に、リドス攻撃対策として初期値が1秒に設定されることが注目されます。

Database URLとクエリキャッシュ
はい、こんにちは。第43回のtanaken on Railsです。
今週は、2つのプレリクエストをピックアップします。
1つ目、cast query cache value when using URL configurationということで、
アクティブレコードに関する変更です。
環境変数、Database URLで、
クエリパラメータにクエリキャッシュというパラメータを指定したときの挙動を変更しています。
僕、知らなかったんですけども、そもそもDatabase URLという環境変数にね、
クエリパラメータを指定することで、
データベースの情報、設定情報を定義できるという仕組みがあることを知らなかったんですよね。
今回知りました。
railsguide.jpを見てみたところ、そこにもね、ちゃんと書いてあって、
接続情報をURL化して、以下のように環境変数に保存することもできますよ、とかっていうので、
例えば、この例だと、
postgreSQL localhostsら、データベース名かなこれ、
ブログデベロップメント、で、はてな、で、プールイコール5。
コネクションプールの設定を5にするっていうのを、
データベースURLで指定するっていうことができる、みたいな例で書いてありますね。
そんなのあったんだと知らなかったわ、というとこなんですけど、
今回はクエリキャッシュというパラメータを指定した場合の話。
おそらくこのクエリキャッシュっていうのは、
もともとパラメータとしては、
データベースURLだけじゃなくね、
多分、database.yamlとかにも指定できるものなんだろうと思うんですけど、
あんまり僕いじったことなかったなと思ってて、
クエリキャッシュでパラメータを指定した場合の話です。
このパラメータは今までは、
falseが指定されたらキャッシュしない、URLにおいて、
falseが指定されたらキャッシュしない、
それ以外が指定されたらキャッシュする、という挙動になっていましたという感じですね。
これは、例えば、yamlで設定してた場合には、
多分、その設定された数値なら数値とかで動くようになっていたんじゃなかろうかな。
もう一回プリンクルめいてみようかなと思うんですけど、
ちょっとお待ち。
あ、いやでも違うか。
falseが指定されたらfalseになるだけだから、やっぱりそうだな。
今説明した通りですわ。
これ、yamlにおいてもそうですね。
falseが指定されたらキャッシュしない、
それ以外だったらキャッシュする、という挙動になっていたようです。
今回の変更により次のようになりました。
falseが指定されたらキャッシュしないのはそのまんま、
数字が指定されたら数字を数値に変換して、
その数値の文字数までキャッシュする。
それ以外が指定された場合はキャッシュする。
普通に文字数は関係なくキャッシュするよ、という感じ。
なので、今回の変更によってキャッシュする文字数を
指定できるようになったということになるかなと思います。
クエリキャッシュの文字数を指定するという使い方があるんだ。
なんか不思議な感じもしますけどね。
クエリキャッシュ、クエリの終盤、後ろの方で何か、
例えばフェアワークの条件が変わったりした場合って、
変わってるのに同じ結果がキャッシュされるのかな。
このクエリキャッシュというもの自体の理解があんまり深くないですけど、
どうなんですかね。
何か困るシーンもありそうな気がするけれども、
という感じでございます。
正規表現のタイムアウト設定
続いて2個目。
デフォルトReviewExp.TimeoutToOneSecondということで、
レールタイズに関する変更です。
正規表現のタイムアウトの初期値が1秒に設定されるようになりました。
これはリドス攻撃の対策の一環ということで、
タイムアウト設定されてないと攻撃となるような正規表現を受け取ってしまって、
例えば何秒、何十秒、何分も待たされるみたいな攻撃を受けなくなると思うので、
タイムアウトを設定されていれば、それを超えたらエラーになるという設定なので、
そういうのを設定するようになりました。
なお、タイムアウトがすでに設定されている場合はそれを上書きしませんという注釈がありました。
正規表現のタイムアウトについては、Rubyのドキュメントに記載があります。
docs.rubylang.org//en//3.3//reguxup.htmlに書いてありました。
タイムアウトについては、初期値はニルで、タイムアウトの設定はないようになっています。
なので、無限、長ければ長いだけ時間がかかるということですね。
タイムアウトの設定は2つの設定の仕方があって、
1つは正規表現クラス全体にタイムアウトをつけると、
reguxup.timeout、
例えば3.0とかってやると、タイムアウトが3.0秒ですね、というふうに設定されると。
もう1つはオブジェクトごとにタイムアウトを設定する方法もあって、
reguxup.new、
オブジェクトごとにタイムアウトを設定する方法もあって、
reguxup.newという形で正規表現のオブジェクトを作るときに、
キーワード引数としてタイムアウトを指定することができて、
例えばタイムアウト5.0とかでやると、タイムアウト5秒になりますよと。
そのオブジェクトだけ正規表現のタイムアウトが5秒になりますよと。
そういう設定ができるそうですと。
今回は正規表現クラス全体の初期値を1秒に設定するようになったよということなので、
個別にこの正規表現はそもそもちょっと時間かかるんだというのが
アプリケーションの実装者側が分かっている場合は、
そのオブジェクトだけ長いタイムアウトを指定したりとか、
そういうふうに対応してもらえるといいのかもなというところでございますね。
以上2つの紹介でした。
今週はこんなところで終わりにしたいと思います。
先週は特にめちゃめちゃ何か事情があったわけじゃないんですけど、
何かスキップしてしまいまして、
そういう週もあろうと。
これまで毎週ちゃんとできていたと思うので、
残念なところもあるんですけど、
無理せずやっていければいいなと思うので、
スキップする週があってもよかろうということで、
引き続き自分のペースでやっていきたいと思います。
ではまた来週。バイバイ。
07:50

コメント

スクロール