ホームページ >バックエンド開発 >PHPチュートリアル >PHP はセッション制御による認証例を実装します

PHP はセッション制御による認証例を実装します

墨辰丷
墨辰丷オリジナル
2018-05-31 14:21:00928ブラウズ

この記事では、セッション制御による PHP 認証の例を紹介します。ID の認証は、セッションを通じてデータを送信することです。困っている友達が来て探してくれるかもしれません。

セッション制御の考え方は、Web サイト上のセッションに基づいてユーザーを追跡できるようにすることです。詳細なコードはここにまとめられています。必要な友人はそれを参照してください。

概要

http プロトコルはステートレスであり、リクエストごとにサーバーはユーザーを区別できません。 PHP セッション制御はユーザーにキー (暗号化されたセッション文字列) を提供します。これはユーザーの ID の証明でもあり、サーバーはこのキーで開くことができるボックス (データベース、メモリ データベース、またはファイル) を保存します。ユーザーのさまざまな可変情報。

従来の php セッションの使用

<?php
//page1.php 启动一个会话并注册一个变量
session_start();
$_SESSION[&#39;user_var&#39;] = "hello,codekissyoung!";
//这里的可以将$_SESSION理解为用户的箱子,实际的实现是php在服务器端生成的小文件
?>

<?php
//page2.php
session_start();
echo $_SESSION[&#39;user_var&#39;];//通过钥匙访问自己的箱子内的变量
$_SESSION[&#39;user_var&#39;] = "bey,codekissyoung!";
?>

<?php
//page3.php 销毁钥匙,一般在用户注销时,访问page3.php文件
session_start();
session_destroy();
?>

質問ですが、キーはどこにありますか?ユーザーにキーを与える操作を見ませんでしたか?

この操作は、php によってバックグラウンドで行われます。page1.php にアクセスすると、プログラムが実行されるため、session_start();、php はその時点の条件 (ユーザー IP、ブラウザー番号、時刻) に基づいてそれを生成します。 PHPSESSID 変数。http 応答がクライアントに返された後、このドメイン名に再度アクセスするたびに、この PHPSESSID がサーバーに送信されます。この PHPSESSID が、ここで話しているユーザー キーです。

もう一つ質問ですが、この PHPSESSID のセキュリティは、盗まれやすいですか、偽造されやすいですか、改ざんされやすいですか?

HTTPS を使用すると改ざんを防ぐことができます。 PHPSESSID は使用せず、偽造を防ぐためにユーザーの秘密キーを生成します。盗難されやすいかどうかについては、実際には研究されていません。たとえば、コンピュータがインターネットに接続されており、ハッカーがコンピュータに侵入したとします。

生成された秘密鍵をブラウザのCookieに保存

  • Cookieを設定

  • setCookie('key','value',time()+3600);

  • Cookieを削除

  • setCookie('key','',time()-1);

シングルサインオンの実現: セッション共有

シングルサインオン: 複数のサブシステムがユーザー認証システムを共有し、1 つのログインでアクセスが可能すべてのサブシステムに。

次のシナリオを想像してください: サーバー A と B の PHP 環境が同じであると仮定します。ユーザーはサーバー A でキーを取得し、そのキーを使用してサーバー B にアクセスしました。ユーザーはサーバー B を知っていますか?

明らかにそうではありません。サーバーはサーバー A によって生成されたキーを認識しません。

解決策: ユーザーが A または B にアクセスするかどうかに関係なく、生成されたキーを C (同じデータベースまたはキャッシュ システム) に保存します。ユーザーが再度 A または B にアクセスすると、A と B の両方が C に次のように尋ねます。ユーザーのキーは正しいですか?正しければ、ユーザーはAまたはBに保管されているボックスを使用できるようになります。

<?php
session_regenerate_id();//重置 session  字符
$session_info=array(&#39;uid&#39;=>$uid,&#39;session&#39;=>session_encrypt(session_id().time()));
//下一步将,$session_info 存到 C 中
?>

以下は、セッション制御を通じて認証を実装する php の例です。

認証アプリケーション本体: authmain: セッション変数をログアウトし、セッションを破棄します: logout.php

<?php 
//开启一个会话 
session_start(); 
 
if((!isset($userid))||(!isset($password))) { 
  $userid=$_POST[&#39;userid&#39;]; 
  $password=$_POST[&#39;password&#39;]; 
//连接数据库 
$db_conn=new mysqli("localhost", "root", "","auth"); 
if(mysqli_connect_errno()){ 
  echo &#39;连接数据库失败:&#39;.mysqli_connect_error(); 
  exit(); 
} 
//执行SQL查询语句 
$query="SELECT * FROM authorized_users WHERE name=&#39;".$userid."&#39; and password=sha1(&#39;".$password."&#39;)"; 
$result=$db_conn->query($query); 
if($result->num_rows>0){ 
  //注册一个会话变量 
  $_SESSION[&#39;valid_user&#39;]=$userid; 
} 
//断开数据库连接 
$db_conn->close(); 
} 
?> 
<!DOCTYPE html> 
<html> 
<head> 
  <meta charset="UTF-8"> 
  <title>身份验证</title> 
</head> 
<body> 
<h1>主页</h1> 
<?php 
//判断用户是否已经登录 
if(isset($_SESSION[&#39;valid_user&#39;])){ 
  echo $_SESSION[&#39;valid_user&#39;].&#39;,您好,你已经登录&#39;; 
  echo &#39;<a href="logout.php">退出登录</a><br/>&#39;; 
}else{ 
  if(isset($userid)){ 
    echo &#39;您没有登录成功&#39;; 
  }else{ 
    echo &#39;您还没有登录<br/>&#39;; 
  } 
  ?> 
  <form method="post" action="authmain.php"> 
    <p>用户名:<input type="text" name="userid"></p> 
 
    <p>密码:<input type="password" name="password"></p> 
 
    <p><input type="submit" name="submit" value="登录"></p> 
  </form> 
<?php 
} 
?> 
<br/> 
<a href="members_only.php">登录进入</a> 
 
</body> 
</html>

要約: 上記がこの記事の全内容です。皆様の学習に役立つことを願っています。

関連する推奨事項:

php

フォーマットファイルの開き方のまとめ

PHPデータベースでのmemcacheの使い方

php 再帰関数の場合の使い方の詳細な説明


以上がPHP はセッション制御による認証例を実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。