「倕食の最埌、たたはPHPのセキュリティを完党に乗り切る方法」ずいう本。 パヌト1

画像



CrazyAsian1によるビッグファむブパヌト3



こんにちは 私の名前はサヌシャ・バランニクです。 Mail.Ru Groupでは、15人のWeb開発郚門を率いおいたす。 私たちは䜕千䞇人ものナヌザヌのためにりェブサむトを䜜成する方法を孊び、毎日数癟䞇のオヌディ゚ンスを冷静に扱っおいたす。 私自身は玄20幎間Web開発に携わっおおり、過去15幎間は䞻にPHPでプログラミングする必芁がありたす。 この間、蚀語ず開発アプロヌチの機胜は倧きく倉化したしたが、䞻芁な脆匱性を理解し、それらから自分自身を保護する胜力は、どの開発者にずっおも重芁なスキルです。



むンタヌネットには倚くの蚘事ずセキュリティガむドがありたす。 この本は、私には非垞に詳现に芋えたしたが、簡朔で理解しやすいものでした。 新しいこずを孊び、サむトの信頌性ず安党性を高めるのに圹立぀こずを願っおいたす。



PS本は長いので、翻蚳はいく぀かの蚘事にたずめられたす。 それでは、始めたしょう...



PHPの別のセキュリティブックですか



PHPでセキュリティブックを開始するには倚くの方法がありたす。 残念ながら、私はそれらのいずれも読んでいたせん。そのため、執筆プロセスでこれに察凊する必芁がありたす。 おそらく最も基本的なものから始めお、すべおがうたくいくこずを願っおいたす。



X瀟がオンラむンで起動した抜象Webアプリケヌションを怜蚎する堎合、それがクラックされるず重倧な損害を匕き起こす可胜性のある倚くのコンポヌネントが含たれおいるず想定できたす。 たずえば、どれですか



  1. ナヌザヌぞの害電子メヌル、パスワヌド、個人デヌタ、銀行カヌドの詳现、ビゞネスシヌクレット、連絡先リスト、取匕履歎、および高床に保護されたシヌクレット誰かが圌の犬Sparkyず呌んだものなどぞのアクセスを取埗したす。 このデヌタの挏掩は、ナヌザヌ個人および䌁業に損害を䞎えたす。 このようなデヌタを悪甚するWebアプリケヌションや、ナヌザヌの信頌を利甚するサむトも有害な堎合がありたす。
  2. 䌚瀟X自䜓ぞの損害ナヌザヌぞの損害、評刀の悪化、報酬の支払い、重芁なビゞネス情報の損倱、远加費甚の発生-むンフラストラクチャ、セキュリティの改善、結果の枅算、法的費甚、解雇されたトップマネヌゞャヌぞの倧きなメリットなど


Webアプリケヌションのセキュリティシステムが防止しなければならないトラブルのほずんどが含たれおいるため、これら2぀のカテゎリに焊点を圓おたす。 深刻なセキュリティ䟵害に盎面したすべおの䌁業は、プレスリリヌスやりェブサむトに圌らがどのように感じおいるかをすぐに曞きたす。 ですから、実際にこの問題に出くわす前に、この問題の重芁性を感じるこずを心からお勧めしたす。



残念ながら、セキュリティの問題はしばしば遡及的に察凊されたす。 最も重芁なこずは、蚱容できる予算ず期限で、ナヌザヌのニヌズを満たす実甚的なアプリケヌションを䜜成するこずであるず考えられおいたす。 これは完党に理解できる䞀連の優先事項ですが、セキュリティを氞久に無芖するこずはできたせん。 倉曎のコストがただ䜎い開発䞭に特定の決定を導入するこずを垞に念頭に眮いおおく方がはるかに優れおいたす。



安党性の二次的芁因は、䞻にプログラミング文化の結果です。 䞀郚のプログラマヌは、脆匱性を考えるず冷静になりたすが、他のプログラマヌは、脆匱性ではないこずを蚌明できるたで脆匱性の存圚に異議を唱えるかもしれたせん。 これらの䞡極端の間には、圌らがただ間違っおいないので、肩をすくめる倚くのプログラマヌがいたす。 圌らがこの奇劙な䞖界を理解するのは難しいです。



Webアプリケヌションのセキュリティシステムは、アプリケヌションのサヌビスを信頌するナヌザヌを保護する必芁があるため、質問ぞの回答を知る必芁がありたす。



  1. 誰が私たちを攻撃したいですか
  2. 圌らはどのように私たちを攻撃できたすか
  3. どうすればそれらを止めるこずができたすか


誰が私たちを攻撃したいですか



最初の質問ぞの答えは非垞に簡単ですそれだけです。 はい、宇宙党䜓があなたにレッスンを教えたいず思っおいたす。 Kali Linuxを実行しおいるオヌバヌクロックされたコンピュヌタヌの子䟛ですか 圌はおそらくすでにあなたを攻撃したした。 車茪に棒を入れるのが奜きな䞍審な男 圌はおそらくあなたを攻撃するために誰かをすでに雇っおいたす。 1時間ごずにデヌタを受け取る信頌できるREST API おそらく圌は、感染したデヌタをあなたに投げかけるために1か月前にハッキングされたした。 私もあなたを攻撃できたす したがっお、この本を盲目的に信じないでください。 私が嘘を぀いおいるず考えおください。 そしお、きれいな氎に連れお行っお私の悪いアドバむスを公開しおくれるプログラマを芋぀けおください。 䞀方、倚分圌もあなたをハックするでしょう...



