2010-05-10 42 views
1

我還有一個關於網絡編程的問題。爲什麼我每次都收到錯誤消息,我已經發送了標題

我編寫了一個登錄腳本,但每當我嘗試登錄它時說我已經發送了標題信息。

這裏有2個文件:

<?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; - ''! – 2010-05-10 17:21:29

+0

我應該如何阻止有人可以'; DROP TABLE users_photoadminsite; - '?? – mikepenz 2010-05-10 17:24:09

+0

您的身份驗證方案根本不安全,您應該存儲用戶名和密碼或某種類型令牌的散列,並在每個請求上進行驗證。 – mmattax 2010-05-10 20:45:02

回答

3

在將任何輸出發送到瀏覽器之前,必須先設置Cookie和標題。嘗試將您的登錄腳本移動到頁面頂部。您可能還需要考慮清理查詢以防止惡意活動。

+0

在我的陳述之前沒有輸出。你可以在上面的代碼中看到它。嗯,不知道錯誤在哪裏。 – mikepenz 2010-05-10 17:23:27

+0

@mikep - 你分離你的PHP代碼,並在中間輸出。這會導致標題被髮送到瀏覽器。 – thetaiko 2010-05-10 17:29:52

1

您可能在該php文件的開頭有一個空行。也許PHP開始之前的空間腳本

0

看到第60,61和63行,以及他們如何來到之後你所有的HTML?把它們放在前面。

0

當PHP表示它已經發送了標頭時,這意味着某些文本已經由腳本(或稱爲它的腳本)輸出。這包括任何和所有錯誤消息。

當PHP輸出第一段文本時,它會發送它的標題,但不會發送。爲了獲得HTTP cookie(部分頭文件)的設置,必須在輸出任何文本之前發送cookie。

您可以做的是使用ob_startob_end_flush以及其他輸出控制功能啓用輸出緩衝。

您還可以做的事情是將php.ini variable設置爲在輸出文本時自動發送cookie標頭。

0

如果你的php.ini中沒有啓用output_buffering,你會得到這個錯誤,因爲它會馬上開始發送html。你需要編輯你的php.ini來啓用輸出緩衝。

0

這是在Windows上嗎?檢查BOM。在記事本中打開它並將其另存爲ANSI以查看它是否有幫助。

+0

是的,我在windwos工作。但什麼是BOM? – mikepenz 2010-05-10 17:22:56

+0

BOM是醜陋的東西 - 一些文本編輯器放在utf textfile前面的一些字符。您應該可以選擇在文本編輯器中打開/關閉它。 http://en.wikipedia.org/wiki/Byte_order_mark – marianboda 2010-05-10 19:24:36

+0

如果您在Windows上將文件保存爲UTF-8或Unicode,則BOM會添加到開頭。這是肉眼不可見的,但它仍然在PHP中產生輸出。只需在記事本中打開文件,單擊另存爲,然後選擇「ANSI」作爲編碼。這應該刪除BOM。 – 2010-05-10 19:33:59

相關問題