2

私はこの主題がたくさんカバーされていることを知っています.

次のようにセットアップされたユーザー名パスワードログインシステムがあります。

ログインページ: アクションに設定 - checklogin.php

checklogin.php - データベースに対してユーザー名とパスワードをチェックし、ヘッダーで、データベースの列 3 にあるカスタム URL に移動します。したがって、user1 は folder1/ に移動し、user2 は folder2/ に移動します。

正常に動作しているように見えますが、user1 (URL /folder1/) としてログインしているとします。URL ウィンドウに「/folder2/」と入力すると、そのフォルダー インデックス ファイルが表示されます。

したがって、基本的に、任意のユーザー名でログインしている場合、他のユーザーのフォルダー/index.php ファイルを取得できます。

したがって、index.php ページのコードがユーザーを正しく検証していないと思います。

コード(トップは問題ありません。DBに接続するなどなので、省略しました):

checklogin.php:
// Define $username and $password
$username=$_POST['username'];
$password= $_POST['password'];

// To protect MySQL injection 
$username = stripslashes($username);
$password = stripslashes($password);
$username = mysql_real_escape_string($username);
$password = mysql_real_escape_string($password);

$sql="SELECT * FROM $tbl_name WHERE username='$username' and password='$password'";
$result=mysql_query($sql);

// Mysql_num_row is counting table row
$count=mysql_num_rows($result);

// If result matched $username and $password, table row must be 1 row

if($count==1){

 // Register $username, $password and redirect to file "index.php"
session_start();
$_SESSION[$username];
$_SESSION[$password];
$_SESSION['loggedin'] = true;
$_SESSION[$id];
$row = mysql_fetch_assoc($result);
$result = mysql_query("SELECT folder FROM users2");
$_SESSION['folder'] = $row['folder'];
   if( isset($username) ) {
$_SESSION["loggedin"] = true;
$_SESSION["username"] = $username;
header('Location: clients/'. $row['folder'].'/index.php');
exit();
}
else {
echo "Wrong Username or Password";
}
ob_end_flush();
}
?>

受信 URL の index.php ページ:

session_start();
if (!isset($_SESSION['loggedin']) || $_SESSION['loggedin'] !== true)  {
// not logged in, move to login page
 header("location:../../login.php");
exit;
}  

受信「ページ保護」コードの他の多くのバリエーションを試しましたが、どれも正しく機能していないようです。受信コードなのか、チェックログインコードなのか??? 明らかな何かが欠けているように感じます。

よろしくお願いします。- ランディ

4

3 に答える 3

0

不要なものをたくさん使用する!== と、それらのほとんどを次のように置き換えます!=

また変更します

if($count==1){ 

while($count>=1){

変化する

if( isset($username) ) {

if( isset($username) && $username != "" && $username != NULL ) {

Var_dump $result、必要なものが含まれていることを確認してください。2回リストされています。

セッション内で変数を参照するときは、ダブル/シングル引用符で囲むことをお勧めします。

自分に有利に働き、magic quotes完全mssql()に避けてください。pdoまたはに切り替えるMYSQLI

于 2013-02-08T22:05:34.500 に答える
0

保護されたページにチェックを追加する必要があります。ログインしたユーザーが必要なだけでなく、要求されたパスをチェックして、ユーザーがそれにアクセスできるかどうかを確認する必要があります。

次のようなもの (たとえば...):

session_start();
if (!isset($_SESSION['loggedin']) || $_SESSION['loggedin'] !== true 
    || stripos($_SERVER['REQUEST_URI'], $_SESSION['folder']) === false)  {
// not logged in, move to login page
 header("location:../../login.php");
exit;
}

それとは別に、プレーンテキストのパスワードを保存してはならず、実際に PDO (または mysqli) に切り替えて、変数がバインドされた準備済みステートメントを作成する必要があります。

編集:何が起こっているのかを明確にする別の解決策:

session_start();
if (!isset($_SESSION['loggedin']) || $_SESSION['loggedin'] !== true)  {
  // not logged in, move to login page
  header("location:../../login.php");
  exit();
}
elseif (stripos($_SERVER['REQUEST_URI'], $_SESSION['folder']) === false)
{
  // $_SESSION['folder'] is not found in the path,
  // not user's folder, go to own folder
  header('Location: /clients/'. $_SESSION['folder'].'/index.php');
  exit();
}
else
{
  // show page of user
}
于 2013-02-07T21:21:17.373 に答える
-1
if (!isset($_SESSION['loggedin']) |$_SESSION['loggedin'] !== true)     
if (stripos($_SERVER['REQUEST_URI'], $_SESSION['folder']) === false)
 { 
// not logged in, move to login page
 header("location:../../login.php"); exit; } – RandyS just now edit 
于 2013-02-07T22:00:17.403 に答える