最初のお話は、
『あるとき、私がhtaでフルスクリーン機能などを使い、実質的なロック状態を作ろうとしたとき』
2つめのお話は、『Webアプリを作っているときに、やけにリクエストが多くて、見てみると、あることが発覚した時』
の2本立てでお送りします! ※章とか節とか書いてますが、一瞬で完結します。第一話 HTA(HTML&Visual Basic Script)
冒頭からお送りします↓
一節 作ってみる
あるとき主人公の〇は、部活で、パソコンを遠隔ロックしたいと思った。
ただ、単にロックするだけなら、普通にexecやWindows Script Hostでもたった一行の関数で、
実現できてしまう。
ただ、これには一つ問題があった。
それは、ロック解除後の立ちあがりに時間がかかるのと、そもそも、面白みがないからだ。
学校ではADから降ってくるIntuneポリシーで、見事にタスクマネージャのタスク終了
ボタンが封じられているのを見てひらめいた。いけると
そして、開発に取り掛かる。
主要な機能は、
・vbs:excelのAPIで最前面固定&閉じられたイベントでフラグを確認し、
ロックアプリを復活させるか、自動で判断させる。
・HTML:単に、フルスクリーンや、タスクバーにアイコンを表示させないことや、閉じるボタンを
(実際はその周りも)を非表示にすること、2重起動を防ぐこと。
になっている。
次に問題のシーンです。
二節 お披露目&セキュリティホール(?)
さて、新たなアプリケーションを作りました。その名も「画面ロッカー」!
茶番はさておき、さっそく先輩に試してもらおう!と主人公の〇は、自分のタブを持ち先輩の元へ。
「先輩!みてください」〇は言う。
そこには、真っ白な画面にただ、「ロック中」とhtmlのh1タグで書かれて
文字コードだけがheadに入っていそうな、ウェブページではThe テキトーな作りだった。
- そんな当時の私のこういうことに付き合ってくれた先輩に心から感謝していて、今も忘れることはない。
そして、いざ先輩が解除に挑む、真っ先に試された「Alt+Delete+Ctrl」。
しかし、タスクマネージャからは終了できない。
ただ、やはりこの一瞬でこの判断をされたのは、凄みを感じ得る。
さて、ほかにも、F11を試していたが、Webアプリではないので効かない。
これは、最近のWebアプリに効く技である。しかし、確かにこれもHTMLだが、対応していない。
(その後先輩はタスクトレイから、タスクマネージャを何とか最前面に出した)
いったん、顧問にも見せてみる。
最初、よくみて、構造を理解しようとした。
原理はわからないが、いろいろ画面隅にマウスカーソルをもっていったり、
大量のキーショートカットを試していた。
そこで顧問が気付く
Tab+Windowsで、アプリスイッチャーのようなもの(デスクトップ1などが下に出る)で開き、
ウィンドウにカーソルをかざし、そこにある閉じるボタンを試した。
一度消えたがすぐに復活してくる。
- そして視線は仮想デスクトップに
顧問は、仮想デスクトップには影響がないことを見つけ、cmdを仮想デスクトップ上で、
問題なく起動するとができ、taskkillした。
その瞬間、ロックは解かれた。
えーロックが想定以外の方法で解かれるというのは、セキュリティ的によろしくない、ましてやロック機能なんて尚更です。
ということで、第一章は先輩&先生が見事に解除できてしまったというお話です。
さすがに、このまま自分で使っていこうとしていたら...と思うと、ひやっとします。
第二章 Web編
第二章です
あるとき、主人公である〇は、「チームでやりたいこと」を共有するシステムを制作していた。
こういったプラットフォームは既製品が多いが、メンバーそれぞれの環境に配慮し、
・キャッシュで完全にファイルを保存しておく→Service Workerで制御
・学校のパソコンからでも使えるようにする→フロントからAPI/バックまで、ブロックされるサービスを使用しない
・スクロールはなるべく限る場所でやる。
・連絡は、ポップアップモーダルで出す。
・通信は非同期で周期的に行う。
さて、この要件は簡易ですが、実装して試してもらうと、最初はとても順調にみんな使えました。
しかし、ある時メンバーに指摘されます。
「429でてるよ」
まずいと、主人公気が付きます。ステータスが400~の段階で、なんとなく異常だと思い、
ログを見てみると、なんと指摘してくれたメンバーのアカウントでのリクエストが、急増していた。
もちろん意図してやったわけではないとメンバーは語る。
主人公はありがとうと感謝を伝え、解決に急ぐ。
ちらっとそのメンバーのブラウザの画面をみた。
- タブが大量に開かれてる...
詳しく見せてもらうと、SPAである弊害で、それぞれのページが、違うページでそのまま
タブに残されていた。
メンバー本人もこれでは気が付かないだろう。
もちろん、それぞれのタブから同じリクエストが、飛んでくる。
そして、一つのidでタブは1つまで!とバックで制限すると、治まった。
メンバーにはそれを伝え、一度タブをすべて閉じてもらい、再度起動してもらった。
無事イベント終了まで駆け抜け、無事解散した。
これはPaaSで有名なG社がなんと無料で使えたので、こういう活動をしていると、リクエストが増えまくっていて、ひやっとした話です。
(幸いなことに、そのサービスは帯域制限や、転送量で従量課金がなかったことこそ、救いです。。。)
2話は1話と違い、簡潔にまとまったと思います。
結論
どうすればいいのか、教訓を考えてみます。
『今考えると、沢山対応策は考え付くのに、』
ということが、ふと、思い浮かびました。これは両者に言えることです。
つまり、私は知識があるのはいいが、ほかの手段を知らなかった、つまり、ほかにどんな技術がこの課題解決に直接的に応用が利くかが、身についていなかったのだなと思います。
Web編は、XSSからCORS、CSP設定(http関連)など重度の高いものは、全て理解していました。
ただ、利用者の環境を考えると、もう少し別の手段で、リクエスト数を減らしたり、効率化する方法はありました。それを知っておき、実装すべきだと思いました。
(実は,当時その手法は知っていたが1200%不可能であった※3)
※ cmd、psもグルポリで禁止されており、回復モードからしか開けないです。ただ、なぜかvbsのexecはでき、taskkillコマンドも実行できました。
※2 Windows編は全て一般ユーザ権限で実行しています。専門家が十分安全に配慮し実験を行っております。
※3 <ちょいネガティブ>義務教育中の人の資金を一応舐めないでください、有料サーバーはほぼ無理だと確信しています。(貯金して頑張る人はいいと思いますが、確実に続かず、3か月あとくらいには、そのページにサービスのロゴと、サインアップボタンがたいてい出てきます。)なお、1200%の数値に根拠はないです。
※4でも<超ポジティブ>そんなちょいネガティブな経験も「限られたリソースでの挑戦から得られる実践的な知識が、将来の大きな資産になること。」と、執筆後、GPTに見てもらい、こう答えました。確かに。