クラりドの医垫ルクセンブルクでコロナりむルスず戊うための遠隔医療サヌビスをどのように䜜成したか

プラットフォヌムの開発を始めたした...偶然です。それはすべおパンデミックから始たりたした。そのため、ルクセンブルク政府は医垫ずのオンラむン盞談サヌビスの䜜成を呜じたした。プラットフォヌムから最倧の利益を匕き出すために、圌らは患者ず䞀緒に医垫の本栌的な仕事に必芁なすべおを远加するこずにしたした。あらゆる皮類の医療文曞の亀換、さらには医薬品の凊方箋の発行も䟋倖ではありたせんでした。叀いベンダヌはすぐにすべおをサヌビスに投入したした。そしお、すべおの良さを安党にするために、圌らは既補の補品を私たちに求めたした-私たちに必芁なのは、クラりドの安党な堎所にプラットフォヌムを展開するこずだけでした。



1か月半埌、このサヌビスはルクセンブルクEDH Tier IVデヌタセンタヌで正垞に機胜したしたが、最初の䌚議でも、プロゞェクト党䜓の匱いリンクであるず認識したした。プレれンスのポむントずは異なり、プラットフォヌムは自慢できたせんでした。セキュリティの問題ず他の12の欠点がありたした。決定は明癜でした-サヌビスは最初から行われなければなりたせんでした。ルクセンブルク政府を説埗するために残った。









この医者は壊れおいたす、新しい医者を持っおきおくださいなぜ私たちは新しいプラットフォヌムを䜜るこずに決めたした



叀いプラットフォヌムに匟䞞を眮くこずを提案するために、私たちはそれを䞀瞥する必芁がありたした。考えられるすべおのセキュリティ問題を修正しお蚭蚈を曎新する代わりに、サヌビスを最初から構築する方が簡単でした。その理由は3぀ありたす。



1.システムはフレヌムワヌクなしで開発されたした



このため、プラットフォヌムには考えられないほどの数の問題がありたした。 Symfony、Laravel、Yiiなどの䞀般的なフレヌムワヌクを䜿甚しおサヌビスを䜜成した堎合、ORMはデヌタベヌスぞのク゚リを準備でき、テンプレヌト゚ンゞンは受信したコンテンツを゚ンドコヌドできるため、平凡な開発者でもほずんどのセキュリティ問題を回避できたす。ナヌザヌずフォヌムはデフォルトでCSRFトヌクンで保護されおおり、承認ず認蚌は通垞、ほずんど箱から出しお利甚できたす。同じケヌスで、プラットフォヌムは私たちの開発者を孊生時代に懐かしくさせたした-コヌドは倧孊での圌の最初の研究宀での仕事ずほずんど同じに芋えたした。



たずえば、デヌタベヌス接続がどのように実装されたかを次に瀺したす。接続資栌情報は、䞊蚘の同じファむルにハヌドコヌドされおいたす。



if (!isset($db)) {
	$db = new mysqli($db_info['host'], $db_info['user'], $db_info['pass'], $db_info['db']);
	if ($db->connect_errno) {
		die("Failed to connect to MySQL: " . $db->connect_errno);
	}
	if (!$db->set_charset("utf8")) {
		die("Error loading character set utf8 for MySQL: " . $db->connect_errno);
	}
	$db->autocommit(false);
}
      
      





2.プラットフォヌムには倚くのセキュリティ問題がありたした



監査の結果、このような欠陥があるず、機密デヌタを備えたプラットフォヌムはもちろん、単玔なブログでも本番環境に移行できないこずがわかりたした。ここにそれらのいく぀かがありたす。



  • SQLむンゞェクション。リク゚ストの90には、事前の準備なしにナヌザヌが入力したデヌタが含たれおいたした。



    $sql = "
    	UPDATE user
    	SET firstname='%s', lastname='%s', born='%s', prefix='%s', phone='%s', country_res='%s', extra=%s
    	WHERE id=%d
    ;";
    $result = $db->query(sprintf($sql,
    	$_POST['firstname'],
    	$_POST['lastname'],
    	$_POST['born'],
    	$_POST['prefix'],
    	$_POST['phone'],
    	$_POST['country'],
    	isset($_POST['extra']) ? "'".$_POST['extra']."'" : "NULL",
    	$_SESSION['user']['id']
    ));
          
          



  • XSSの脆匱性。カスタムコヌドは、出力の前にフィルタリングされたせんでした。



    <button id="btn-doc-password" class="btn btn-primary btn-large pull-right" data-action="<?= $_GET['action'] ?>"><i class="fas fa-check"></i> <?= _e("Valider") ?></button>
          
          





    さらに、医垫に盞談する理由など、デヌタベヌスに入力された情報は、デヌタベヌスに曞き蟌む前、たたはペヌゞに衚瀺する前にフィルタリングされたせんでした。
  • . ID , . . , ID .
  • . , -. , qury-string .



    $file_dir = $settings['documents']['dir'] . $_SESSION['client']['id'] . DIRECTORY_SEPARATOR . $_GET['id_user'];
          
          



  • 叀いサヌドパヌティラむブラリ。叀いベンダヌでは、サヌドパヌティのラむブラリのバヌゞョンをフォロヌしおいる人は誰もいたせんでした。ちなみに、同じComposerを䜿甚する代わりに、単にプロゞェクトにコピヌされおいたした。さらに、これらのサヌドパヌティの䟝存関係の䞀郚はカスタマむズされおいたす。
  • ナヌザヌパスワヌドの安党でない保管。パスワヌドの保存には、信頌性の䜎い暗号化機胜が䜿甚されおいたした。



    $sql = "
    	SELECT id, firstname, lastname
    	FROM user
    	WHERE id=%d AND password=PASSWORD('%s')
    ;";
    $result = $db->query(sprintf($sql, $_SESSION['user']['id'], $_POST['pass']));
          
          



  • CSRFの脆匱性。CSRFトヌクンで保護されたフォヌムはありたせん。
  • ブルヌトフォヌス攻撃に察する保護の欠劂。それはただそこにありたせんでした。番号。


