2012-08-29 3 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. 
    } 

누구든지이 방법을 사용하여 보안 위험이 있는지를 알 수 있습니까? 당신의 도움에 미리 감사드립니다! 예를 들어 비밀번호가

OR 1=1 

내가 접근 할 수 있다면

답변

0

이 안전하지 않습니다. 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의 라이브러리는 오히려 여기 PDO 준비된 문에 대해 읽어, PHP에 의해 권장하지 않습니다 : 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에 대한 형식이되었다 - 왜 나타나는지 모르겠다 –

관련 문제