PHP の セッションは安全ですか? PHP はセッション実装のみを提供します。その後のセキュリティ作業はプログラマーが柔軟に習得する必要があるため、PHP でのセッション セキュリティを理解する必要がある友人は、これを参照することができます。私は PHP の開発を行ってきましたが、安全性についてはあまり意識したことがありませんでした。最近、インターネットで安全性に関する記事を読んだ後、以前のプロジェクトに大きな問題があることに気づきました。セキュリティ上の脆弱性があったので、プロジェクトを選んでテストしたところ、簡単に引っかかってしまうことがわかりました。ここでは、PHP のセッションがどのように安全でないのか、またプロジェクト内のセキュリティを強化する方法を説明するために私が作成したテスト例を共有します。
セッションの原理や仕組みについては、インターネット上に良い紹介記事がたくさんありますので、ご自身で確認することも可能です。テスト用の例を直接共有しましょう。このテストの例は主にログインページです。ログインに成功した後、パスワードを変更できます。
インターフェースは以下の通りです
まず、プロジェクト入口で関数
cookie を通じてクライアントに保存されます。クライアントとサーバー間のすべての通信は、識別のためにこの SessionID に依存します。 ログインに成功すると、ユーザー ID とユーザー名がセッションに保存されます$_SESSION[‘userid'] = 用户id
$_SESSION[‘uname'] = 用户名
if(isset($_SESSION['userid'])) return true;
$.post("接口*******", { oldpass:oldpass, newpass:newpass, userid:uid, }, function(data){ data = eval('(' +data+ ')'); $('.grant_info').html(infos[data.info]).show(); } );
パスワードを変更するためのインターフェースはこのように実装されています。まず、ユーザーがログインしているかどうかを判断します。ユーザーがログインしている場合、パスワードの変更操作が実行されます。
テスト例の実装アイデアは大まかに上記の通りです。
SessionID 攻撃の使用
1. 1 つ目は、SessionID を取得することです。もちろん、攻撃者がこの ID を取得する方法はたくさんあります。ここでは、その取得方法を紹介しません。最初に通常どおりこのプロジェクトにアクセスし、次にブラウザを通じて SessionID を確認して正当なユーザー ID を取得することで、これをシミュレートできます。この ID はリクエスト ヘッダーで確認できます Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Connection: keep-alive
Cookie: Hm_lvt_bf1154ec41057869fceed66e9b3af5e7=1450428827,1450678226,1450851291,1450851486; PHPSESSID=2eiq9hcpu3ksri4r587ckt9jt7;
Host: ******
Referer: ******
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:41.0) Gecko/20100101 Firefox/41.0
sessionID を取得した後、ユーザーが正常にログイン
2. SessionID を取得した後、攻撃者がパスワードを変更するためのインターフェイスをすでに知っている場合、ユーザーのパスワードを直接変更できます。攻撃者がインターフェイス アドレスをまだ取得していない場合は、ページ コードを調べることでインターフェイス アドレスを見つけることができます。次のコマンドを使用できます#curl --cookie "PHPSESSID=2eiq9hcpu3ksri4r587ckt9jt7" 页面地址
HTML コードの一部は次のとおりです
<html xmlns="http://www.w3.org/1999/xhtml"> <head> …… var uid = $(".userid").val(); $.post("/User/User/modifypass_do", { oldpass:oldpass, newpass:newpass, userid:uid, }, function(data){ data = eval('(' +data+ ')'); $('.grant_info').html(infos[data.info]).show(); } ); …… <span><input type="password" name="oldpass" id="textfield_o" placeholder="原密码"></span> <span><input type="password" name="newpass" id="textfield_n" placeholder="新密码"></span> <span><input type="password" name="confirmpass" id="textfield_c" placeholder="确认密码"></span> <input type="button" class="btn_ok" value="确认修改" />
3インターフェイスを取得した後、curl を介してデータを送信して、パスワードを変更する投稿をシミュレートできます
コマンドは次のとおりです
# curl --cookie "PHPSESSID=2eiq9hcpu3ksri4r587ckt9jt7" -d oldpass=111111 -d newpass=000000 -d userid=用户id 接口地址
このユーザーが既にログインしている場合、攻撃者は上記のコマンドを実行することでユーザーのパスワードを変更できます。
解決策
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 Connection: keep-alive Cookie: Hm_lvt_bf1154ec41057869fceed66e9b3af5e7=1450428827,1450678226,1450851291,1450851486; PHPSESSID=2eiq9hcpu3ksri4r587ckt9jt7; Host: ****** Referer: ****** User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:41.0) Gecko/20100101 Firefox/41.0
$_SESSION[‘User_Agent'] = md5($_SERVER[‘HTTP_USER_AGENT']);
If(isset($_SESSION[‘userid']) && $_SESSION[‘User_Agent'] == md5($_SERVER[‘HTTP_USER_AGENT'])){ return true; }
概要:
もちろん、実際の攻撃は単純ではありません。まず、SessionID を取得することがより困難になります。次に、上記の状況を回避するために、サーバーと通信するコードを可能な限り暗号化する必要があります。コードを 2 回変更した後は、攻撃の複雑さを増すことはできますが、攻撃を排除することはできません。攻撃にはさまざまな方法がありますが、これは単なるアイデアを示したものに過ぎませんが、実際の状況に応じてコードのセキュリティを強化することができるという原理は同じです。
ここでは私が仕事で遭遇した問題を共有するだけですが、皆さんがもっと深く学んでいただければ幸いです。
以上がPHPでセッションを使用しても安全ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。