PHPでセッションを使用しても安全ですか?

怪我咯
リリース: 2023-03-12 17:06:01
オリジナル
1388 人が閲覧しました

PHP の セッションは安全ですか? PHP はセッション実装のみを提供します。その後のセキュリティ作業はプログラマーが柔軟に習得する必要があるため、PHP でのセッション セキュリティを理解する必要がある友人は、これを参照することができます。私は PHP の開発を行ってきましたが、安全性についてはあまり意識したことがありませんでした。最近、インターネットで安全性に関する記事を読んだ後、以前のプロジェクトに大きな問題があることに気づきました。セキュリティ上の脆弱性があったので、プロジェクトを選んでテストしたところ、簡単に引っかかってしまうことがわかりました。ここでは、PHP のセッションがどのように安全でないのか、またプロジェクト内のセキュリティを強化する方法を説明するために私が作成したテスト例を共有します。

セッションの原理や仕組みについては、インターネット上に良い紹介記事がたくさんありますので、ご自身で確認することも可能です。テスト用の例を直接共有しましょう。

このテストの例は主にログインページです。ログインに成功した後、パスワードを変更できます。
インターフェースは以下の通りです


まず、プロジェクト入口で関数

session_start()を使用してセッションを開きます。このようにして、クライアントがリクエストを開始すると、ID 識別子、つまり SessionID が生成されます。これは、

cookie を通じてクライアントに保存されます。クライアントとサーバー間のすべての通信は、識別のためにこの SessionID に依存します。 ログインに成功すると、ユーザー ID とユーザー名がセッションに保存されます

その後のすべての操作では、$_SESSION['userid'] が存在するかどうかを判断することで、ユーザーがログインしているかどうかが確認されます。コードは次のとおりです。
if(isset($_SESSION['userid'])) return true;
ログイン後にコピー

パスワード変更インターフェイスの呼び出しは、ajax post を通じてサーバーにデータを送信します。

$.post("接口*******",
  {
     oldpass:oldpass,
     newpass:newpass,
     userid:uid,
  },
  function(data){
     data = eval('(' +data+ ')');
     $('.grant_info').html(infos[data.info]).show();
  }
);
ログイン後にコピー

このコードは HTML ページに記述したので、HTML コードを見ればインターフェイス アドレスがわかることに注意してください。

パスワードを変更するためのインターフェースはこのように実装されています。まず、ユーザーがログインしているかどうかを判断します。ユーザーがログインしている場合、パスワードの変更操作が実行されます。

テスト例の実装アイデアは大まかに上記の通りです。


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 を取得した後、攻撃者がパスワードを変更するためのインターフェイスをすでに知っている場合、ユーザーのパスワードを直接変更できます。攻撃者がインターフェイス アドレスをまだ取得していない場合は、ページ コードを調べることでインターフェイス アドレスを見つけることができます。次のコマンドを使用できます

上で述べたように、この例では、Ajax コードが HTML ページに記述されているため、このページのインターフェイス アドレスを表示できます
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(&#39;(&#39; +data+ &#39;)&#39;);
      $(&#39;.grant_info&#39;).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 接口地址
ログイン後にコピー

このユーザーが既にログインしている場合、攻撃者は上記のコマンドを実行することでユーザーのパスワードを変更できます。
解決策

上記の攻撃に対しては、検証方法を複雑にすることで安全性を高めることができます。方法の 1 つは、リクエスト ヘッダーの User-Agent 項目を使用してセキュリティを強化することです

 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_start() 関数を使用してセッションを開くだけでした。このコード
$_SESSION[‘User_Agent&#39;] = md5($_SERVER[‘HTTP_USER_AGENT&#39;]);
ログイン後にコピー

を session_start() の下に追加し、ログインするかどうかを判断するたびに以下の判定条件を追加する

If(isset($_SESSION[‘userid&#39;]) && $_SESSION[‘User_Agent&#39;] == md5($_SERVER[‘HTTP_USER_AGENT&#39;])){
    return true;
}
ログイン後にコピー

これにより、上記の単純な攻撃を回避できます。

概要:

もちろん、実際の攻撃は単純ではありません。まず、SessionID を取得することがより困難になります。次に、上記の状況を回避するために、サーバーと通信するコードを可能な限り暗号化する必要があります。コードを 2 回変更した後は、攻撃の複雑さを増すことはできますが、攻撃を排除することはできません。攻撃にはさまざまな方法がありますが、これは単なるアイデアを示したものに過ぎませんが、実際の状況に応じてコードのセキュリティを強化することができるという原理は同じです。


ここでは私が仕事で遭遇した問題を共有するだけですが、皆さんがもっと深く学んでいただければ幸いです。

以上がPHPでセッションを使用しても安全ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!