2012-03-13 32 views
1

只是爲了知識的緣故,我想知道如何使用PHP登錄註銷認證的Dreamweaver內置功能?Dreamweaver PHP登錄註銷的安全性如何?

安全嗎?

我總是使用會話,文章和許多東西來構建登錄系統,但是當我使用Dreamweaver時,它非常簡單並且似乎很安全。仍然需要專家的意見,我應該開始使用它還是傳統的更好。我沒有發現任何限制,只是想知道天氣是否足夠安全。

這裏是一個Dreamweaver提供的代碼: -


這是我的登錄表單


<form action="<?php echo $loginFormAction; ?>" method="POST" target="_self"> 
    <input name="ecsuser" class="form-login" title="Username" value="" size="30" 
    maxlength="2048" /> 

    <input name="ecspass" type="password" class="form-login" title="Password" 
    value="" size="30" maxlength="2048" /> 

    <?php if(!empty($ERRORMESSAGE)) echo '<div style="color:#FFF; 
    font-weight:bold;">'.$ERRORMESSAGE.'</div>'; ?> 

    <input name="" type="submit" value="" /> 
</form> 

這是我的錯誤處理代碼。


<?php 
if (isset($_GET['ERRORMESSAGE'])) 
{ 
    if($_GET['ERRORMESSAGE'] == 1) 
    { 
    global $ERRORMESSAGE; 
    $ERRORMESSAGE = "Sorry! The username or password is incorrect, 
      Please try again."; 
    } 
} 
?> 

這是我進一步的代碼


// Database Connection Include 
<?php require_once('Connections/ecs.php'); ?> 
<?php 
if (!function_exists("GetSQLValueString")) { 
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{ 
    if (PHP_VERSION < 6) { 
    $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue; 
    } 

    $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue); 

    switch ($theType) { 
    case "text": 
     $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; 
     break;  
    case "long": 
    case "int": 
     $theValue = ($theValue != "") ? intval($theValue) : "NULL"; 
     break; 
    case "double": 
     $theValue = ($theValue != "") ? doubleval($theValue) : "NULL"; 
     break; 
    case "date": 
     $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL"; 
     break; 
    case "defined": 
     $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue; 
     break; 
    } 
    return $theValue; 
} 
} 
?> 
<?php 
// *** Validate request to login to this site. 
if (!isset($_SESSION)) { 
    session_start(); 
} 

$loginFormAction = $_SERVER['PHP_SELF']; 
if (isset($_GET['accesscheck'])) { 
    $_SESSION['PrevUrl'] = $_GET['accesscheck']; 
} 

if (isset($_POST['ecsuser'])) { 
    $loginUsername=$_POST['ecsuser']; 
    $password=md5($_POST['ecspass']); 
    $MM_fldUserAuthorization = ""; 
    $MM_redirectLoginSuccess = "index.php"; 
    $MM_redirectLoginFailed = "login.php?ERRORMESSAGE=1"; 
    $MM_redirecttoReferrer = false; 
    mysql_select_db($database_ecs, $ecs); 

    $LoginRS__query=sprintf("SELECT username, password FROM student WHERE username=%s AND password=%s", 
    GetSQLValueString($loginUsername, "text"), GetSQLValueString($password, "text")); 

    $LoginRS = mysql_query($LoginRS__query, $ecs) or die(mysql_error()); 
    $loginFoundUser = mysql_num_rows($LoginRS); 
    if ($loginFoundUser) { 
    $loginStrGroup = ""; 

    if (PHP_VERSION >= 5.1) {session_regenerate_id(true);} else {session_regenerate_id();} 
    //declare two session variables and assign them 
    $_SESSION['MM_Username'] = $loginUsername; 
    $_SESSION['MM_UserGroup'] = $loginStrGroup;  

    if (isset($_SESSION['PrevUrl']) && false) { 
     $MM_redirectLoginSuccess = $_SESSION['PrevUrl']; 
    } 
    header("Location: " . $MM_redirectLoginSuccess); 
    } 
    else { 
    header("Location: ". $MM_redirectLoginFailed); 
    } 
} 
?> 

另外,我想知道,有什麼我們需要建立一個有效的登錄系統的所有其他安全措施並且上面的代碼是完美的,沒有任何安全問題。

+0

如果鏈接和示例代碼提供這將是非常有幫助,在此先感謝:) – 2012-03-13 07:52:09

+1

https://wiki.mozilla.org/WebAppSec/Secure_Coding_Guidelines#Password_Storage – zuallauz 2012-03-13 08:10:26

回答

9
Is it secure? 

號我看到了幾個問題:

1)首先,有一個XSS漏洞。當你像這樣迴應$_SERVER['PHP_SELF']時,它需要用htmlspecialchars()轉義。如果你不這樣做,攻擊者可以創建鏈接,點擊後會竊取可用於登錄的會話cookie,而無需用戶名和密碼。 參見:PHP_SELF and XSS

