2010-12-01 5 views
4

웹 사이트에 대한 액세스를 허용하는 암호를 묻는 아주 간단한 PHP 로그인을 개발하기 시작했습니다. 또한 사용자가 브라우저 창을 닫을 때까지 계속 액세스 할 수 있도록 쿠키를 만듭니다. 내가 쿠키를 확인 각 페이지의 상단에쿠키로 간단한 PHP 로그인

:

<?php 

    if(!isset($_COOKIE['authorised']) || ($_COOKIE['authorised'] != 'true')) 
    { 
     include('login.php'); exit; 
    } 

?> 

가 나는 종료하고 로그인 폼이 표시되지 않는 경우 :

<?php 

    function pageURL() 
    { 
     $pageURL = 'http'; 
     if ($_SERVER["HTTPS"] == "on") 
     { 
      $pageURL .= "s"; 
     } 
     $pageURL .= "://"; 
     if ($_SERVER["SERVER_PORT"] != "80") 
     { 
      $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"]; 
     } 
     else 
     { 
      $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"]; 
     } 
     return $pageURL; 
    } 

    $pageRedirect = pageURL(); 

    if(isset($_POST['password']) && ($_POST['password'] == 'qwe123')) 
    { 
     setcookie('authorised', 'true'); header("Location:$pageRedirect",303); 
    } 
    else 
    { 
     include('noaccess.php'); exit; 
    } 

?> 
<form action="<?php echo pageURL(); ?>" method="post"> 
<input type="password" name="password" /> 
       <input type="submit" title="I agree" value="I agree" name="submit" /> 
      </form> 

현재 PHP는에서이다 이전 경고 페이지에서 사이트에 동의해야 할 때 간단한 양식으로 작동하도록 수정하려고합니다. 예를 들어 'qwe123'과 같이 암호를 입력하면 쿠키가 생성 된 다음 다시 리디렉션됩니다. 페이지가 있지만 쿠키 때문에 액세스 할 수 있습니다. 그들이 잘못하면 다른 페이지가 포함되고 종료됩니다.

누군가가 도와 줄 수 있습니까? 감사합니다

답변

10

"인증"과 같은 것을 클라이언트 측 쿠키에 저장하지 마십시오. 엄청나게 불안해. 사용자는 쿠키의 내용을 수정할 수 있습니다.이 경우 브라우저 설정에서 쿠키를 찾은 다음 편집하여 "인증 됨"을 true로 설정할 수 있습니다. 그러면 사용자 이름이나 암호없이 로그인됩니다.

PHP's session management 기능을 살펴보십시오. 세션을 생성하고 클라이언트 측이 아닌 보안 정보 서버 측을 저장해야합니다.

세션을 사용하는 예는 다음과 같습니다.

<?php 
session_start(); 

$secretpassword = 'qwert1234'; 
$secretusername = 'foobar'; 

if ($_SESSION['authenticated'] == true) { 
    // Go somewhere secure 
    header('Location: secure.php'); 
} else { 
    $error = null; 
    if (!empty($_POST)) { 
     $username = empty($_POST['username']) ? null : $_POST['username']; 
     $password = empty($_POST['password']) ? null : $_POST['password']; 

     if ($username == $secretusername && $password == $secretpassword) { 
      $_SESSION['authenticated'] = true; 
      // Redirect to your secure location 
      header('Location: secure.php'); 
      return; 
     } else { 
      $error = 'Incorrect username or password'; 
     } 
    } 
    // Create a login form or something 
    echo $error; 
    ?> 
<form action="login.php"><input type="text" name="username" /><input type="text" name="password" /><input type="submit" value="login" /></form> 
<?php 
} 

그것은 꽤 추한 예,하지만이 (물론, secure.php 스크립트도 확인해야 사용자가 이미 로그인되어있는 경우, 보안 물건을 할 그것을

  • 의 고기를 커버 사용자가 사용자가 로그인하지 않은 경우
  • )에 기록되어 있지만,이 양식을 제출 한 것으로, 사용자 이름/암호 잘못된 경우 오류 messagee을 설정
    • 자신의 세부 사항 확인
    • ,
    • 올바른 사용자 이름/암호,
    • 표시를 설정 한 경우, 장소를
  • 표시 오류 메시지를 확보하기 위해 보낼 경우 로그인 폼

당신은 어떤 다른 출력을 보내기 전에으로 session_start()를 실행; 이것은 클라이언트 측에 세션 쿠키를 저장하는데, 이는 클라이언트 측에 식별 ​​번호만을 저장한다. 다른 모든 데이터는 서버 측에 저장되므로 사용자가 수정할 수 없습니다.

httponly (쿠키를 통해 javacript에 액세스하지 못하도록하고 XSS 공격을 방지) 및 보안 (SSL을 통해 쿠키 만 전송)을 비롯하여 보안을 강화하기 위해 설정할 수있는 몇 가지 매개 변수가 있습니다. 가능한 경우 활성화해야합니다.

+0

보안이 필요하지 않습니다. – Cameron

+4

보안이 필요하지 않은 경우 왜 암호를 묻는 중입니까? PHP가 내가 제안한대로 세션을 관리하게하는 것이 더 안전 할뿐만 아니라 더 쉽습니다. –

+0

일정 기간 동안 특정 사람 만 허용하는 것입니다. 쿠키를 처음 만들 때 암호가 없다면 누군가가 쿠키의 이름을 모르는대로 쿠키를 어떻게 바꿀 수 있는지 알지 못합니다. 저는 세션에서 그 모든 것을 다 갖고있는 것이 아니라, 코드의 예를 보여 주지만 세션을 통해 보여줍니다. 감사. – Cameron

0

단지 양식을 암호를 확인한 페이지에 제출하면 정상적으로 작동합니다.

그러나 $_SERVER["REQUEST_URI"];을 좀 더 구체적인 페이지로 변경해야 할 수도 있습니다.이 페이지는 현재 현재있는 페이지 (양식이 제출 된 페이지) 일뿐입니다.

+0

폼이 제출 될 때까지 PHP가 실행되지 않도록해야합니다. 그렇지 않으면 else가 곧바로 실행됩니다. – Cameron

+0

아마도 if 및 else 문을 둘러싼 제출에 간단한 isset()을 사용하고 있을까요? 나를 위해 일합니다. 모든 이의 제기 ... – Cameron

+0

그래, 사용자가있는 페이지가되도록하고 싶습니다. 아이디어는 모든 페이지가 올바른 패스워드를 입력했는지 확인한 후 다시 포스트 백하고 사이트에서 싫어하는 더티 로그인 폼으로 이동하지 않고보고 싶은 페이지로 리디렉션하는 것입니다 . – Cameron