2012-08-29 80 views
0

我正在寫一個代碼,將檢查2個不同的表來確定用戶將擁有的權限。代碼如下:我正在查看是否有人可以告訴我這是多麼安全

$query1 = ("SELECT 1 FROM `customers` WHERE `Email` = '$email' AND `Password` = '$password'"); 
    $query2 = ("SELECT 1 FROM `admins` WHERE `Email` = '$email' AND `Password` = '$password'"); 

    $result1 = mysql_query($query1) or die(mysql_error()); 
    $result2 = mysql_query($query2) or die(mysql_error()); 

    if (mysql_num_rows($result1) == 1) { 
     // Log user in as a Customer 
     exit; 
    } else if (mysql_num_rows($result2) == 1) { 
     // Log user in as an Admin. 
     exit; 
    } else { 
     // Direct user to registration page. 
    } 

任何人都可以看看這個,並告訴我這樣做是否會有任何安全風險?預先感謝您的幫助!

回答

0

這是不安全的,如果例如我的密碼是

OR 1=1 

我獲得訪問權。使用MySQL準備語句

<?php 
$mysqli = new mysqli("example.com", "user", "password", "database"); 
if ($mysqli->connect_errno) { 
    echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error; 
} 

/* Prepared statement, stage 1: prepare */ 
if (!($stmt = $mysqli->prepare("SELECT 1 FROM customers WHERE Email = (?) AND Password = (?)"))) { 
    echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error; 
} 

if (!$stmt->bind_param("ss", $email, $password)) { 
    echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error; 
} 

if (!$stmt->execute()) { 
    echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error; 
} 
?> 
0

首先,你有你的代碼只有您知道的變化。

其次,你必須檢查輸入數據。電子郵件和密碼區域不安全。你應該防止SQL注入。否則你的代碼是不安全的。

順便說一下,我爲您提供IP限制登錄管理員。我正在使用這個。它更安全。

0

這裏的一個大問題是代碼對於sql注入很脆弱。 基本上這意味着用戶可以用電子郵件或密碼的形式放置代碼來繞過您在此處的檢查。

一開始將執行之前,您在您的查詢中使用它們下面給您的輸入:

$email = mysql_real_escape_string($email); 
$password = mysql_real_escape_string($password); 

雖然,不建議MySQL庫由PHP的,而閱讀有關PDO這裏準備語句: http://www.php.net/manual/en/ref.pdo-mysql.php

但是,您可以嘗試mysql_real_escape_string以獲得針對sql注入的第一個安全措施。

+0

如果我的密碼是'OR 1 = 1',mysql_real_escape_string'將如何幫助 –

+0

它會轉義字符(\),所以它會被視爲字符而不是影響字符串。所以密碼將是\'OR 1 = 1 \'這將不會影響查詢 – Ossie7

+0

這是格式化的stackoverflow - 不知道它爲什麼出現 –

相關問題