このパラノむアのポむントは、Webアプリケヌションず察話するすべおのもの「ナヌザヌ」、「ハッカヌ」、「デヌタベヌス」、「信頌できない入力」、「マネヌゞャヌ」、「REST API」を粟神的に簡単に分類できるようにするこずです、次に各カテゎリに信頌性指暙を割り圓おたす。 明らかに、ハッカヌを信頌するこずはできたせんが、デヌタベヌスに぀いおはどうですか 「信頌性の䜎い入力」ずいう名前には理由がありたすが、同僚の信頌できるAtomフィヌドから受け取ったブログ投皿を本圓にフィルタリングしたすか



Webアプリケヌションのハッキングに真剣に取り組んでいる人々は、この考え方を利甚するこずを孊び、脆匱なデヌタ゜ヌスではなく、優れたセキュリティシステムを持぀可胜性が䜎い信頌できるデヌタ゜ヌスを攻撃するこずがよくありたす。 これは偶然の決定ではありたせん。実生掻では、信頌指数が高い被隓者ほど疑いが少ないです。 アプリケヌションを分析するずきに䞻に泚意を払うのは、このようなデヌタ゜ヌスです。



デヌタベヌスに戻りたす。 ハッカヌがデヌタベヌスにアクセスできるず仮定した堎合そしお、私たちは劄想し、垞にこれを仮定したす、あなたは圌女を信頌するこずはできたせん。 ほずんどのアプリケヌションは、質問なしでデヌタベヌスを信頌したす。 倖では、Webアプリケヌションは党䜓のように芋えたすが、内郚ではデヌタを亀換する別個のコンポヌネントのシステムです。 これらすべおのコンポヌネントが信頌できるず芋なされおいる堎合、そのうちの1぀がハッキングされるず、他のすべおのコンポヌネントがすぐに䟵害されたす。 このような壊滅的なセキュリティ問題は、「基地がハッキングされた堎合、私たちはただ負けおいたす」ずいうフレヌズでは解決できたせん。 あなたはそう蚀うこずができたすが、最初に基地を信頌し、それに応じお行動しなければ、それをしなければならないずいうこずはたったくありたせん



圌らはどのように私たちを攻撃できたすか



2番目の質問に察する答えは、かなり広範なリストです。 Webアプリケヌションのすべおのコンポヌネントたたはレむダヌがデヌタを受信する堎所であればどこからでも攻撃を受ける可胜性がありたす。 基本的に、Webアプリケヌションはデヌタを凊理し、堎所から堎所ぞ転送するだけです。 ナヌザヌリク゚スト、デヌタベヌス、API、ブログフィヌド、フォヌム、Cookie、リポゞトリ、PHP環境倉数、構成ファむル、再床構成ファむル、実行するPHPファむル-これらはすべお、デヌタに感染しおセキュリティシステムを突砎し、損害を匕き起こす可胜性がありたす。 実際、悪意のあるデヌタがリク゚ストに䜿甚されるPHPコヌドに明瀺的に存圚しない堎合、おそらく「ペむロヌド」ずしお送信されたす。 a゜ヌスPHPコヌドを䜜成し、b正しくレビュヌされ、c犯眪組織の代衚者があなたに支払いをしなかったず仮定したす。



デヌタが完党に安党で䜿甚に適しおいるこずを確認せずにデヌタ゜ヌスを䜿甚するず、攻撃を受ける可胜性がありたす。 たた、受信したデヌタが送信したデヌタず䞀臎するこずを確認する必芁がありたす。 デヌタが出力に察しお完党に安党にされおいない堎合、深刻な問題も発生したす。 これらはすべお、PHPの「入力をチェックしおください。 画面出力。」



これらは、䜕らかの方法で制埡する必芁がある明らかなデヌタ゜ヌスです。 ゜ヌスには、クラむアント偎のリポゞトリも含たれる堎合がありたす。 たずえば、ほずんどのアプリケヌションは、Cookieに保存できる䞀意のセッションIDを割り圓おるこずでナヌザヌを認識したす。 攻撃者がCookieから倀を取埗するず、別のナヌザヌになりすたすこずができたす。 たた、ナヌザヌデヌタの傍受たたは改ざんに関連するリスクの䞀郚は軜枛できたすが、ナヌザヌのコンピュヌタヌの物理的なセキュリティを保蚌するこずはできたせん。 ナヌザヌが「123456」を「password」に続く最も愚かなパスワヌドず芋なすこずさえ保蚌できたせん。 今日では、ナヌザヌ偎のストレヌゞの皮類がCookieだけではないずいう事実によっお、远加の海賊行為が行われおいたす。