2)GetSQLValueString有問題。如果mysql_real_escape_string()不存在,它將回落到mysql_escape_string()。你永遠不應該回到mysql_escape_string()。如果mysql_real_escape_string()不可用,並且您依靠它來避免SQL注入,則應停止您的應用程序。 在知道數據類型之前,該函數也正在對數據進行轉義。如果你使用intval(),floatval(),doubleval(),你不需要先做一個mysql_real_escape_string()

我建議改變它以使用MySQLi或PDO參數化查詢,這些查詢會自動處理您的轉義。

的MySQLi:http://php.net/manual/en/mysqli.prepare.php PDO:http://us2.php.net/manual/en/book.pdo.php

3)這似乎是試圖(和失敗),以重定向到成功登錄前一頁。除非您對URL進行了硬編碼,或者您驗證了用戶提供的URL,否則您不應該重定向,如果您不這樣做,您可能容易受到打開的重定向/網絡釣魚攻擊。 看起來有人可能試圖通過在if這裏添加false來解決這個問題:if (isset($_SESSION['PrevUrl']) && false) {,這個聲明永遠不會評估到true,所以它是毫無意義的保留它。 4)。看看這一行:

$LoginRS = mysql_query($LoginRS__query, $ecs) or die(mysql_error()); 

如果執行此查詢時出現任何MySQL錯誤,應用程序將打印出完整的MySQL錯誤,然後停止。這對任何嘗試執行SQL注入攻擊的人都是非常有幫助的。即使你已經獲得了SQL注入的保護,這仍然會告訴世界部分你的數據庫結構。 您應該使用trigger_error()或做自己的錯誤日誌記錄,但不要在生產/現場/公共系統中將其顯示給用戶。 5)。最後,可以在登錄/註銷表單上執行XSRF攻擊。提交諸如登錄/註銷等操作時,應該使用反XSRF標記。 參見:http://en.wikipedia.org/wiki/Cross-site_request_forgery

+1

感謝您的幫助:)其真正的描述性和充分的知識......爲您的三個歡呼... – 2012-03-13 11:22:24

2

它很容易受到CSRF的影響。抱歉。

另外,我在Dreamweaver中有一個PHP後臺客戶端。他被谷歌黑客入侵(所有數據庫記錄被刪除)。

顯然:

  1. 有些地方並不安全 - 沒有驗證憑據

  2. 有「刪除」,這並沒有強迫任何確認鏈接和GET工作(標準失敗)

  3. 谷歌很好地爬過後臺,並刪除了所有內容(說它在日誌中)

+0

嘿漂亮的筆記,我還沒有碰到過CSRF尚未來到...謝謝你包括這個...... – 2012-03-13 08:30:22

+0

這很搞笑:) – 2013-01-22 14:27:01

+0

是的,這讓我覺得,如果Dreamweaver依賴像symfony這樣的框架而不是生成可怕的代碼,也許Dreamweaver看起來很嚴肅。 – jpic 2013-01-23 11:36:29

1

當然不是防彈的。說實話,它介於兩者之間。有問題,但我看到最壞的情況。

$ _SERVER ['PHP_SELF']上的XSS是已知的,但並不像人們認爲的那樣具有破壞性,我向你保證許多網站都會受到它的影響。

mysql_escape_string()不好,所有那段代碼都不好,但是如果你的服務器有mysql_real_escape_string(),它就不會崩潰。如果你的服務器擁有它,那麼它就不會掉下來。

如果您擁有舊版本的PHP,那麼您有XSS並有可能被搞砸,但是如果您有這樣一個老版本,那麼您很容易受到攻擊。

如果您將您的工作建立在Dreamweaver上,請嘗試添加驗證和清理以形成元素,但這裏有一些擴展。注意使用服務器端驗證dreamweaver擴展作業(檢查市場)。

我假設你的問題是與Dreamweaver相關的,你想知道使用Dreamweaver服務器行爲和命令創建的應用程序有多安全。不是那麼安全,不是那麼脆弱。

從其他用戶那裏得到的建議是正確的,準備好的語句比較好,mysqli應該是最低標準。但是如果你必須用Dreamweaver(詩人編程)來完成你的工作,那麼比我的建議是檢查一些Dreamweaver擴展以進行表單元素的服務器端驗證,你可能會購買一個更昂貴的Dreamweaver擴展,它可能會爲你提供相同的功能和與Dreamweaver相同的集成我想你正在尋找,但是當涉及到「註冊」模塊時,它有更好的代碼。市場上有一些。

例如Web Assist有這樣的事情。我不喜歡它們,因爲代碼的結果很混亂,頁面比較臃腫。學習曲線也是一個問題,你可能更願意學習PHP,而不是學習推動這些擴展的按鈕。

FelixOne是此類擴展的另一個提供商,價格更便宜,學習曲線比Web Assist更好。給他們一個嘗試。