2012-01-26 4 views
0

내 웹 사이트에는 사용자 로그인 시스템이 있습니다. 로그인하면 자신의 프로필 페이지로 이동합니다.이 프로필 페이지는 해당 사용자가 사용하지 않은 것입니다. 문제는 사용자가 uid를 변경하고 다른 사용자의 프로필로 이동하고 해당 사용자로 행동하는 것을 막을 수있는 방법이 없었기 때문입니다. 이를 막기 위해 사용자의 uid가 URL의 uid가 아닌 경우 자신의 프로필로 리디렉션되는 URL/MySQL 시스템을 구현했습니다. 여기서 문제는 프로필에 URL을 변경하는 양식이 있으므로 uid 쿼리를 제거하면 uid가 없어 페이지가 생성되어 프로필로 이동하고 양식 입력을 무시한다는 것입니다.사용자를 자신의 프로필 페이지로 제한

코드는 다음과 같습니다

<?php 
mysql_connect ('x', 'x', 'x'); 
mysql_select_db ('x'); 

if(isset($_COOKIE['wd_un'])) { 
    $un = $_COOKIE['wd_un']; 
    $pass = $_COOKIE['wd_pass']; 

    $cook = "SELECT * FROM x WHERE username = '$un' AND password = '$pass' limit 1"; 
    $cookr = mysql_query($cook) or die (mysql_error()); 
     if(mysql_num_rows($cookr) == 0) { 
      header ("Location: index.php"); 
     } 
     else { 
      $urluid = mysql_real_escape_string($_GET['uid']); 
      $uidcheck = "SELECT * FROM x WHERE username = '$un' AND password = '$pass'"; 
      $uidcheckq = mysql_query($uidcheck) or die (mysql_error()); 
      while($rcu = mysql_fetch_assoc($uidcheckq)) { 
       $dbuid = $rcu['uid']; 
         if($urluid != $dbuid) { 
          header ("location: home.php?uid=$dbuid"); 
         } 
         else { 
         } 
      } 
     } 
    } 
mysql_close(); 
?> 

작업 주위에 있습니까?

+1

세션을 통해 누구인지 알면 왜 URL 매개 변수가 있습니까? –

답변

5

여기에있는이 코드 블록은 불량으로 가득합니다.

먼저 쿠키에 사용자 암호를 절대로 저장하지 않아야합니다. 쿠키에 세션 ID 만 저장하고 나머지 세션 데이터를 사용자 ID 및 기본 액세스 권한이 필요한 다른 항목이 포함 된 세션 테이블에 저장해야합니다. 이 테이블에도 있지 않아.

이제 URL에 user_id를 사용하여 상호 참조로 인해 사람들을 안전하게 보호 할 수 있습니다.

물론 쿠키 ID를 기반으로 가져온 세션 테이블에서 mysql 결과를 참조하십시오. 분명히 그들이 일치하지 않으면 그들을 부팅합니다.

리디렉션 양식의 경우 게시를 처리하는 방법을 다시 구성해야합니다. 프로필 페이지는 항상 쿠키의 세션 ID와 관련된 프로필 만 가져올 수 있습니다. 그러면 URL에 대한 의존성이 제거되고이 문제를 완전히 해결할 수 있습니다.

또한 입력 내용을 살균하려면 mysql_real_escape_string()을 살펴보십시오. 맹목적으로 mysql 쿼리에 대한 쿠키 정보를 받아들이는 것은 엄청나게 위험합니다. 당신이 실제로 당신의 위치에있는 거대한 주입 구멍을 남기는 것을 조준하면 않는 한.

+0

세션을 시작하고 세션 ID가있는 쿠키를 설정하고 사용자 이름, ppassword 및 uid를 세션 테이블에 저장하고 세션 테이블의 사용자 이름과 비밀번호가 일치하는 경우 쿠키를 사용하여 테이블에서 세션을 조회합니다 user_db 테이블에서 uid가 세션 테이블의 uid와 동일한 데이터베이스에서 정보를 선택하여 자신의 페이지를로드 하시겠습니까? – AviateX14

+0

아닙니다. 사용자 이름과 비밀번호를 사용하여 로그인하면 고유 한 ID를 만들 수 있습니다. 이것은 하나입니다 : http://php.net/manual/en/function.uniqid.php. 그런 다음 id를 쿠키에 저장합니다.그런 다음 세션 테이블에서 해당 ID를 사용자 ID로만 저장합니다. 비밀번호 없음. 페이지로드시에는 쿠키에있는 id와 관련된 프로파일을 가져 오거나 여전히 해당 메소드를 사용하고 있다면 URL에있는 user_id로 쿠키와 관련된 user_id를 상호 참조 할 수 있습니다. 보안 걱정이있는 경우 페이지로드시마다이 쿠키 id를 새로 고치고 재설정 할 수 있습니다. –

+0

또한 session이라는 단어를 php의 session()과 혼동하지 마십시오. 실제로 어떤 종류의 $ _SESSION var도 설정할 필요가 없습니다. 귀하의 의견은 패스워드를 확인할 필요가 없다는 점을 제외하면 대부분 정확합니다. 이 경우 쿠키 종류의 고유 ID는 페이지로드시 새로 고치는 고유 한 고유 ID가 추측하기가 거의 불가능하므로 그 역할을합니다. 사용자가하는 일은 쿠키 ID와 관련하여 발견 된 user_id를 기반으로 프로파일을 가져 오는 것입니다. 사용자가 쿠키 세트를 가지고 있고 그 ID가 세션 테이블에서 발견되면 사용자는 안전해야합니다. 필요한 경우 타임 스탬프를 포함 할 수 있습니다. –

1

URL에서 사용자를 추출하는 대신 사용자를 식별하려면 쿠키 ID를 사용해야합니다. cookieID가 UserID와 일치하지 않으면 자신의 프로필로 리디렉션합니다.

기본적으로 개인 정보 용 사용자 ID를 전달하는 데 URL을 사용하지 마십시오. 항상 쿠키를 참조합니다.

사용자를 식별하기 위해 URL 문자열에만 의존하면 설명 된 사용성 문제 위에 거대한 보안 구멍이 있습니다.

+0

좋아, 쿠키로 변경 하겠지만 쿠키를 사용하여 사람을 자신의 프로필로만 제한하려면 어떻게해야합니까? – AviateX14

+0

기본적으로 .. userid == cookieID 그래서 모든 페이지는 자신의 정보 만 보여줍니다. 리디렉션이 필요하지 않습니다. yo0u가 게시 한 내용을 기반으로 URL 문자열에 사용자 ID를 추가 할 필요가 없습니다. 쿠키 만 읽으십시오. – Scott

관련 문제