芋萜ずされるこずが倚い別のリスクは、゜ヌスコヌドの敎合性です。 PHPでは、互いに匱く接続されおいるフレヌムワヌクの倚数のラむブラリ、モゞュヌル、およびパッケヌゞに基づくアプリケヌション開発がたすたす䞀般的になっおいたす。 これらの倚くはGithubなどの公開リポゞトリからダりンロヌドされ、ComposerやそのWebコンパニオンであるPackagist.orgなどのパッケヌゞむンストヌラヌを䜿甚しおむンストヌルされたす。 したがっお、゜ヌスコヌドのセキュリティは、これらすべおのサヌドパヌティのサヌビスずコンポヌネントのセキュリティに完党に䟝存しおいたす。 Githubが䟵害された堎合、悪意のあるコヌドを配垃するためにGithubが䜿甚される可胜性が最も高くなりたす。 Packagist.orgの堎合-攻撃者はパケット芁求を自分の悪意のあるパッケヌゞにリダむレクトできたす。



これたで、ComposerずPackagist.orgには䟝存関係の刀別ずパッケヌゞの配垃に関する既知の脆匱性が存圚するため、垞に䜜業環境のすべおを再確認し、Packagist.orgからすべおのパッケヌゞの゜ヌスを確認しおください。



どうすればそれらを止めるこずができたすか



Webアプリケヌションのセキュリティシステムを突砎するこずは、ばかばかしいこずも、非垞に時間のかかる䜜業でもありたす。 すべおのWebアプリケヌションのどこかに脆匱性があるず仮定するのは公平です。 その理由は簡単です。すべおのアプリケヌションは人によっお䜜成され、人は間違いを犯しがちです。 完璧なセキュリティは倢のようなものです。 すべおのアプリケヌションには脆匱性が含たれおいる可胜性があり、プログラマの仕事はリスクを最小限に抑えるこずです。



Webアプリケヌションぞの攻撃による損害の可胜性を枛らすために、慎重に考える必芁がありたす。 物語の過皋で、可胜な攻撃方法に぀いおお話したす。 それらのいく぀かは明らかですが、他はそうではありたせん。 しかし、いずれにせよ、問題を解決するには、いく぀かの基本的な安党原則を考慮する必芁がありたす。



セキュリティの基瀎



保護装眮を開発する堎合、その有効性は次の考慮事項を䜿甚しお評䟡できたす。 すでに䞊蚘で匕甚したものもありたす。



  1. 誰も䜕も信じないでください。
  2. 垞に最悪のシナリオを想定しおください。
  3. マルチレベルの保護を適甚したす倚局防埡。
  4. 「シンプルな方が良い」ずいう原則を守りたすKISS It Simple Stupid、KISS。
  5. 「最小特暩」の原則を順守しおください。
  6. 攻撃者はあいたいさを感じたす。
  7. ドキュメントRTFMを読みたすが、決しお信甚しないでください。
  8. これがテストされおいない堎合、これは機胜したせん。
  9. これは垞にあなたの間違いです


すべおのポむントを簡単に芋おいきたしょう。



1.誰も䜕も信じない



䞊蚘のように、正しい䜍眮は、Webアプリケヌションずやり取りするすべおのものがすべおハッキングしたいず想定するこずです。 リク゚ストを凊理するために必芁な他のコンポヌネントたたはアプリケヌション局を含みたす。 それだけです。 䟋倖なし。



2.垞に最悪のシナリオを想定したす。



倚くのセキュリティシステムには共通の特性がありたす。どれほどうたく䜜られおいおも、それぞれが壊れる可胜性がありたす。 これを考慮するず、2番目のポむントの利点をすぐに理解できたす。 最悪のシナリオをタヌゲットにするず、攻撃の範囲ず重倧床を評䟡するのに圹立ちたす。 そしお、それが本圓に起こった堎合、远加のセキュリティ機胜ずアヌキテクチャの倉曎による䞍快な結果を枛らすこずができるでしょう。 おそらく、あなたが䜿甚しおいる埓来の゜リュヌションは、すでにより良いものに眮き換えられおいたすか



3.耇数レベルの保護を適甚する倚局防埡



人々が長い間、敵の匟䞞や刃から重芁な臓噚を保護する倚くの壁、土嚢、装備、防具、フラスコがセキュリティぞの正しいアプロヌチであるこずを認識しおいたため、マルチレベルの保護は軍事科孊から借甚されおいたす。 䞊蚘のどれが保護されないのか決しおわかりたせん。たた、いく぀かの保護レベルでは、フィヌルドの匷化や戊闘の圢成以䞊のものに䟝存できるようにする必芁がありたす。 もちろん、単䞀の障害だけではありたせん。 階段の䞊にある巚倧な䞭䞖の壁に登り、その埌ろに別の壁があり、そこから矢印がシャワヌを济びおいるのを芋぀けた攻撃者を想像しおください。 ハッカヌも同じように感じるでしょう。



4.「シンプルな方が良い」ずいう原則を守るKISS It Simple Stupid、KISS



最高の治療法は垞にシンプルです。 開発、実装、理解、䜿甚、テストが簡単です。 シンプルさにより、゚ラヌの数が枛り、アプリケヌションの正しい動䜜が促進され、最も耇雑で䜿いにくい環境でも実装が容易になりたす。



5.「最小特暩」の原則を順守する



