web-dev-qa-db-ja.com

この基本的な問題への対処法:「あいまいなPHP誰も使用していないライブラリを信頼しないでください!」?

ほぼすべての場合の場合、特定の問題に対してPHPライブラリは1つしかありません。 (私は時代遅れの、捨てられた、ゴミ箱のものを数えません。)

したがって、私がそれを使用することは決して「選択」ではありません。私はhaveを使用するか、何も使用しません。

この単純な理由から、「多くの人々や大企業によって宣伝または使用されていないあいまいなライブラリを使用しない」という健全な安全アドバイスは、選択できる選択肢がないため、ほとんど適用されません。

そして、これは[〜#〜] php [〜#〜]のためのものです-最も人気のある/最大の/地球上で最も使用されている現在のプログラミング言語。あまり人気のない言語を使用していたと想像してみてください。私は何かをするためのライブラリーを見つけることはありません!

このアドバイスは理論的にのみ機能するようです。実際には、自分ですべてをゼロから始めようとしない限り、ライブラリや言語さえも選択の余地はほとんどありません。 (または、私が支払うことができないお金を支払うことができる場合、おそらく私は潜在的に存在する有料の代替案を検討したこともありません。)

私がこの質問をするのは、セキュリティを維持し、侵害された/悪質なPHPライブラリを通じてマルウェアを取得しないようにするための主要なヒントの1つとして常に与えられているからです。ただし、たとえば「MailMimeParser」など、選択することが1つしかない場合は、ほぼ常にそうであるように思われます(「代替案」は、死んでいるか、広告どおりに機能していないなど、主要なショーストッパーを備えています)。私がやります?

選択の余地はないと言いますが、そうではありません。必要なすべてのコードを自分で書くことができます。または、信頼できる専門家にお金を払ってコードを書いてもらうこともできます。または、コードを使用する前にセキュリティ会社にコードを監査するように支払うこともできます。または、リスクを受け入れて、リスクを軽減するために他のセキュリティコントロールを実装することもできます。たとえば、一部のコードがSQLインジェクションに対して脆弱である可能性がある場合は、その前にWAF(Webアプリケーションファイアウォール)を設定できます。

セキュリティにはコストがあります:時間、リソース、専門知識、お金。無料の昼食はありません。余裕がない場合は、問題を回避する(プロジェクトを再考する)か、委任する(他の誰かが対処する)か、軽減する(たとえば、徹底的に防御する)か、単にハッキングされるリスクがあります。

個人的には、あなたの場合、広く使用されていないコードを扱う必要がある場合、ライブラリが大きすぎなければ、少なくとも「コードのにおい」がないかどうかを確認するためにコードを読み取ろうと思います。すべてのロジックをチェックしなくても、十分なコメントがあるかどうか、コメントが意味があるかどうか、コードがクリーンで理解できるかどうか、特定の関数がベストプラクティスに従って使用されているかどうか、入力データなど。少数のユーザーだけが使用し、少数の開発者だけが保守するコードのリスクは、保守が停止するか、保守が非常に遅いことが判明するため、結局のところ、とにかくコードを読んで理解し、アプリケーションを修正することを余儀なくされます。次に、可能であれば、多層防御のために何かを実装することも試みますが、WAFを正しく構成するのは簡単ではない場合があります。同時に、誤検知が原因でアプリケーションが壊れることを避けます。

53
reed

最初にあなたの質問の一般的な部分を取り上げ、次に特定のPHPの部分を扱います。

  1. 曖昧なPHP誰も使用しないライブラリを信頼しないでください!

    これは通常のゲイン/リスクの質問です。リスクが低い場合は、何でもでき、あいまいな(または壊れた)ライブラリを使用できます。つまり、プラットフォームも最終的なアプリケーションの結果もミッションクリティカルではありません。すぐに失敗する場合は、修正を作成するか、回避策を見つける必要があります。

    ライブラリを付加価値アプリケーションに含める場合は、ライブラリが期待どおりに動作しないリスクの評価が必要です。最も一般的な方法は、(Stack Exchangeの場合と同様に)reputationです。ライブラリが広範囲にわたってテストされ、維持されていることがわかっている場合、テストされていないコーナーケースに陥るリスクは低く、問題に気づいたら修正されることを期待できます。それがたまにしかメンテナンスされず、ユーザーが少ない場合、あなた(またはあなたのユーザー)はこのようなありふれたケースに陥り、yourアプリケーションがそれを実行できないことを文書化するより良い方法がないかもしれません。

    評判が十分に確立されていない場合は、コードを少し掘り下げてみてください。よく構造化されていて、文書化されていて、テストが含まれている場合は、少なくともベストプラクティスルールが守られていると信頼できます。補足として、テストはライブラリが焦点を当てているユースケースを示します。

    ライブラリが本当にobscureのように見え、それを使用したい場合は、独自のコードだけでなく、それもテストする必要がありますライブラリは、アプリケーションが受け入れるすべてのユースケースで期待どおりに動作します。盲目的にそれを信頼することはできないからです。しかし、それを真剣に行うと、時間がかかります。

  2. PHPと使用頻度の低い言語

    PHPは、おそらく非プロのプログラマーが最も使用する言語です。つまり、何かが必要な場合、他の誰かがすでにそれを作成しているということです。しかし、あなたはその品質を確信することはできません。 Javaは、プロ仕様の製品以外ではあまり使用されていません。しかし、多くのライブラリは、大規模で有名な組織によって作成され、厳格にテストされています。Springプロジェクトから何かを入手したとき、私はそれが最善に従っていると信じていますルールを練習し、広くテストされています。

    私の意見だけですが、それが私が使用することに消極的である理由の1つですPHPコード:多くのPHPコードが周りにあり、そのいくつかは非常に素晴らしいです質は高いが、質の低いコードを取得するリスクは高い。

35
Serge Ballesta

アドバイスは基本的に、「現実の」世界での信頼の原則をソフトウェア開発の世界にマッピングしたものです。

  • 誰かを盲目的に信頼するのではなく、評判を確認してください。この場合、信頼が乱用される可能性が低いため、他の多くの人からしばらくの間すでに信頼されている誰かを信頼することをお勧めします。ソフトウェア開発の場合、これは、他の人にも使用され、評判の良いライブラリを使用することを意味します。
  • また、評判の確立されていない人物に対処する必要がある場合は、十分に注意してください。ソフトウェア開発の場合、これは、コードが実際に想定されていることを実行し、それ以上何も実行していないことを確認することを意味します(つまり、バックドアなし、重大なバグなし)。

ソフトウェア開発でこれらの単純な現実世界のルールに従わない場合、現実世界で焼かれるのと同じ方法で焼かれる可能性があります。たとえば、誰かがあなたの持っている(根拠のない)信頼を誤用して、バックドアや重大なバグを引き起こす可能性がありますソフトウェアで。そして、これはあなた自身の評判を傷つけるかもしれません。

確かに、誰かが良い評判を持っていて、信頼を誤用している可能性はまだあります。そして、これが行われる十分な例があります。しかし、最初に良い評判を築くために多くの努力を必要とするので、それは評判のない人と比較してはるかに可能性が低くなります。これと比較して、悪用された場合、優れた評判は簡単かつ迅速に失われる可能性があるため、ほとんどの人はその評判を悪用しようとはしません。

12
Steffen Ullrich

あなたは使用する必要はありませんPHPあなたのウェブサイトのために

より良い代替案があります。ocsigen を調べてください。これは、何かを理解しているコンピュータ科学者によって設計されていますサイバーセキュリティについて、そして haxe に。もちろん、それを学ぶのに何ヶ月も費やし、ocsigenを使用することを選択した場合、ある程度の商業的リスクを負います(それを維持している人や会社が消える可能性があるため、いわゆる バス係数 )。しかし、私はOcsigenの主要な設計者および設計者を個人的に知っており、彼がサイバーセキュリティについてかなり理解していることを確認できます(彼の博士論文の半分はそのトピックに関するものです)。

私はそれを使うか、何も使わないかのどちらかです。

いいえ、それは間違っています。PHPを使用する必要はありません。たとえば、C++でのWebサイトの構築については this blog を、Common LISPでのWebテクノロジーについては that one を参照してください。他のアプローチを使用できます(例 FastCGI C++またはGoで記述されたサーバー、C++で記述された特殊なHTTPサーバー、例 libonion または pistache を使用)または CppCMS または WtGoでCommon LISPで SBCLを使用)。 Rocket.rs を使用すると、Rust(およびRustコミュニティケア)でWebアプリケーションを記述できますサイバーセキュリティについてのロットSMLの動的Webサーバー をプログラムできます。また、多くのWebサーバー( ApacheLighttpd 、。 ..)PHP関連するものを1つも追加せずに、ニーズに合わせてカスタマイズまたは適応できます(例: plugins を使用して記述))。

