2010-05-10 2 views
1

웹 프로그래밍에 대한 또 다른 질문이 있습니다.왜 내가 헤더를 이미 보냈는지 오류 메시지를받는 이유

로그인 스크립트를 프로그래밍했지만 로그인 할 때마다 헤더 정보를 이미 보냈다 고합니다.

<?php 
if($_GET['logout'] == 1) { 
    setcookie('authorized', 1, time()-3600);  
} 
?> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title>Login - photoAdminSite</title> 
</head> 

<style type="text/css"> 
    body { 
    text-align: center; 
    font-family: helvetica; 
    } 

    #loginForm { 
    padding: 1em; 
    background: #e3e3e3; 
    width: 260px; 
    margin: 3em auto 0; 
    text-align: left; 

    } 
</style> 

<body> 

<div id="loginForm"> 
<form method="post" action="confirm_login_credentials.php"> 

<h2>LOGIN</h2> 
<p>Username: <input type="text" name="username" /></p> 
<p>Password: <input type="password" name="password" /></p> 
<p><input type="submit" value="Login" name="submit" /></p> 

</form> 
</div> 
</body> 
</html> 





<?php 
$username = $_POST['username']; 
$password = $_POST['password']; 

require 'database.php'; 

$q = "SELECT id FROM users_photoadminsite WHERE user_name = '$username' AND password = '$password'"; 

$result = $mysqli->query($q) or die(mysqli_error()); 

if (mysqli_num_rows($result) == 1) { 
    setcookie('authorized', 1, 0); 
    header("Location: index.php"); 
} else { 
    header("Location: login.php"); 
} 
?> 

내가 유용한 답변 정말 행복 할 것 : 여기

는이 개 파일입니다.

+0

아무도 사용자 이름을 선택하지 않기를 바랍니다 : ''; DROP TABLE users_photoadminsite; - ''! –

+0

누군가가 이걸 어떻게 막아야합니까 '; DROP TABLE users_photoadminsite; - '?? – mikepenz

+0

인증 체계가 안전하지 않습니다. 사용자 이름과 암호 해시 또는 일부 유형의 토큰을 저장하고 각 요청에 대해 유효성을 검사해야합니다. – mmattax

답변

3

출력이 브라우저로 보내지기 전에 쿠키와 헤더를 설정해야합니다. 로그인 스크립트를 페이지 상단으로 옮겨보십시오. 악의적 인 활동을 방지하기 위해 질의의 위생을 고려할 수도 있습니다.

+0

내 진술 전에 출력이 없습니다. 위의 코드에서 확인할 수 있습니다. 흠 어디서 실수인지 모르겠다. – mikepenz

+0

@mikep - PHP 코드를 분리하여 중간에 출력합니다. 이렇게하면 머리글이 브라우저로 전송됩니다. – thetaiko

1

PHP 파일의 시작 부분에 빈 줄이있을 수 있습니다. 어쩌면 PHP 스크립트를 시작하기 전의 공간

0

60, 61, 63 행을 참조하십시오. 그리고 그 방법은 이후 HTML 전체입니까? 그 (것)들을 대신에 앞에 두십시오.

0

PHP가 이미 헤더를 보냈다고 말하면 스크립트 (또는 스크립트를 호출 한 스크립트)에서 일부 텍스트가 이미 출력되었음을 의미합니다. 여기에는 모든 오류 메시지가 포함됩니다.

첫 번째 텍스트가 PHP에 의해 출력 될 때 헤더는 보내지 만 전에는 보내지 않습니다. HTTP 쿠키 (헤더의 일부)를 설정하려면 텍스트를 출력하기 전에 쿠키를 보내야합니다.

ob_startob_end_flush 및 기타 출력 제어 기능을 사용하여 출력 버퍼링을 활성화 할 수 있습니다.

당신이 할 수있는 일은 php.ini variable이 텍스트를 출력 할 때 자동으로 쿠키 헤더를 보내도록 설정하는 것입니다.

0

php.ini에서 output_buffering을 사용하지 않으면 html을 즉시 전송하기 시작하므로이 오류가 발생합니다. 출력 버퍼링을 사용하려면 php.ini를 편집해야합니다.

0

Windows 버전인가요? BOM을 확인하십시오. 메모장에서 열어 ANSI로 저장하여 도움이되는지 확인하십시오.

+0

예 저는 윈드 우스에서 일합니다. 그러나 BOM은 무엇입니까? – mikepenz

+0

BOM은 못생긴 것입니다 - 일부 텍스트 편집기가 utf 텍스트 파일 앞에 놓는 문자입니다. 텍스트 편집기에서이 기능을 켜거나 끌 수있는 옵션이 있어야합니다. http://en.wikipedia.org/wiki/Byte_order_mark – marianboda

+0

Windows에서 파일을 UTF-8 또는 유니 코드로 저장하면 BOM이 처음에 추가됩니다. 육안으로는 볼 수 없지만 PHP에서는 여전히 출력을 생성합니다. 메모장에서 파일을 열고 다른 이름으로 저장을 클릭하고 인코딩으로 "ANSI"를 선택하십시오. 그러면 BOM이 제거되어야합니다. –

관련 문제