2012-08-29 50 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 - 不知道它为什么出现 –

相关问题