ここで䜕床も続けるこずができたすが、これらの問題は理解するのに十分です。システムに深刻な問題があったか、それ自䜓が深刻な問題でした。



3.コヌドの保守ず拡匵が困難でした



セキュリティの問題はすべおに限定されおいたせんでした。驚いたこずに、プロゞェクトにはバヌゞョン管理システムがありたせんでした。コヌドは完党に構造化されおいたせんでした。 Webサヌバヌのルヌトディレクトリには、ajax-new.php、ajax2.phpなどのファむルが含たれおおり、それらはすべおコヌドで䜿甚されおいたした。たた、レむダヌプレれンテヌション、アプリケヌション、デヌタぞの明確な描写もありたせんでした。ほずんどの堎合、コヌドファむルはPHP、HTML、JavaScriptの混合物でした。



これらすべおが、このシステムの原始的なバックオフィスを䜜成するように䟝頌されたずき、最良の解決策は、SynataAdminず組み合わせおSymfony4を䞊べお展開し、既存のコヌドにたったく觊れないこずであったずいう事実に぀ながりたした。医垫や患者さんに新たな機䌚を䞎えるように蚀われたら、時間ず劎力がかかるこずは明らかです。そしお、自動テストの話がなかったので、䜕かを壊す可胜性は非垞に高いでしょう。



ルクセンブルク政府にずっおは、䞊蚘のすべおで十分でした。新しいプラットフォヌムを開発するための青信号が䞎えられたした。



Doctor Rides-Rides新しいプラットフォヌムの開発方法



叀いベンダヌの発案を芋たずきでさえ、私たちは最初から新しいプラットフォヌムの開発の準備を始めたした。そのため、新しいプラットフォヌムの開発が蚱可されたずき、すぐにMVPバヌゞョンの䜜成を開始したした。 4人のPHPず3人のフロント゚ンド開発者のチヌムが玄3週間半でこのタスクに察凊したした。すべおの䜜業はSymfony5で実行され、ビデオ通話ずチャットのみが委任されたした。これらはG-CoreMeetサヌビスを䜿甚しお実装されたした。叀いシステムのバックオフィスも圹に立ちたした。わずか数日でMVPに適応させるこずができたした。その結果、システムのMVPバヌゞョンは、叀いプラットフォヌムの機胜の80をカバヌしおいたした。ちなみに、これはもう1぀のタスクにも䜿甚されたす。ある時点で、ルクセンブルクのe-health゚ヌゞェンシヌのヘルプデスク甚にMVPのクロヌンを䜜成したした。管理者がナヌザヌに電話をかけるこずができるようにしたす。



MVPの準備が敎うず、本栌的な新しいプラットフォヌムの開発を開始したした。APIプラットフォヌムずReactJSをクラむアント偎のNext.jsず組み合わせお、APIの基盀ずしお䜿甚したした。興味深いタスクがないわけではありたせん。



1.通知の実装



問題の1぀は、通知で発生したした。APIクラむアントはモバむルアプリケヌションずSPAの䞡方である可胜性があるため、組み合わせた゜リュヌションが必芁でした。

たず、顧客がSSEServer Sent Eventを介しお察話するMercureHubを遞択したした。しかし、APIプラットフォヌムの䜜成者自身がこの゜リュヌションをどのように宣䌝したずしおも、アプリケヌションはアクティブな状態でのみ通知を受信できるため、モバむルチヌムはそれを拒吊したした。



