Heim > php教程 > PHP开发 > Hauptteil

Detaillierte Erläuterung der Sitzungsnutzung in PHP Seite 1/2

高洛峰
Freigeben: 2016-12-24 09:25:37
Original
1197 Leute haben es durchsucht

Da die Sitzung serverseitig in Form einer Textdatei gespeichert wird, besteht keine Angst, dass der Client den Sitzungsinhalt ändert. Tatsächlich ändert PHP in der Sitzungsdatei auf der Serverseite automatisch die Berechtigungen der Sitzungsdatei, behält nur die Lese- und Schreibberechtigungen des Systems bei und kann nicht über FTP geändert werden, was viel sicherer ist. PHPChina Open Source Community Portal

Wenn wir für Cookies überprüfen möchten, ob der Benutzer angemeldet ist, müssen wir den Benutzernamen und das Passwort (möglicherweise eine MD5-verschlüsselte Zeichenfolge) im Cookie speichern und die Seite jedes Mal anfordern Zeit zur Überprüfung. Wenn Benutzername und Passwort in der Datenbank gespeichert sind, muss jedes Mal eine Datenbankabfrage ausgeführt werden, was zu einer unnötigen Belastung der Datenbank führt. Weil wir nicht nur eine Überprüfung durchführen können. Warum? Weil die Informationen im Client-Cookie geändert werden können. Wenn Sie die Variable $admin speichern, um anzugeben, ob der Benutzer angemeldet ist, bedeutet $admin, wenn er true ist, dass er angemeldet ist, und wenn er false ist, bedeutet er, dass er nicht angemeldet ist. Nachdem Sie die Überprüfung zum ersten Mal bestanden haben, speichern Sie $ admin ist im Cookie gleich „true“, und beim nächsten Mal ist keine Überprüfung erforderlich. Ist das falsch, wenn jemand eine Variable „$admin“ mit dem Wert „true“ fälscht? Administratorrechte erlangen? Es ist sehr unsicher.
Die Sitzung wird auf der Serverseite gespeichert. Daher können wir einfach eine $admin-Variable speichern, um zu bestimmen, ob eine Anmeldung erforderlich ist übergeben, setzen Sie den $admin-Wert auf „true“ und ermitteln Sie später, ob der Wert „true“ ist. Wenn nicht, gehen Sie zur Anmeldeschnittstelle, was viele Datenbankvorgänge reduzieren kann. Und es kann die Unsicherheit verringern, jedes Mal das Passwort zur Überprüfung des Cookies zu übergeben (die Sitzungsüberprüfung muss nur einmal durchgeführt werden, wenn Sie nicht das SSL-Sicherheitsprotokoll verwenden). Selbst wenn das Passwort MD5-verschlüsselt ist, kann es leicht abgefangen werden.
Natürlich bietet die Verwendung von Session viele Vorteile, wie z. B. einfache Steuerung und benutzerdefinierte Speicherung (in der Datenbank gespeichert). Ich werde hier nicht viel mehr sagen.
Muss die Sitzung in php.ini festgelegt werden? Im Allgemeinen nicht erforderlich, da nicht jeder die Berechtigung hat, PHP.ini zu ändern. Der Standardspeicherpfad der Sitzung ist der temporäre Systemordner des Servers die Speicherung in einem eigenen Ordner, den ich später vorstellen werde.
Beginnen wir mit der Erstellung einer Sitzung. Ganz einfach, wirklich.
Starten Sie die Sitzung und erstellen Sie eine $admin-Variable:

  // 启动 session 
  session_start(); 
  // 声明一个名为 admin 的变量,并赋空值。 
  $_session["admin"] = null;   
?>
Nach dem Login kopieren