私の偏った意見は、一般的なLISPまたはC++またはGoまたはRustを超えるWebフレームワークは通常、専門家がサイバーセキュリティを理解し、注意する教育を受けたコンピューター科学者によって設計されています。PHP =完全に異なる考え方で設計されました:動的なWebサイトをすばやくコーディングできること [〜#〜] php [〜#〜] は設計されました(1995)、サイバーセキュリティは大きな懸念事項ではありませんでした、しかし数日で見栄えの良いダイナミックなウェブサイトを作ることができることが実際には不可欠でした。

しかし、あなたが使用しているものは何でも、それにはいくらかのコストがかかります。 externalities についてお読みください。読む J.Tirole のそれらに関する学術的研究(彼はノーベル経済学賞である。 オープンソースの簡単な経済学 に関する彼の論文は読む価値があり、最も引用されているそのトピック)。それが フリーソフトウェア であっても(フリーソフトウェアは予算ではなく自由に関するものだから)。少なくとも、それを学び、サイバーセキュリティの側面を評価するための努力のコストを忘れないでください。

オープンソース ライブラリを使用する場合でも、ライブラリにはいくらかのコストがかかります。それらを学習して評価する必要があります。通常、WITHOUT WARRANTYが与えられます。ただし、これらのライブラリのサポートを購入できます。

独自のライブラリまたはソフトウェアコンポーネントを使用する場合は、それらの [〜#〜] eula [〜#〜] に拘束されます。

セキュリティは常にトレードオフの問題です。

運転中にシートベルトを締めることはできませんが、追加のリスクを負い、その代金を支払います(たとえば、何か問題が発生した場合や、何らかの問題が発生した場合に保険が適用されないため)。ソフトウェアの選択についても同じです。

ただし、 ライスの定理 に注意してください。ある意味では、完全なサイバーセキュリティは不可能であることを示しています。しかし、生活さえ危険な活動です。 (あなたまたは私は数時間で心臓発作を起こす可能性があります)。

あなたの問題は非技術的ですが、社会的です。オープンソースソフトウェアを使用している場合は、各ソースコード行を調べて、セキュリティが十分であると確信する(または確信しない)ことができます。もちろん、これには数十年(または数世紀)かかります。Linuxディストリビューション全体は、現在200億行のソースコードです)。しかし、選択はあなた次第です(そして、使用しているすべてのソフトウェアコンポーネントのセキュリティ評価を委任できます)。

あなたはすでにアドバイスに従っていると思います!あなたは言う:

時代遅れの、捨てられた、ゴミ箱のものは数えません。

それで、何かが「時代遅れ、放棄された、ゴミ」であるかどうかを判断するためにどのような手段を使用しますか? packagist.orgなどのサイトで実際に「放棄」とマークされているパッケージはほとんどなく、「ゴミ箱」は明らかに主観的な判断なので、実際のプロセスは次のようになると思います。

  1. 関連のあるパッケージを検索する
  2. それらがあなたのユースケースに適しているかどうかを確認してください
  3. それらが妥当な品質であることを確認してください

このプロセスのendにオプションが1つしかないことが多いという事実は、このプロセスのstartにオプションが1つしかない場合とは大きく異なります。

また、特定のジョブを解決するための高品質のライブラリisがある場合、誰かが新しいジョブを作成するインセンティブがないことがよくあります。繰り返しになりますが、これは、尊敬されるライブラリを使用するためのアドバイスを無効にするものではなく、それを強化します。同じ実装を使用している人がたくさんいる場合、一部の人が欠陥を見つけたり、監査にお金を払ったりする可能性が高くなります。これは基本的に「リナスの法則」の繰り返しです。

十分な眼球があれば、すべてのバグは浅い

問題が実際に適用されているのを確認できる唯一のケースは、ジョブにnoまともなライブラリが存在する場合です。そのような状況では、ライブラリを作成する(またはライブラリの作成に料金を支払う)か、ライブラリを安全にする(または誰かが安全かどうかを確認するために料金を支払う)かは、あなた次第です。

2
IMSoP