情報亀換の各参加者ナヌザヌ、プロセス、プログラムには、自分の機胜を実行するために必芁なアクセス暩のみが必芁です。



6.攻撃者は䞍明瞭さを感じる



「 あいたいさによるセキュリティ 」は、防埡Aを䜿甚し、これがどのように機胜するのか、たた存圚するのかを誰にも蚀わない堎合、攻撃者が迷子になるため魔法のように圹立぀ずいう仮定に基づいおいたす。 実際、これはわずかな利点しか䞎えたせん。 倚くの堎合、経隓豊富な攻撃者はあなたが取った察策を蚈算できるため、明瀺的な防埡を䜿甚する必芁がありたす。 あいたいな保護が本圓の保護の必芁性を取り消すず過床に確信しおいる人は、幻想を取り陀くために特に眰せられるべきです。



7.ドキュメントRTFMを読むが、決しお信甚しない



PHPマニュアルは聖曞です。 もちろん、 Flying Pasta Monsterによっお曞かれたものではないため、正匏にはただ気付いおいない、たたは修正されおいない、ある皋床の半分の真実、欠陥、誀解、たたは誀りを含む可胜性がありたす。 スタックオヌバヌフロヌに぀いおも同じこずが蚀えたす。



䞀般に、セキュリティの分野における専門知識PHPのみを察象ずするのではなくは、より詳现な知識を提䟛したす。 PHPのセキュリティ聖曞に最も近いものは、蚘事、ガむド、およびヒントが掲茉されたOWASPサむトです。 OWASPでの実行が掚奚されおいない堎合は、絶察に実行しないでください



8.テストされおいない堎合、機胜したせん。



セキュリティ機胜を実装する堎合、怜蚌に必芁なすべおの動䜜テストを䜜成する必芁がありたす。 あなたが刑務所で泣くハッカヌであるふりを含む。 これは倧げさなように思えるかもしれたせんが、Webアプリケヌションをハッキングする方法を知るこずは良い習慣です。 朜圚的な脆匱性に぀いお孊習し、劄想が増加したす。 同時に、Webアプリケヌションを壊したこずに察する新たな感謝の気持ちを経営者に䌝える必芁はありたせん。 必ず自動ツヌルを䜿甚しお脆匱性を特定しおください。 これらは䟿利ですが、もちろん、高品質のコヌドレビュヌや手動のアプリケヌションテストに代わるものではありたせん。 テストに費やすリ゜ヌスが倚いほど、アプリケヌションの信頌性は高くなりたす。



9.これは垞にあなたの間違いです



プログラマヌは、セキュリティの脆匱性は散圚する攻撃であり、その結果は無芖できるず信じおいるこずに慣れおいたす。



たずえば、デヌタリヌク十分に文曞化された広範囲のハッキングは、ナヌザヌに盎接圱響を䞎えないため、倚くの堎合、軜埮なセキュリティ問題ず芋なされたす。 ただし、゜フトりェアバヌゞョン、開発蚀語、゜ヌスコヌドの堎所、アプリケヌションロゞックずビゞネスロゞック、デヌタベヌス構造、Webアプリケヌション環境および内郚操䜜のその他の偎面に関するデヌタ挏掩は、攻撃を成功させるためにしばしば重芁です。



同時に、セキュリティシステムに察する攻撃は、倚くの堎合、攻撃の組み合わせです。 別に、それらは重芁ではありたせんが、同時に他の攻撃ぞの道を開くこずもありたす。 たずえば、SQLコヌドを実装するには、特定のナヌザヌ名が必芁な堎合がありたす。これは、はるかに高䟡で目立぀ブルヌトフォヌスではなく、管理むンタヌフェむスに察するタむミング攻撃を䜿甚しお取埗できたす。 同様に、SQLの導入により、倚数の䞍審なログ゚ントリの泚意を匕くこずなく、特定の管理アカりントにXSS攻撃を実装できたす。



脆匱性を単独で考慮するこずの危険性は、それらの脅嚁を過小評䟡するこずであり、したがっお、それらに察する䞍泚意な態床にありたす。 プログラマヌは、あたりにも取るに足りないず芋なしおいるため、脆匱性を修正するのが面倒です。 安党な開発の責任を゚ンドプログラマヌたたはナヌザヌに移す慣行も実践されたす。倚くの堎合、特定の問題を文曞化せずに、これらの脆匱性の存圚さえ認識されたせん。



芋かけ䞊の重芁性は重芁ではありたせん。 特にプログラマヌやナヌザヌに脆匱性を修正するように匷制するこずは無責任です。特に脆匱性に぀いお知らされおいない堎合は無責任です。



入力怜蚌



— -. -, . , , , . , , . ( ) «», «», « » « ». , , 
 . , .



, ? . PHP « ». . , , , . そうではありたせん。 — , .





— , -. - , , . , . , , , , . , , . , PHP , , . , :



filter_var('php://example.org', FILTER_VALIDATE_URL);
      
      





フィルタは問題なく通過したす。 問題は、受け入れられたphp// URLが、実行可胜なPHPスクリプトからPHPハンドラヌを介しおデヌタを返すのではなく、リモヌトHTTPアドレスの受信を期埅するPHP関数に枡すこずができるこずです。 フィルタヌオプションに有効なURIを制限するメ゜ッドがないため、脆匱性が発生したす。 アプリケヌションは、PHP固有のURIではなく、http、https、たたはmailtoリンクを想定しおいるずいう事実にもかかわらず。 このようなあたりにも䞀般的な怜蚌方法を避けるこずは、どうしおも必芁です。



コンテキストに泚意しおください。



入力を怜蚌するこずにより、安党でないデヌタがWebアプリケヌションに入力されないようにする必芁がありたす。 重倧な障害デヌタセキュリティチェックは通垞、最初の䜿甚目的に察しおのみ実行されたす。



名前を含むデヌタを取埗したずしたす。 アポストロフィ、ハむフン、角かっこ、スペヌス、および英数字のUnicode文字の数を確認するだけです。 この名前は、衚瀺に䜿甚できる正しいデヌタです最初の䜿甚目的。 ただし、他の堎所たずえば、デヌタベヌスぞのク゚リで䜿甚するず、新しいコンテキストに衚瀺されたす。 たた、このコンテキストでは、名前に有効な文字の䞀郚が危険になりたす。名前がSQLむンゞェクションを実行するために文字列に倉換される堎合。



入力デヌタの怜蚌は本質的に信頌できないこずが刀明しおいたす。 明確に無効な倀を削陀するのに最も効果的です。 䜕かが敎数、英数字文字列、たたはHTTP URLである必芁があるずきに蚀いたす。 このような圢匏ず倀には制限があり、適切に怜蚌されれば、脅嚁になる可胜性は䜎くなりたす。 その他の倀無制限のテキスト、GET / POST配列、およびHTMLはチェックが難しく、それらの倀で悪意のあるデヌタを受け取る可胜性が高くなりたす。



ほずんどの堎合、アプリケヌションはコンテキスト間でデヌタを転送するため、すべおの入力デヌタを確認しお問題が完了したず芋なすこずはできたせん。 入力チェックは最初の保護回路のみですが、決しお唯䞀の保護回路ではありたせん。



入力デヌタのチェックに加えお、シヌルドなどの保護方法が頻繁に䜿甚されたす。 これにより、新しいコンテキストを入力するたびにデヌタのセキュリティがチェックされたす。 通垞、この方法はクロスサむトスクリプティングXSSから保護するために䜿甚されたすが、フィルタリングの手段ずしお他の倚くのタスクで芁求されおいたす。



゚スケヌプは、受信者が送信デヌタを誀っお解釈するこずを防ぎたす。 しかし、これは十分ではありたせん-デヌタが新しいコンテキストで到着するので、特定のコンテキスト専甚のチェックが必芁です。



これは最初の入力時の怜蚌の耇補ず考えるこずができたすが、実際には、デヌタ芁件が非垞に異なる堎合、远加の怜蚌手順は珟圚のコンテキストをよりよく考慮したす。 たずえば、フォヌムのデヌタには割合が含たれる堎合がありたす。 最初の䜿甚時に、倀が実際に敎数であるこずを確認したす。 しかし、アプリケヌションのモデルに移行する堎合、新しい芁件が発生する可胜性がありたす。倀は特定の範囲に収たらなければなりたせん。これは、アプリケヌションのビゞネスロゞックが機胜するために必須です。 たた、この远加チェックが新しいコンテキストで実行されない堎合、深刻な問題が発生する可胜性がありたす。



ブラックリストではなく、ホワむトリストのみを䜿甚したす



ブラックリストずホワむトリストは、入力デヌタを怜蚌するための2぀の䞻芁なアプロヌチです。 黒いものは無効なデヌタのチェックを意味し、癜いものは有効なデヌタを意味したす。 ホワむトリストが望たしいのは、怜蚌䞭に送信されるのは予想されるデヌタのみだからです。 同様に、ブラックリストは、考えられるすべおの誀ったデヌタに関するプログラマヌの仮定のみを考慮しおいるため、混乱したり、䜕かを芋逃したり、ミスを犯したりするのがずっず簡単です。



良い䟋は、テンプレヌトの非スクリヌニング出力に関しおHTMLを安党にするために蚭蚈された怜蚌手順です。 ブラックリストを䜿甚する堎合、HTMLに危険な芁玠、属性、スタむル、実行可胜なJavaScriptが含たれおいないこずを確認する必芁がありたす。 これは倧量の䜜業であり、ブラックリストに登録されたHTMLクリヌナヌは垞に、コヌドの危険な組み合わせを芋逃しおしたいたす。 たた、ホワむトリストを䜿甚するツヌルは、蚱可されおいる既知の芁玠ず属性のみを蚱可するこずにより、この䞍確実性を排陀したす。 残りはすべお、それらが䜕であるかに関係なく、単玔に分離、分離、たたは削陀されたす。



したがっお、ホワむトリストはセキュリティず信頌性が高いため、怜蚌手順に適しおいたす。



入力を修正しないでください



倚くの堎合、入力怜蚌にはフィルタリングが䌎いたす。 怜蚌䞭にデヌタの正圓性を単玔に評䟡する堎合正たたは負の結果が発行される堎合、フィルタリングは特定のルヌルを満たすようにチェック察象のデヌタを倉曎したす。



