2012-07-21 16 views
0

最近我試圖創建爲我的項目的登錄網頁。 所以有index.html這個人必須登錄的登錄頁面。這將查詢發送到 checklogin.php是這樣的:PHP無法回憶起會議

<?php 
ob_start(); 
$host="localhost"; // Host name 
$username=""; // Mysql username 
$password=""; // Mysql password 
$db_name="test"; // Database name 
$tbl_name="members"; // Table name 

// Connect to server and select databse. 
mysql_connect("wordshare.zxq.net", "754319_guest", "guest")or die("cannot connect"); 
mysql_select_db("wordshare_zxq_users")or die("cannot select DB"); 

// Define $myusername and $mypassword 
$myusername=$_POST['myusername']; 
$mypassword=$_POST['mypassword']; 

// To protect MySQL injection (more detail about MySQL injection) 
$myusername = stripslashes($myusername); 
$mypassword = stripslashes($mypassword); 
$myusername = mysql_real_escape_string($myusername); 
$mypassword = mysql_real_escape_string($mypassword); 
$sql="SELECT * FROM members WHERE username='$myusername' and password='$mypassword'"; 
$result=mysql_query($sql); 

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

// If result matched $myusername and $mypassword, table row must be 1 row 
if($count==1){ 

// Register $myusername, $mypassword and redirect to file "login_success.php" 
session_start(); 
session_register("myusername"); 
session_register("mypassword"); 
header("location:main.php"); 
} 
else { 
    header("location:index.html"); 
} 
ob_end_flush(); 
?> 

然後在主網頁檢查的會話,如果您還沒有登錄它重定向你的index.html,代碼是如下:

<?php 
// Connects to your Database 
mysql_connect("wordshare.zxq.net", "754319_guest", "guest")or die("cannot connect"); 
mysql_select_db("wordshare_zxq_users")or die("cannot select DB"); 
//checks cookies to make sure they are logged in 
session_start(); 
session_start(); 
if(!session_is_registered(myusername)){ 
header("location:index.html"); 
} 
?> 

的問題是,我不重定向回主頁,如果我直接去main.html中。 我試着用echo來找出會話是否被記錄,並且它返回undefined。 讓我感到困惑的是,即使當我嘗試打印出某個單詞之類的東西時,它也會使我「未定義」。 任何人都可以幫助我嗎?

+0

會話在第二個代碼片段if(isset($ _ SESSION [「myusername」]))中檢查用戶名是否設置.. – Gntem 2012-07-21 09:49:38

回答

4

你有你的代碼中的許多問題。無論你在哪裏複製,這都是一個非常糟糕的例子。我有一些空閒時間,所以我強調我所看到的,最嚴重的第一:

  • 您保存明文密碼在你的數據庫。這是非常嚴重的,因爲如果有人會破解你的數據庫,用戶名和密碼信息可以很容易地找回。這是一個非常常見的錯誤,但卻非常糟糕。請輸入密碼,例如phpass library。該網站很好地解釋了這是關於什麼的。所以如果你想學習,那個網站不僅有代碼,而且給出了一個相當好的和通用的描述。

  • 該代碼預計get_magic_quotes_gpc已啓用。相反,它應該拒絕工作,如果它啓用。假設魔術引號啓用是一個安全問題,因爲它阻止你編寫安全的代碼

    代碼:

    $mypassword=$_POST['mypassword']; 
    
    // To protect MySQL injection (more detail about MySQL injection) 
    $myusername = stripslashes($myusername); 
    

    建議:

    if (get_magic_quotes_gpc()) { 
        throw new UnexpectedValueException('get_magic_quotes_gpc must be off.'); 
    } 
    $mypassword = $_POST['mypassword']; 
    

    (有沒有必要

  • 您使用其他過時的語言功能。這只是一個症狀,無論您是否複製了該代碼,您都沒有采用最先進的代碼。你有幾個問題:

    • mysql_*功能。改用PDO。它使用起來更簡單,而且功能更強大。通過提供所謂的準備語句(也稱爲參數化查詢),它可以幫助您主動防止SQL注入。瞭解它,使用它。
    • session_registersession_is_registered功能。這些被用來在會話內註冊全局變量。它們不安全並被棄用。而是使用超全球的$_SESSION,就像您已經使用超全球的$_POST一樣。
  • 一長串代碼。你不使用子程序。雖然他們可能會對你很有幫助。瞭解如何編寫your own functions,因爲您可以像編寫文本一樣進行編程。

例子:

<?php 
require('my-functions.php'); 

$location = 'index.html'; 

if ($user = user_form_submitted() && user_is_valid($user)) { 
    user_login_into_session_($user); 
    $location = 'main.php';  
} 

redirect($location); 
?> 

正如你可以看到這是很容易讀懂。然後定義執行這項工作的功能,例如:

/** 
* redirect request 
* 
* @param string $location 
*/ 
function redirect($location) { 
    if (!headers_sent()) { 
     header("Location: " . $location); 
    } 
    printf('Moved <a href="%1$s">here</a>.', htmlspecialchars($location)); 
} 

這只是一個例子。所以你可以開始編程,甚至不用考慮所有的榮耀不同的細節如何工作。

+0

感謝您的提示。 現在我已將會話代碼更改爲: $ _SESSION ['myusername'] = $ myusername; $ _SESSION ['mypassword'] = $ mypassword;主要是 。我已經設置會話檢查代碼爲: if(!isset($ _ SESSION ['myusername'])){ header(「location:index.html」); } 但是,它似乎沒有設置會話,我不斷收到重定向回主頁面。 任何想法什麼是錯誤的網頁? – 2012-07-25 16:34:22

+0

加入進來,安全性不是我關心的問題,因爲我只是爲了實踐而製作這個網站,我不會對此做任何嚴肅的事情。但是,感謝您的建議。我會在需要時使用它。 – 2012-07-25 16:41:54

+0

安全性不僅在攻擊等意義上很重要,而且在確保應用程序按預期工作的意義上也是如此。如果會話似乎沒有設置,則需要更具體地調試。可能這裏概述的會話類可能是有見地的:http://stackoverflow.com/questions/11596082/php-session-class-similar-to-codeigniter-session-class-exists/11596538#11596538 – hakre 2012-07-25 21:09:30

1

我想你錯過了這條線報價:if (!session_is_registered(myusername)) {

它應該是:if(!session_is_registered("myusername")) {

0

你有兩個會話(具有相同的名稱),這意味着第二覆蓋第一屆會議。

你爲什麼要使用session_register時,手冊上說

此功能已被棄用的PHP 5.3.0和去除PHP 5.4.0的。

相反:

類型$_SESSION['myusername'] = $usr;$_SESSION['mypassword'] = $pswd;

刪除第二個session_start()main.php

類型if (isset($_SESSION['myusername'])代替session_is_registered()