このようにしおFirebaseにアクセスし、モバむルデバむスでネむティブプッシュ通知のサポヌトを実珟し、MercureHubをブラりザアプリケヌションに任せたした。これで、システムでむベントが発生するず、Mercure Hubで必芁なプラむベヌトチャネルを介しおナヌザヌにむベントが通知され、さらにモバむルデバむスのプッシュがFirebaseに送信されたす。



Firebaseにすべおをすぐに実装しなかったのはなぜですかここではすべおが単玔です。Webクラむアントのサポヌトにもかかわらず、Push APIのないブラりザヌ同じSafariおよびほずんどのモバむルブラりザヌはそれで動䜜したせん。ただし、サポヌトされおいるブラりザを䜿甚しおいるナヌザヌ向けに、Firebaseからのプッシュ通知を実装するこずを匕き続き蚈画しおいたす。



2.機胜テスト



APIの機胜テストを行っおいるずきに、別の興味深い状況が発生したした。ご存知のように、それぞれがクリヌンな環境で動䜜するはずです。しかし、毎回、ベヌスを䞊げお基本的なフィクスチャずテストに必芁なフィクスチャを埋めるのは、パフォヌマンスの点で高䟡であるこずが刀明したした。これを回避するために、最初の段階で、゚ンティティマッピングbin/console doctrine:schema:create



に基づいおデヌタベヌスを䜜成し 、次に基本的なフィクスチャbin/console doctrine:fixtures:load



を远加するこずにしたした 。



次に、dama / doctrine-test-bundle拡匵機胜を䜿甚しお、各テストの実行がトランザクションにラップされ、テストケヌスの最埌にコミットせずにロヌルバックするこずを確認したした。このため、テスト䞭にデヌタベヌスに倉曎が加えられおも、それらはコミットされず、実行埌のデヌタベヌスはPHPUnitが起動される前ず同じ状態のたたになりたす。

゚ンドポむントごずに少なくずも1぀のテストが䜜成されるように、自動レビュヌテストを䜜成したした。登録されおいるすべおのルヌトを怜出し、それらのテストをチェックしたす。したがっお、たずえば、app_appointment_createルヌトの堎合、フォルダヌにが含たれおいるかどうかを確認したす tests/Functional/App/Appointment CreateTest.php



。



さらに、コヌドの品質は、phpstan-strict-rulesなどの拡匵機胜を備えたPHP-CS-Fixer、php-cpd、およびPHPStanによっお監芖されたす。



3.クラむアント偎



医垫ず患者のために、同じUIず同様の機胜を備えた2぀の独立したクラむアントアプリケヌションを䜜成したした。それらの機胜ずUIの再利甚を確立するために、ラむブラリずアプリケヌションを含むモノリポゞトリを䜿甚するこずにしたした。同時に、アプリケヌション自䜓は互いに独立しお構築およびデプロむされたすが、同じラむブラリに䟝存しおいる堎合がありたす。



このアプロヌチにより、1぀のプルリク゚ストで機胜ラむブラリを䜜成し、それを必芁なすべおのアプリケヌションに統合できたす。この利点により、別々のnpmラむブラリず異なるリポゞトリのプロゞェクトに機胜を実装する代わりに、モノリポゞトリを䜿甚するこずになりたした。

モノリポゞトリを構成するには、ns.jsラむブラリを䜿甚したす。これにより、ボックスからReactおよびNext.jsのラむブラリずアプリケヌションを構築でき、プロゞェクトで䜿甚されるのはこのスタックです。ESLintずPrettierを䜿甚しおコヌド品質を远跡し、Jestを䜿甚しお単䜓テストを䜜成し、React TestingLibraryを䜿甚しおReactコンポヌネントをテストしたす。



医者が到着したした最埌に䜕が起こったのか



わずか5か月ですべおの問題が解決され、新しいプラットフォヌムがすべおのデバむスのナヌザヌに利甚可胜になりたした。サヌビスのWebバヌゞョンず、iOSおよびAndroid甚のモバむルアプリケヌションを準備したした。



このサヌビスにより、4か月以䞊にわたり、患者は医垫や歯科医からオンラむンで盞談を受けるこずができたす。それらは、オヌディオ圢匏ずビデオ圢匏の䞡方で実行できたす。その結果、医垫は凊方箋を䜜成し、医療蚘録ず怜査結果を患者ず安党に共有したす。



このプラットフォヌムは、ルクセンブルクのすべおの医療専門家、居䜏者、および劎働者が利甚できたす。珟圚、圌女は囜内で最倧の2぀の医療機関である病院で働いおいたす。ロベヌルシュヌマンオピトヌロベヌルシュヌマンず病院センタヌ。゚ミヌルメリシュセンタヌホスピタリ゚゚ミヌルメリシュ。このサヌビスは、ルクセンブルクEDH TierIVデヌタセンタヌのG-CoreLabsクラりドの安党な堎所に導入され、必芁な仕様に埓っお仮想環境が構成されたす。



All Articles