通垞、これはやや有害です。 埓来のフィルタヌには、たずえば、電話番号からすべおの文字を削陀する数字を陀く䜙分な角かっこやハむフンを含む、䞍芁な氎平スペヌスや垂盎スペヌスを削陀するなどがありたす。 このような状況では、衚瀺たたは送信゚ラヌを回避するために最小限のクリヌニングが実行されたす。 ただし、フィルタリングを䜿甚しお悪意のあるデヌタをブロックするこずはあたりにも倢䞭になりたす。



入力を修正しようずするこずの結果の1぀攻撃者は修正の効果を予枬できたす。 無効な文字列倀があるず仮定したす。 怜玢しお削陀し、フィルタリングを完了したす。 しかし、攻撃者が文字列で区切られた倀を䜜成しおフィルタヌに勝る堎合はどうでしょうか



 <scr<script>ipt>alert(document.cookie);</scr<script>ipt>
      
      





この䟋では、タグによる単玔なフィルタリングは䜕も行いたせん。明瀺的な<script>



を削陀するず、デヌタはHTMLスクリプトの完党に有効な芁玠ず芋なされたす。 特定の圢匏によるフィルタリングに぀いおも同じこずが蚀えたす。 これはすべお、アプリケヌションの最埌の保護回路では入力デヌタをチェックできない理由を明確に瀺しおいたす。



入力を修正しようずする代わりに、ホワむトリストベヌスのバリデヌタを䜿甚しお、そのような入力詊行を完党に拒吊したす。 たた、フィルタリングする必芁がある堎合は、必ずチェックする前にフィルタリングし、その埌にはフィルタリングしないでください。



倖郚怜蚌ツヌルを信頌せず、垞に脆匱性を監芖する



以前、デヌタが新しいコンテキストに転送されるたびに怜蚌が必芁であるこずに泚意したした。 Webアプリケヌション自䜓の倖郚で実行される怜蚌にも同じこずが圓おはたりたす。 そのようなツヌルには、ブラりザヌのHTMLフォヌムに適甚される怜蚌たたはその他の制限が含たれたす。 HTML 5のこのフォヌムを芋おくださいラベルは省略されおいたす



 <form method="post" name="signup"> <input name="fname" placeholder="First Name" required /> <input name="lname" placeholder="Last Name" required /> <input type="email" name="email" placeholder="someone@example.com" required /> <input type="url" name="website" required /> <input name="birthday" type="date" pattern="^d{1,2}/d{1,2}/d{2}$" /> <select name="country" required> <option>Rep. Of Ireland</option> <option>United Kingdom</option> </select> <input type="number" size="3" name="countpets" min="0" max="100" value="1" required /> <textarea name="foundus" maxlength="140"></textarea> <input type="submit" name="submit" value="Submit" /> </form>
      
      





HTMLフォヌムは、入力デヌタに制限を課すこずができたす。 固定アむテムのリストを䜿甚しお遞択を制限し、最小倀ず最倧倀を蚭定し、テキストの長さを制限するこずもできたす。 HTML 5はさらに広くなっおいたす。 ブラりザはURLずメヌルアドレスをチェックし、日付、数倀、範囲を制埡できたすただし、最埌の2぀のサポヌトはかなり条件付きです。 ブラりザは、テンプレヌト属性に含たれるJavaScript正芏衚珟を䜿甚しお入力をチェックするこずもできたす。



この豊富なコントロヌルをすべお忘れないでください。それらの目的は、アプリケヌションの利䟿性を向䞊させるこずです。 攻撃者は、元のフォヌムからの制限を含たないフォヌムを䜜成できたす。 自動フォヌム入力甚のHTTPクラむアントを䜜成するこずもできたす



倖郚怜蚌ツヌルのもう1぀の䟋は、TwitterなどのサヌドパヌティAPIからデヌタを受信するこずです。 この゜ヌシャルネットワヌクは評刀が高く、通垞は疑いなく信頌されおいたす。 しかし、私たちは劄想的であるため、Twitterを信頌するべきではありたせん。 劥協の堎合、圌の回答では安党でないデヌタが衚瀺され、その倖芳に぀いおは準備ができおいたせん。 したがっお、ここでも、䜕かが起こっおも無防備にならないように、独自の怜蚌を䜿甚しおください。



倖郚の怜蚌手段に自信がある堎合は、脆匱性を远跡するず䟿利です。 たずえば、HTMLフォヌムが最倧長に制限を蚭定し、サむズが制限に達した入力を取埗した堎合、このナヌザヌがチェックをバむパスしようずしおいるず仮定するのは論理的です。 したがっお、倖郚手段にギャップを登録し、朜圚的な攻撃に察しおさらにアクションを実行しお、アクセスたたはリク゚ストの数を制限できたす。



PHPでの型倉換を避ける



PHPは匷く型付けされた蚀語ではなく、その機胜ず操䜜のほずんどは安党に型付けされおいたせん。 これは深刻な問題に぀ながる可胜性がありたす。 さらに、倀自䜓ではなく、バリデヌタヌは特に脆匱です。 䟋



 assert(0 == '0ABC'); // TRUE assert(0 == 'ABC'); // TRUE (    !) assert(0 === '0ABC'); // NULL/     
      
      





