PHP のセッションは安全ですか?
私は長い間 PHP 開発を行ってきましたが、セキュリティの問題にあまり注意を払ったことはなく、常にプロジェクトを完了することに集中していました。それを読んだ後、以前のプロジェクトに気づきました。大きなセキュリティホールがあるので、プロジェクトを選んでテストしてみたところ、簡単に引っかかってしまうことが分かりました。ここでは、PHP のセッションがどのように安全でないのか、またプロジェクト内のセキュリティを強化する方法を説明するために私が作成したテスト例を共有します。
セッションの原理や仕組みについては、インターネット上に良い紹介記事がたくさんありますので、自分で確認することも可能です。テスト用の例を直接共有しましょう。このテストの例は主にログインページです。ログインに成功した後、パスワードを変更できます。インターフェイスは次のとおりです。 まず、プロジェクトの入り口で関数 session_start() を使用してセッションを開きます。このようにして、クライアントがリクエストを開始すると、ID 識別子、つまり SessionID が生成されます。これは、Cookie を通じてクライアントに保存され、クライアントとサーバー間の各通信は、識別のためにこの SessionID に依存します。ログインに成功すると、ユーザー ID とユーザー名がセッションに保存されます $_SESSION['userid'] = ユーザー ID $_SESSION['uname'] = ユーザー名 後続のすべての操作は $_SESSION['userid'] によって判断されますユーザーがログインしているかどうかを確認します。
コードは次のとおりです:
if(isset($_SESSION['userid'])) return true; パスワード変更インターフェイスの呼び出しにより、ajax post を通じてデータがサーバーに送信されます。
$.post("Interface**********", { oldpass:oldpass, newpass:newpass, userid:uid, }, function(data){ data = eval('(' +data+ ')' ); $ ('.grant_info').html(infos[data.info]).show(); HTML ページでこのコードを記述したことに注意してください。インターフェースアドレスを取得します。このようにしてパスワードを変更するためのインターフェースが実装されます。まず、ユーザーがログインしているかどうかを判断します。ユーザーがログインしている場合は、パスワードの変更操作が実行されます。テスト例の実装アイデアは大まかに上記の通りです。
SessionIDを使った攻撃
1. 1 つ目は、SessionID を取得することです。もちろん、攻撃者がこの ID を取得する方法はたくさんあります。ここでは、その取得方法については説明しません。最初に通常どおりこのプロジェクトにアクセスし、次にブラウザを通じて SessionID を確認して正当なユーザー ID を取得することで、これをシミュレートできます。この ID はリクエスト ヘッダーで確認できます。 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Encoding: gzip, deflateAccept-Language: zh-CN 、 zh;q=0.8,en-US;q=0.5,en;q=0.3接続: keep-aliveCookie: Hm_lvt_bf1154ec41057869fceed66e9b3af5e7=1450428827,1450678226,1450851291,1450851486; iq9hcpu3ksri4r587ckt9jt7;ホスト: ******リファラー: * *****User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:41.0) Gecko/20100101 Firefox/41.0 sessionID の取得後、ユーザーが正常にログインすると、ユーザーの情報がサーバー上のセッションに保存されます。 。
2. SessionID を取得した後、攻撃者がパスワードを変更するためのインターフェイスをすでに知っている場合、ユーザーのパスワードを直接変更できます。攻撃者がまだインターフェイス アドレスを取得していない場合は、ページ コードを調べることでインターフェイス アドレスを見つけることができます。次のコマンドを使用できます。 #curl --cookie "PHPSESSID=2eiq9hcpu3ksri4r587ckt9jt7" ページ アドレス 上で述べたように、この例では、Ajax コードが HTML ページに記述されているため、このページで HTML のインターフェイス アドレス部分を表示できます。次のようなコード...…var uid = $( "。userid") '); $('.grant_info').html(infos[data.info]).show();
3. インターフェイスを取得した後、curl を使用してデータを送信するポストをシミュレートし、パスワードを変更できます。コマンドは次のとおりです。 =user id インターフェイス アドレス このユーザーがすでにログインしている場合、攻撃者は上記のコマンドを実行してユーザーのパスワードを変更できます。解決策 上記の攻撃に対しては、検証方法を複雑にすることで安全性を高めることができます。方法の 1 つは、リクエスト ヘッダーで User-Agent 項目を使用してセキュリティを強化することです。 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-エンコーディング: gzip、deflate
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3Connection: keep-aliveCookie: Hm_lvt_bf1154ec41057869fceed66e9b3af5e7=1450428827,1450678226,1450851291,1450851 486;PHPSESSID=2eiq9hcpu3ksri4r587ckt9jt7;ホスト: * *****リファラー: ******ユーザーエージェント: Mozilla/5.0 (Windows NT 6.1; rv:41.0) Gecko/20100101 Firefox/41.0 プロジェクトの開始時に、session_start() を使用しただけです。セッションを開く機能。このコードを session_start() の下に追加します。 $_SESSION['User_Agent'] = md5($_SERVER['HTTP_USER_AGENT']); そして、ログインするかどうかを判断するたびに、次のように判断条件を追加します。 If(isset($) _SESSION['userid']) && $_SESSION['User_Agent'] == md5($_SERVER['HTTP_USER_AGENT'])){ return true;} この方法で、上記の単純な攻撃を回避できます。
概要: もちろん、実際の攻撃は単純ではありません。まず、SessionID を取得することが困難です。次に、上記の状況を回避するために、サーバーと通信するコードを可能な限り暗号化する必要があります。コードを 2 回変更した後は、攻撃の複雑さを増すことはできますが、攻撃を排除することはできません。攻撃にはさまざまな方法がありますが、これは単なるアイデアを示したものに過ぎませんが、実際の状況に応じてコードのセキュリティを強化することができるという原理は同じです。ここでは私が仕事上で遭遇した問題を共有しているだけですが、皆さんもさらに深く学んでいただければ幸いです。
http://www.bkjia.com/PHPjc/1118030.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1118030.html技術記事 PHP でのセッションは安全ですか? 私は長い間 PHP 開発を行ってきましたが、セキュリティの問題をあまり気にしたことがありませんでした。最近、インターネットでセキュリティに関する記事を目にしました。