2014-12-17 3 views
0

두 테이블을 검사하여 데이터베이스에 사용자 이름과 암호가 있는지 확인하는 로그인 스크립트를 만들려고합니다.MYSQL 값이 테이블에 있는지 확인하십시오. 로그인 스크립트

두 테이블을 갖는 목적은 공급 업체/외부 사용자를위한 것이고 다른 하나는 내부 사용자를위한 것입니다.

내가 존재하지 않는 MYSQL 쿼리에 문제가 있습니다. 이로 인해 쿼리에 'oooops!'오류가 표시됩니다. 사용자 이름 또는 암호 조합이 잘못되었습니다. '

누군가 내가 여기서 잘못 가고있는 것을 보여 주실 수 있습니까? 왜 그런 다음 PHP의 반환 값을 테스트 할 수 있습니다

$query=" select 
    (select count(*) from $tbl_name where username = '$myusername' and password = '$mypassword') as nbInTable1, 
    (select count(*) from $tbl_name2 where username = '$myusername' and password = '$mypassword') as nbInTable2"; 

처럼 smthing하지 감사

session_start(); 
include("config.php"); 

$tbl_name="supplier_users"; 
$tbl_name2="internal_users"; 
$myusername=$_POST['myusername']; 
$mypassword=$_POST['mypassword']; 
$myusername = stripslashes($myusername); 
$mypassword = stripslashes($mypassword); 
$myusername = mysql_real_escape_string($myusername); 
$mypassword = mysql_real_escape_string($mypassword); 

$sql="select NOT EXISTS (select * from $tbl_name where username = {$myusername} and password = {$mypassword}) AND NOT EXISTS (select * from $tbl_name2 where username = {$myusername} and password = {$mypassword})"; 
$result=mysql_query($sql); 
$count=mysql_num_rows($result); 
$row=mysql_fetch_array($result); 

if($count==1) { 
    session_start(); 
    $_SESSION['user']=$myusername; 
    $_SESSION['username']=$row['First_Name']; 

    if(isset($_SESSION['val'])) { 
     $_SESSION['val']=$_SESSION['val']+1; 
    } else { 
     $_SESSION['val']=1; 
     header("location:../dashboard.php"); 
    } 
} else { 
    echo mysql_error(); 
    $_SESSION['message2'] = '<div id="message_box2"><div class="boxclose" id="boxclose" onclick="this.parentNode.parentNode.removeChild(this.parentNode);"></div><h23>Oooops!</h23><p>The Username and Password Combination do not match. Please try again.</p> </div>'; 
    header("location:../index.php"); 
} 

ob_end_flush(); 
+3

들여 보내주십시오. 내 눈은 피가 나고. 코드를 좁히면, 유일한 문제가 쿼리에있는 경우 전체 프로그램을 볼 필요가 없습니다. –

+2

코드가 SQL-Injection에 취약합니다. 더 이상 사용되지 않는 mysql_ * 사용을 중지하고 대신 mysqli_ * 또는 PDO를 사용하십시오. – Naruto

+0

죄송 합니다만, MySQL에 정말 새로워서 mysqli에 어떻게 적응하고 주사를 예방할 수 있는지 보여주십시오. –

답변

0

는 : nbInTable1는 == 0, nbInTable1 == 1은 하나의 사용자를 의미 nbInTable1을 이러한 사용자를 의미합니다 아마> (1) nbTable2와 동일하게 기본 의 무결성 문제를 의미합니다.

그리고 사용자가 어떤 테이블에 있는지 지금 신경 쓰지 않는다면 두 값을 추가하기 만하면됩니다. sum == 0은 그러한 사용자가 없음을 의미하고, sum> 0은 사용자가 테이블 중 하나에 있음을 의미합니다.

+0

이 의견으로 추가되었습니다. 나는 다른 사람들의 보안 문제에 완전히 동의합니다. 프레임 워크를 사용하지 않더라도 몇 가지 예방 조치를 취해야합니다. 적어도 해시 된 패스워드를 DB에 저장한다 (예를 들어 sha1()). https 연결이 없으면 암호 클라이언트 쪽을 암호화하십시오. 종종 js 변수에 타임 스탬프를 포함하여 loginform serverside를 구성한 다음 onsubmit 이벤트에 사용자 입력 + 타임 스탬프를 연결하여 암호화합니다 (클라이언트와 서버 간 전송 값은 결코 같지 않고 스니핑되지 않습니다). 그런 다음 serverside, 나는 DB에 동일한 concat + 해시 비교 비밀 번호를 저장 않습니다. – fpierrat

0

간단한 당신이 두 개의 별도의 검사를 수행하지 않는 이유 좋은 이유를 볼하십시오. 테이블 이름을 인수로 사용하여 함수로 만들고 코드를 다시 사용할 수 있습니다. 다음과 같은 것 :

function getUserCount($table,$username,$password) 
{ 
    $query = "SELECT username 
      FROM $table 
      WHERE username = '$username' AND password = '$password'"; 
    $result = mysql_query($query); 
    return mysql_num_rows($result); 
} 

(테스트되지 않음) 그러나 시스템이 정말로 안전 할 것이라면 보안에 대한 더 많은 조언을 찾아보십시오. 또한 PHP의 mysql 확장은 더 이상 사용되지 않습니다.

관련 문제