オンラインバンキングを修復します



先日、私の銀行のオンラインバンキングが機能しなくなりました。 いいえ、私が完全に停止したわけではありません-あなたが入ることができ、何かをすることさえできるようですが、ここに最も重要なことの1つがあります(支払いアーカイブを見る)-それはきつい仕事を拒否しました 次のようになります。支払いのリストを含むページを開くと、ブラウザーは使用可能なRAMをすべて使い果たしてクラッシュします。 Chromeでは、現在のタブのみがクラッシュしますが、FirefoxとIEは完全に死にます。 バグは、iPad、Mac OS用のSafari、Linux用のFirefoxの3つの異なるPCで再生されます。 さて、「ウイルス対策をインストールする」と「再起動して再度ログインする」という技術サポートのヒントの素朴さを示すために、私はあなたにそう言っています。 考えてみましょう-この状況で何かできるでしょうか?



誰のせいですか?



まず最初に、メモリ吸収の責任を負うのは誰なのかを正確に理解する必要があります。それは、ブラウザまたはサードパーティのコンポーネントです。 Chromeの設定に移動して、インストールされているすべての拡張機能を無効にします。 ページchrome:// plugins /を開き、Java、Flash、Silverlight、および一般的にそこにあるすべてのものを無効にします。 万が一の場合に備えてブラウザを再起動し、再び支払いアーカイブページに移動します。利用可能なすべてのメモリを使い果たしてクラッシュします。







これは、無効化されたコンポーネントはどれも無害ではないことを意味し、それらを安全にオンに戻すことができます。 ほとんどの場合、このページを開いたときにブラウザーをロードして実行するJavascriptコードです。



だから誰が責任があるのでしょうか?



Chromeの「開発ツール」(Ctrl + Shift + I)は、ページに約12個のjsファイルが読み込まれることを示しました。 この場合、すべてのファイルのダウンロードが終了してからタブがクラッシュするまで、3〜4秒かかります。 最初に頭に浮かぶのは、そのような速度では無限ループしか食べられないということです。このループでは、メモリが何かに継続的に割り当てられます。 それを見つけて中和するだけです。 Chromeには、デバッガーが組み込まれていて、呼び出しスタックと停止した時点の変数の値が表示されたときにJavascriptコードの実行を中断できる機能があります。 タブがクラッシュする前に3〜4秒しか存在しないのは悪いことです。その後、デバッガはすでに役に立たなくなります。 2、3回のトレーニングの後、ようやくコードを停止できました。 そして、私たちはこのコードを持つ関数にいることがわかります:



function(b,d) { var val=""; var a=b-this.count*2; while(a--) {val+="*"} ... }
      
      







呼び出しスタックの上には、他の関数への呼び出しが約40ありますが、一般に、コードが圧縮されているファイルにあり、この形式でも解析するには大量のボリュームを占有します。 しかし、疑いがあった最初の段階で他に何があったかを覚えています-「メモリが割り当てられる無限のサイクル」。 while(a--)ループには、1つの可能性がすべてあります。 aが小さな正の数である場合に適しています。 そして、それが数十億に等しいカップルなら? そして、それが負の場合は? 多分あなたはどこかでこれをチェックしているのを見ますか? そして、私は見ていません。 おそらく、ここは間違いです。



どうする



このループをスキップすることから始めましょう。 これが何につながるかはわかりませんが、支払いアーカイブのあるページで突然、取り返しのつかない操作を実行することはほとんどありません(特にすべての取り消せない操作には確認が必要です)。 最小限のコード変更で、 while(a--)while(0)に置き換えるように思われました。 ここで、何らかの形でスクリプトをブラウザにパームアウトする必要があります。 この時点で、私はWeb開発者ではないことを認める時が来たので、彼らがどうやってそこにたどり着いたのかわからない。Web開発でこれを行うのが慣例だ。 しかし、私はあらゆる種類の便利なツールに少し精通しており、HTTPトラフィックの調査/変更に最も役立つものの1つはFiddler2です。 まず、プロキシサーバーであり、サーバーからすべてのトラフィックをそれ自体を介してブラウザーに渡します。次に、特定の要求に応じて、所定のテキストまたはファイルを送信できるようにします。 次は技術の問題です。 重要なスクリプトをディスクに保存し、ループを編集し、Fiddler2をオンにして、リダイレクトルールを構成します。







出来上がり!



ブラウザを開き、支払いページに移動すると、驚くことになります-すべて正常に動作します! この関数がアスタリスクで装飾されていたはずなのかわかりませんが、それがなければすべてがうまくいき、最も重要なことは、もはや無限ではありません。 このf話の教訓は、決してあきらめないことです。あなたはいつでも何かを思いつき、道を見つけることができます。



PSページのアドレスと変数の名前は、念のために(本質を変更せずに)変更されます。 銀行はバグを通知しました。



All Articles