Wenn Sie Seesion verwenden oder die PHP-Datei die Sitzungsvariable aufrufen möchte, müssen Sie sie vor dem Aufruf der Sitzung starten, verwenden Sie session_start ( ) Funktion. Sie müssen nichts weiter einstellen, PHP erstellt die Sitzungsdatei automatisch.
Nach der Ausführung dieses Programms können wir zum temporären Systemordner gehen, um die Sitzungsdatei zu finden. Im Allgemeinen hat der Dateiname die Form: sess_4c83638b3b0dbf65583181c2f89168ec, gefolgt von einer 32-Bit-codierten Zufallszeichenfolge. Öffnen Sie es mit einem Editor und sehen Sie sich den Inhalt an:
admin|N;
Im Allgemeinen ist der Inhalt wie folgt aufgebaut:
Variablenname |. Getrennt durch Semikolons jede Variable. Einige können weggelassen werden, z. B. Länge und Typ.
Schauen wir uns das Verifizierungsprogramm an:

  // 表单提交后… 
  $posts = $_POST; 
  // 清除一些空白符号 
  foreach ($posts as $key => $value) 
  { 
  $posts[$key] = trim($value); 
  } 
  $password = md5($posts["password"]); 
  $username = $posts["username"]; 
  $query = “Select `username` FROM `user` Where `password` = ‘$password'”; 
  // 取得查询结果 
  $userInfo = $DB->getRow($query); 
  if (!empty($userInfo)) 
  { 
  if ($userInfo["username"] == $username) 
  { 
  // 当验证通过后,启动 session 
  session_start(); 
  // 注册登陆成功的 admin 变量,并赋值 true 
  $_session["admin"] = true; 
  } 
  else 
  { 
  die(“用户名密码错误”); 
  } 
  } 
  else 
  { 
  die(“用户名密码错误”); 
  } 
  我们在需要用户验证的页面启动 session,判断是否登陆: 
  // 防止全局变量造成安全隐患 
  $admin = false; 
  // 启动会话,这步必不可少 
  session_start(); 
  // 判断是否登陆 
  if (isset($_SESSION["admin"]) && $_session["admin"] === true) 
  { 
  echo “您已经成功登陆”; 
  } 
  else 
  { 
  // 验证失败,将 $_session["admin"] 置为 false 
  $_session["admin"] = false; 
  die(“您无权访问”); 
  } 
  ?>
Nach dem Login kopieren
Stellen Sie sich $_session als ein auf dem gespeichertes Array vor Serverseitig ist jedoch jede Variable, die wir registrieren, ein Schlüssel des Arrays, was sich nicht von der Verwendung eines Arrays unterscheidet.

Was soll ich tun, wenn ich mich vom System abmelden möchte? Einfach die Sitzung zerstören.

  session_start(); 
  // 这种方法是将原来注册的某个变量销毁 
  unset($_session["admin"]); 
  // 这种方法是销毁整个 session 文件 
  session_destroy(); 
?>
Nach dem Login kopieren
Kann Session den Lebenszyklus wie Cookie festlegen? Wird Cookie mit Session vollständig aufgegeben? Ich würde sagen, dass es am bequemsten ist, Session in Kombination mit Cookie zu verwenden.

Wie bestimmt die Sitzung den Client-Benutzer? Wie lautet der Dateiname der Sitzungsdatei, sodass Eindeutigkeit und Zufälligkeit sichergestellt werden können? um die Sicherheit der Sitzung zu gewährleisten. Wenn der Sitzungslebenszyklus nicht festgelegt ist, wird die Sitzungs-ID im Speicher gespeichert. Nach dem Schließen des Browsers wird die ID automatisch abgemeldet. Nach erneuter Anforderung der Seite wird eine neue Sitzungs-ID registriert.
Wenn der Client Cookies nicht deaktiviert, übernimmt das Cookie beim Starten der Sitzung die Aufgabe, die Sitzungs-ID und die Sitzungsdauer zu speichern.
Legen Sie die Sitzungslebensdauer manuell fest:

  session_start(); 
  // 保存一天 
  $lifeTime = 24 * 3600; 
  setcookie(session_name(), session_id(), time() + $lifeTime, “/”); 
  ?>
