少し叀いコヌドの研究の物語

チヌムで経隓を積んだ人が、䜕をどのようにすればいいのか、どのレヌキず角床を付け、2007幎の自転車の最高の図面をDVDでダりンロヌドする堎所を教えおくれるず䟿利です。 この物語は、願いがどのように有効であったか、結果ずしお䜕が刀明したか、そしおどのように危機が克服されたかに぀いおです。



これは、私には開発の平凡な経隓があるように思えたずきに起こりたした。私は、ゞュニアから自信のないゞュニアたで進化たたは突然倉異できる堎所を探しおいたした。 䞻の神秘的な方法で、そのような堎所が芋぀かり、プロゞェクトがその堎所に取り付けられ、システムでの圌の経歎に぀いお女の子よりも倚く曞いた「叀い孊校」のプログラマヌ。 「すごい プロゞェクト、したがっおRFPにお金があり、メンタヌが付きたす、私たちは生きおいたす」ず思ったが、兞型的な恐怖の説明のように、暗闇のヒヌロヌは恐ろしい恐怖に盎面した...



たず最初に



1.サむズが重芁



開発は、か぀お誰かが曞いたphp゚ンゞンで始たり、デヌタを保存するために䜿甚されおいたしたここでは、MySQL \ PostgreSQL \ SQLite \ MongoDB \ Something-else- but-necessarily-with-DB-suffix-otherwise-みんな理解しおいたせんが、圌らは掚枬したせんでしたapi-gateway。



「ハハ、phpを䜿甚しお、別のAPIゲヌトりェむをアタッチし、デヌタを保存したすか APIをjs-codeから盎接操䜜する方が簡単ではありたせんか たたは、DBMS + PHPを䜿甚したすか」 そしお圌は正しいでしょう。 しかし、圓時、私は皮をただ芋おいなかったので、そうは思いたせんでした。知っおいる人は、クヌルな人はおそらくそうするでしょうし、「叀い孊校の」プログラマはよく知っおいたす。



さらに説明したように



  1. ゲヌトりェむ=セキュリティ、そのような人は出入りしたせん
  2. ゲヌトりェむ=セキュリティで保護されたデヌタストレヌゞ、アクセスできない、+バックアップ
  3. ゲヌトりェむ=速床、迅速に機胜し、障害なく、タむムテスト枈み
  4. 「昔ながらの」プログラマヌの暩嚁ある芳点は、あなたのphpが穎だらけで、すべおのWebアプリケヌションがデフォルトでハッキングされおいるため、その隣にデヌタを保存するものがないこずです。


APIゲヌトりェむの特城は、jsonデヌタがgetリク゚ストで送信されたこずです。 はい、はい、これらの非垞に矎しいjsonオブゞェクトはurl゚ンコヌドの察象ずなり、ク゚リ文字列に入れられたした。 そしお、突然、ある日... getリク゚ストの長さが十分でなくなったずき、すべおがうたくいくでしょう。 愚かなこずに、URL゚ンコヌドされたJSONはそこに収たりたせんでした。 「昔ながらの」プログラマヌは頭をかいお、次のように尋ねたした。

「ショヌはやる jsonは成長したしたが、気づいおいたせん...」

「じゃあ、倚分、ポストに投皿するの」ず提案したので、それはもっず正しいようです。

「わかりたした、投皿しおください。」

それはatasナンバヌワンでした。



2.時間ずバックアップの管理



プロゞェクトに新しい機胜を組み蟌むには、実装する必芁がありたした

ゲヌトりェむ䞊の察応するCRUDリク゚スト。これは、たさに「叀い孊校」の同志が実際に行ったこずです。 問題は、圌が3日ごずに1回これを行っお、「完了、確認」ずいうこずでした。 時々チェックは、すべおが機胜しなかったこずを瀺したした。䟋えば、リストを取埗するこずは問題ありたせんが、新しいアむテムを远加するこずは問題ではありたせん。 修正ず改良に時間がかかり、その埌、倧量アクセスで機胜をリリヌスするこずができたした。 ゲヌトりェむ䞊でク゚リの実装を自分で行うずいう提案は、少なくずも高速であるため拒吊されたした。「そこは難しいので、あなたはそれを理解できないからです」。 このアプロヌチの結果、「自分自身で」䜜業が終了したした。 たずえば、デヌタベヌス内の䜕かをたずめお修正する必芁がある堎合、3日間埅機するか、ク゚リを䜿甚しお自分で修正を実装するかを遞択したす。2番目のオプションを遞択したした。 顧客は特に埅぀こずを奜たなかったため、新しい入門曞は安定しお飛びたした。 そのような玹介的なものの1぀、぀たり特定の暙識のナヌザヌに暙識を倧量に貌り付けるこずは、私に実装を任せられたした。 ここで私たちを埅っおいたす。



事実、リク゚ストで送信されるjsonデヌタの圢匏は、いく぀かの必須フィヌルドのみを暗瀺し、残りはすべおarbitrary意的であり、明確で最終的な構造は存圚したせんでした。 たずえば、ナヌザヌを远加するには、次の圢匏のJSONを枡したした。



POST /api/users { "email":"ivanov@mail.ru", "password":"myEmailIsVeryBig", "name_last":"", "name_first":"", "name_middle":"", "birth":"01.01.1961", //     ,    -    "living_at":"., .3 .4 .24", "phone_num":"+70000000000" }
      
      





远加/曎新リク゚ストで送信されたオプションの郚分は保存され、党䜓が提䟛されたしたこれがどのように実装されたかに぀いおは埌述したす。 結論は、時間が止たらないずいうこずです。問題を解決する必芁がありたす-ナヌザヌを曎新し、ラベルを貌る。 しかし、構造党䜓を毎回運転しないのですか チェックする必芁がありたす 自分でテストしたした-曎新芁求で1぀のフィヌルドのみを送信し、チェックし、フィヌルドが衚瀺され、残りのデヌタが配眮されたした。 ポむントは小さい-ルヌプし、残りを曎新したす。



スクリプトは゜フトに膚らみ、デヌタを送受信し、すべおが順調に進んでいるように芋えたした...突然のずき-呌び出し。 「システムにナヌザヌの名前は衚瀺されたせん」-ワむダのその端からのレポヌト。 「さあ うたくいきたした」-䞍快な寒さが私の背䞭を駆け巡りたした。 さらなる調査の結果、実際には、名前に「」が含たれおいるこずが瀺されたしたが、他のすべおのデヌタは存圚しおいたした。 そのような状況で䜕をすべきか バックアップを展開しおください



「同志」の叀い孊校の「プログラマヌ、wi hev er問題hir バックアップが必芁です 最新の関連はい぀行われたすか」-私は尋ねたす。



「うヌん...今すぐ芋たす.... いいえ、バカパはありたせん。」



数時間前にレポヌトでモゞュヌルを完成させおテストし、必芁なすべおのデヌタを含むcsv-boxを持っおいお、さらに1時間以内に順序が埩元されたずいう事実によっお、状況は救われたした。



わかりやすいドキュメントの欠劂、操䜜アルゎリズムの説明、入力の劥圓性チェック、そしお最も重芁なこず-デヌタベヌスのバックアップ-atas number 2-s。



それ以来、バックアップは毎日削陀され始めたした。



3.深打



揺れたすが、䜜業が動き、問題が解決され、いく぀かはより速く、いく぀かはより遅く、突然...システムは誰かのサヌバヌに理解されおいないこずに気づきたした。そしお、PDずISPDでZIアクティビティを組織するずいう態床に察しお圌らは頭をなでたせん。 サヌバヌを自分に転送する必芁がありたす。



システムが最初に転送されなかったのはなぜですか リヌダヌシップには情熱がありたした-集䞭化。 経営陣は、すべおを行うシステムを倢芋おいたした 子䟛を孊校に連れお行く必芁がありたすか あなたは特別なオフィスでシステムに入り、そこで申請曞を提出したす。 たずえば、ピザを泚文する必芁がありたす。システムに入り、別の特別なオフィスに行き、ピザを申請したす。 たぶん、あなたは矎しい女性/玳士ずコミュニケヌションを取りたかったのですか あなたのサヌビスには3番目の特別なキャビネットがありたす-あなたもそこに申請曞を提出しおいたす。



利点-すべおに察しお1぀のログむンずパスワヌド、デヌタがゲヌトりェむに安党か぀安党に保存されたす。 バックアップもありたす。 そしお、心に留めお、誰も私たちからこのシステムを取りたせん そしお、それがそれを取り陀いおも-次は䜕ですか それでも、圌らは「叀い孊校」のプログラマヌに察する保護システムを理解したせん。そこではすべおが耇雑です。



システムを備えたVDSはアンロヌドされ、顧客に垰され、圌らはそれを展開し、皆が螊り、歌い、矎しさを発揮したした



そしお、奜奇心ず疑念の波が私を芆いたした。



Webアプリケヌションに穎がいっぱいある堎合、デヌタはどこにありたすか 本圓に他のサヌバヌにずどたっおいたすか そしお、圌らが倖郚からシステムを閉じるこずに決めた堎合、すべおが厩壊したすか



簡単なチェックで、デヌタずゲヌトりェむプロセッサ自䜓が同じサヌバヌ䞊にあるこずがわかりたした。 そしお、いいえ、それらはサヌバヌの転送のためにそこに転送されたせんでした、圌らは垞にそこにいたした。

今、私は研究のために蚭定した非垞に秘密の「叀い孊校」の開発を自由に䜿甚できたした。 もちろん、ollydbg、オフセット、およびその他のクヌルなものを含む、Hackerマガゞンの蚘事スタむルのクヌルなリバヌス゚ンゞニアリングは機胜しなかったので、私が持っおいるものを共有したす。

開発自䜓はpythonで実装され、簡単に逆コンパむルしお読み取り可胜なコヌドに戻すこずができる.pycファむルのみがありたした。 率盎に蚀っお、それがどのように機胜するかを理解するのに倚くの時間、25分もかかりたした。



したがっお、「叀い孊校」のプログラマヌによっお開発された耇雑なシステムは、ほずんど理解できたせんが、次のもので構成されおいたす。



  1. 実際にリク゚ストを受信したApacheによっお凊理されたスクリプト。 このスクリプトは䜕をしたしたか 特定のlocalhostポヌトぞの接続を開き、そこにすべおのデヌタを含む芁求を枡したした。 それだけです 興味はさらに進みたす。
  2. スクリプトからのリク゚ストを凊理したサヌバヌ郚分。 圌の行動の論理は非垞に興味深いものでした。 たず、コヌドにはデヌタ操䜜がなく、デヌタベヌスにはク゚リがありたせんでしたが、PL \ SQLのデヌタベヌス関数が呌び出されたした。 すべおのロゞック、チェックなど、すべおがデヌタベヌス関数に配眮されたした。 スクリプトの50は、芁求の名前、それにマップされた関数、およびget-request行で枡されたデヌタに察応する関数パラメヌタヌの名前を含む蟞曞でした。 JSONデヌタは、必芁に応じお、別個のパラメヌタヌずしお枡されたした。 サヌバヌ郚分の組織の特城は、ナヌザヌ認蚌䞭のバックアップ接続でした。 デヌタベヌスでログむンずパスワヌドが芋぀かった堎合-セッションIDが生成され、開いおいる接続むンスタンスが蟞曞に远加され10分のタむムアりトで匷制終了されたため、匷制終了されたせん-セッションの寿呜を延ばす特別な方法がありたした、キヌはデヌタベヌスに盎接あるセッションIDでした保存されたせん。 セッションIDはナヌザヌデヌタにどの皋床正確に関連付けられおいたすか 結局のずころ、ナヌザヌIDが送信されないデヌタの芁求はありたすか これは機胜したす。぀たり、ここで䜕かが間違っおいるずいうこずです。


非垞に困難な開発は、困難を䌎う意識に䞎えられ、過去の巚匠の長く倱われた秘密を明らかにするために急いでいたせんでした。



それにもかかわらず、信じられないほど定矩ぞ移動、PL \ SQLを理解しおくれたPhpStormに感謝、オヌルドスクヌルプログラマヌの倱われた文明の真の知識に苊しんでいる玠人の心には理解できたせんでした。 䞀般に、接続するず、認蚌デヌタ怜蚌機胜で䞀時テヌブルが生成され、ナヌザヌIDが保存されたす。



これはほんの始たりに過ぎず、芋぀かった深刻な脆匱性の指暙リストです。





たた、別の深刻な問題は、正匏なデヌタストレヌゞスキヌムではありたせん。 前に玄束したように、JSONから「任意のフィヌルド」を保存するこずに぀いお話しおいたす。 いいえ、テヌブルの行ずしお保存されおいたせん。 それらはキヌず倀のペアに分割され、別のテヌブルに保存されたした。 たずえば、ナヌザヌの堎合、ナヌザヌず、users_data文字列キヌ、文字列倀の2぀のテヌブルがあり、デヌタが実際に保存されおいたした。 このアプロヌチの結果は、デヌタベヌスからの耇雑なサンプルの時間の増加でした。



実際、これは、システムを新しいAPIに移行し、理解しやすく、文曞化され、サポヌトされるずいう決定を䞋し、実装するのに十分でした。



道埳



おそらく、このシステムは「レガシヌ」であり、それを䜜成した「旧来の」プログラマヌはレガシヌの保護者です。



それにもかかわらず、結論は次のずおりです。



  1. 「そこは難しい、理解できない」ず蚀われたら-完党なatasがありたす
  2. 圌らが暩嚁によっお抌し぀ぶされるなら、䜕かが汚れおいる
  3. 信頌したすが、確認したす-セキュリティは状態ではなく、セキュリティはプロセスであり、さらに継続的です。したがっお、すべおのナヌザヌが突然「Ivanov Ivanov Ivanitch」になったが、bacapsがないこずを知るよりも、宣蚀された品質が正しいこずを確認する方が良いです



All Articles