バリデヌタを開発するずきは、入力倀たたは出力倀が文字列である可胜性がある堎合、厳密な比范ず手動の型倉換を䜿甚しおください。 たずえば、フォヌムは文字列を返すこずができるため、敎数である必芁があるデヌタを操䜜しおいる堎合は、必ず型を確認しおください。



 function checkIntegerRange($int, $min, $max) { if (is_string($int) && !ctype_digit($int)) { return false; //    } if (!is_int((int) $int)) { return false; //       PHP_MAX_INT } return ($int >= $min && $int <= $max); }
      
      





これを絶察にしないでください



 function checkIntegerRangeTheWrongWay($int, $min, $max) { return ($int >= $min && $int <= $max); }
      
      





この堎合、目的の範囲に入る数倀で始たる行はすべおテストに合栌したす。



 assert(checkIntegerRange("6' OR 1=1", 5, 10)); // NULL/  assert(checkIntegerRangeTheWrongWay("6' OR 1=1", 5, 10)); //  TRUE
      
      





型倉換の埮劙さは、倚くの操䜜や関数に芋られたす。たずえば、配列内に有効なオプションが存圚するかどうかの倀を確認するためによく䜿甚されるin_array()



などです。



デヌタ怜蚌の皮類



入力デヌタの怜蚌で゚ラヌが発生するず、脆匱性ずデヌタ砎損が発生したす。 以䞋のPHPの䟋では、いく぀かのタむプの怜蚌を怜蚎したす。



デヌタ型チェック



デヌタの皮類が文字列、敎数、浮動小数点数、配列などに関連しおいるこずを確認したす。倚くのデヌタはフォヌムを介しおis_int()



ため、 is_int()



ようなPHP関数を盲目的に䜿甚するこずはできたせん。 1぀の倀は文字列にするこずができ、同時にPHPでサポヌトされおいる敎数の最倧倀に達したす。 KISSの原則に違反する可胜性があるため、あたり独創的である必芁も、正芏衚珟を䜿甚する必芁もありたせん。



文字怜蚌



文字列に有効な文字のみが含たれおいるこずを確認したす。 ほずんどの堎合、このためにPHPはctype



関数を䜿甚し、より耇雑な堎合は正芏衚珟を䜿甚したす。 ASCII文字のみが必芁な堎合は、 ctype



関数にctype



するこずをお勧めしたす。



フォヌマットチェック



これにより、デヌタが有効な文字の特定のセットず䞀臎するようになりたす。 鮮明な䟋は、電子メヌル、URL、日付です。 PHPのfilter_var()



関数、 DateTime



クラス、および他の圢匏の正芏衚珟を䜿甚するこずをおfilter_var()



たす。 圢匏が耇雑になるほど、圢匏や構文をチェックするための信頌できるツヌルに頌る必芁が増えたす。



制限チェック



これにより、倀が蚱容範囲内にあるかどうかが確認されたす。 たずえば、5より倧きい倀、0〜3、たたは34以倖の倀のみを受け入れる必芁がありたす。チェック制限は、文字列、ファむルサむズ、画像解像床、日付範囲などにも適甚できたす。



デヌタチェック



今埌の䜜業に必芁なすべおのデヌタが利甚可胜かどうかを確認したす。 たずえば、登録フォヌムでは、これはナヌザヌ名、パスワヌド、メヌルアドレスです。 䜕かが入力されおいない堎合、デヌタが正しくないず芋なされたす。



デヌタマッチング



このタむプのチェックは、゚ラヌを排陀するために2぀の同䞀の倀を入力する必芁がある堎合に䜿甚されたす。 たずえば、サむトに登録するずきにパスワヌドを繰り返したす。 2぀の倀が同じ堎合、デヌタは正しいず芋なされたす。



論理チェック



本質的に、これは、受信したデヌタがアプリケヌションで゚ラヌや䟋倖を匕き起こさないこずを確認したい堎合の゚ラヌ制埡です。 たずえば、怜玢文字列を正芏衚珟に眮き換えるず、匏のコンパむル゚ラヌが発生する堎合がありたす。 特定の倀を超える敎数も危険である可胜性がありたす。陀算操䜜䞭の分母のれロ、たたは+ 0、0、–0などの奇劙なものです。



リ゜ヌスの可甚性を確認する



デヌタでリ゜ヌスが指定されおいる堎合、それが実際に存圚するかどうかを確認する必芁がありたす。 これには、ほずんどの堎合、存圚しないリ゜ヌスの自動䜜成、゚ラヌのあるリ゜ヌスのオヌプンの陀倖、およびディレクトリトラバヌサル攻撃を実行するためにファむルシステムパスを眮換する詊みの远加チェックが䌎いたす。



入力゜ヌスの確認



努力にもかかわらず、入力怜蚌はすべおのセキュリティ問題を解決するわけではありたせん。 倚くの堎合、ナヌザヌが入力した情報を確実に怜蚌するこずは䞍可胜です。 アプリケヌションが信頌できるず考えられるデヌタ゜ヌスたずえば、ロヌカルデヌタベヌスで動䜜する堎合、この可胜性が高くなりたす。 デヌタベヌスの堎合、远加のチェックタむプは倚くありたせん。 しかし、たずえばHTTPSを介しおAPIから情報を芁求する堎合など、SSLたたはTLSで保護されたリモヌトWebサヌビスの䟋を芋おみたしょう。



HTTPSは、攻撃者が2぀のデヌタ亀換ポむントの間の仲介者になったずきに、䞭間者MITM攻撃から保護する䞻な方法です。 そのような仲介者はサヌバヌを装いたす。 ぀たり、クラむアントはサヌバヌに接続しおいるず考えおいたす。 実際、芁求されたサヌバヌぞの別の接続を䜜成するのは攻撃者です。 攻撃者はデヌタを䞡方向に䞭継しお読み取るこずができたすが、クラむアントもサヌバヌもこれを認識しおいたせん。 さらに、䞭継者は䞭継䞭にデヌタを倉曎できたす。



このような攻撃を防ぐには、サヌバヌを停装し、サヌバヌずクラむアント間で亀換されたメッセヌゞを読み取る胜力を攻撃者に䞎える必芁がありたす。 これにはSSL / TLSがあり、2぀の䞻芁なセキュリティ機胜を実行したす。



  1. クラむアントずサヌバヌのみがアクセスできる共有キヌを䜿甚しお、送信されたすべおのデヌタを暗号化したす。
  2. サヌバヌは、信頌できる組織によっお発行され、クラむアントによっお認識される公開蚌明曞ず秘密キヌを䜿甚しお、サヌバヌ自䜓を識別する必芁がありたす。


SSL / TLS暗号化は任意の2者間で発生する可胜性があるこずに泚意しおください。 「䞭間者」攻撃では、クラむアントは攻撃しおいる「サヌバヌ」に連絡し、盞互デヌタ暗号化の䜿甚に぀いお議論し始めたす。 この堎合、「サヌバヌ」に自分が䞻匵するずおりの人物であるこずを蚌明するように䟝頌しなかったため、それ自䜓は圹に立ちたせん。 したがっお、SSL / TLSの第2段階が必須であり、正匏にはオプションです。 Webアプリケヌションは、「䞭間者」攻撃から自身を保護するために、通信するサヌバヌのIDを怜蚌する必芁がありたす。



暗号化はそのような攻撃から保護するのに十分であるず広く信じられおおり、倚くのアプリケヌションずラむブラリは第2段階を䜿甚したせん。 これは、オヌプン゜ヌスアプリケヌションで頻繁に怜出される脆匱性です。 いく぀かの䞍可解な理由により、 stream_socket_client()



、 fsockopen()



たたはその他の内郚関数が䜿甚されおいる堎合、PHP自䜓はデフォルトでHTTPSラッパヌのサヌバヌチェックを無効にしたす。 䟋



 $body = file_get_contents('https://api.example.com/search?q=sphinx');
      
      





ここでは、䞭間攻撃の男性に察する脆匱性が明らかです。 このHTTPS芁求からのデヌタは、必芁なサヌビスから受信したず芋なすこずはできたせん。 むンテリゞェントに、サヌバヌチェックを䜿甚しお芁求を実行する必芁がありたす。



 $context = stream_context_create(array('ssl' => array('verify_peer' => TRUE))); $body = file_get_contents('https://api.example.com/search?q=sphinx', false, $context);
      
      





UPD。 PHP 5.6以降では、ssl.verify_peerオプションはデフォルトでTRUE



蚭定されおいたす。



cURL拡匵機胜には、サヌバヌのチェックアりトが含たれおいるため、䜕も構成できたせん。 ただし、プログラマヌは、自分のラむブラリヌずアプリケヌションのセキュリティヌに぀いお思いやりなく考えるこずがありたす。 このアプロヌチは、アプリケヌションが䟝存するラむブラリで芋぀けるこずができたす。



 curl_setopt(CURLOPT_SSL_VERIFYPEER, false);
      
      





SSLのコンテキストで、たたはcurl_setopt()



を䜿甚しおいるずきにサヌバヌ怜蚌を無効にするず、䞭間者攻撃の脆匱性が発生したす。 ただし、SSL蚌明曞が正しく構成されおいないか有効期限が切れおいるホストぞの攻撃たたはアプリケヌションの接続詊行を瀺す迷惑な゚ラヌの問題を解決するためだけにオフにしたす。



倚くの堎合、Webアプリケヌションは、ナヌザヌアクションのプロキシずしお、たずえばTwitterクラむアントずしお機胜できたす。 そしお、私たちにできるこずは、ナヌザヌに譊告し、疑わしいサヌバヌぞの接続からナヌザヌを保護しようずする、アプリケヌションのブラりザヌによっお蚭定された高氎準に準拠するこずです。



結論



倚くの堎合、安党なアプリケヌションを䜜成するあらゆる機䌚がありたす。 しかし、開発、デバッグ、および迷惑な゚ラヌ出力の無効化を容易にするために、いく぀かの合理的な制限を回避しおいたす。 たたは、正圓な理由のために、アプリケヌションのロゞックを䞍必芁に耇雑化しようずしおいたす。



しかし、ハッカヌは自分のパンを食べおも無駄ではありたせん。 . -, — . .



All Articles