Nach dem Login kopieren
Tatsächlich bietet Session auch eine Funktion session_set_cookie_params(); Diese Funktion muss vor dem Aufruf der Funktion session_start() aufgerufen werden :

  // 保存一天 
  $lifeTime = 24 * 3600; 
  session_set_cookie_params($lifeTime); 
  session_start(); 
  $_session["admin"] = true; 
  ?>
Nach dem Login kopieren

  如果客户端使用 IE 6.0 , session_set_cookie_params(); 函数设置 Cookie 会有些问题,所以我们还是手动调用 setcookie 函数来创建 cookie。
  假设客户端禁用 Cookie 怎么办?没办法,所有生存周期都是浏览器进程了,只要关闭浏览器,再次请求页面又得重新注册 Session。那么怎么传递 Session ID 呢?通过 URL 或者通过隐藏表单来传递,PHP 会自动将 session ID 发送到 URL 上,URL 形如:http://www.openphp.cn /index.php?PHPSESSID=bba5b2a240a77e5b44cfa01d49cf9669,其中 URL 中的参数 PHPSESSID 就是 Session ID了,我们可以使用 $_GET 来获取该值,从而实现 session ID 页面间传递。

  // 保存一天 
  $lifeTime = 24 * 3600; 
  // 取得当前 session 名,默认为 PHPSESSID 
  $sessionName = session_name(); 
  // 取得 session ID 
  $sessionID = $_GET[$sessionName]; 
  // 使用 session_id() 设置获得的 session ID 
  session_id($sessionID); 
  session_set_cookie_params($lifeTime); 
  session_start(); 
  $_session["admin"] = true; 
  ?>
Nach dem Login kopieren

  对于虚拟主机来说,如果所有用户的 Session 都保存在系统临时文件夹里,将给维护造成困难,而且降低了安全性,我们可以手动设置 Session 文件的保存路径,session_save_path()就提供了这样一个功能。我们可以将 session 存放目录指向一个不能通过 Web 方式访问的文件夹,当然,该文件夹必须具备可读写属性。

  // 设置一个存放目录 
  $savePath = “./session_save_dir/”; 
  // 保存一天 
  $lifeTime = 24 * 3600; 
  session_save_path($savePath); 
  session_set_cookie_params($lifeTime); 
  session_start(); 
  $_session["admin"] = true; 
  ?>
Nach dem Login kopieren

  同 session_set_cookie_params(); 函数一样,session_save_path() 函数也必须在 session_start() 函数调用之前调用。
  我们还可以将数组,对象存储在 session 中。操作数组和操作一般变量没有什么区别,而保存对象的话,PHP 会自动对对象进行序列化(也叫串行化),然后保存于 session 中。下面例子说明了这一点:

  class person 
  { 
  var $age; 
  function output() { 
  echo $this->age; 
  } 
  function setAge($age) { 
  $this->age = $age; 
  } 
  } 
  ?>
Nach dem Login kopieren

  setage.PHP

  session_start(); 
  require_once “person.PHP”; 
  $person = new person(); 
  $person->setAge(21); 
  $_session['person'] = $person; 
  echo “check here to output age”; 
  ?>
Nach dem Login kopieren

  output.PHP

  // 设置回调函数,确保重新构建对象。 
  ini_set(‘unserialize_callback_func', ‘mycallback'); 
  function mycallback($classname) { 
  $classname . “.PHP”; 
  } 
  session_start(); 
  $person = $_session["person"]; 
  // 输出 21 
  $person->output(); 
  ?>
Nach dem Login kopieren

  当我们执行 setage.php 文件的时候,调用了 setage() 方法,设置了年龄为 21,并将该状态序列化后保存在 session 中(PHP 将自动完成这一转换),当转到 output.php 后,要输出这个值,就必须反序列化刚才保存的对象,又因为在解序列化的时候需要实例化一个未定义类,所以我们定义了以后回调函数,自动包含 person.PHP 这个类文件,因此对象被重构,并取得当前 age 的值为 21,然后调用 output() 方法输出该值。

更多PHP中session使用方法详解第1/2页相关文章请关注PHP中文网!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage