2015-12-03 14 views
0

我有一個運行Apache的Raspberry Pi設備。我試着實現了一個小型登錄頁面的代碼,該頁面有一個由MySQL數據庫支持的內部創建的會話管理。對Apache的PHP代碼保護導致權限被禁止

這裏是index.php文件

<?php 
include_once 'include/dbmember.php'; 
include_once 'include/dblogin_attempts.php'; 
include_once 'include/session.class.php'; 
include_once 'include/functions.php'; 


$session=new session(); 
$session->start_session("SMARTHOMESESSION",false); // TODO CHANGE WHEN SSL HITS 

// No need to check login here 
?> 
<!DOCTYPE html> 
<html> 
<head> 
    <title>Smart Home Login: Credentials first please</title> 
    <!-- Need to import styles/main.css and find some css --> 
    <!-- http://designscrazed.org/css-html-login-form-templates/ --> 
    <link rel="stylesheet" href="styles/loginform.css" type="text/css" /> 
    <script type="text/javascript" src="js/sha512.js"></script> 
    <script type="text/javascript" src="js/forms.js"></script> 
</head> 
<body> 
<?php 
if (isset($_GET['error'])) 
{ 
    echo '<p class="error">Error Logging In!</p>'; 
} 

?> 
<div class="login-block"> 
<form action="include/process_login.php" method="post" name="login_form"> 
    Email: <input type="text" name="email" placeholder="Email" /> 
    Password: <input type="password" name="password" id="password" placeholder="Password" /> 
    <input type="button" value="Login" onclick="formhash(this.form,this.form.password);" /> 
</form> 
</div> 

<?php 
if (check_login_status($mysql_member)) 
{ 
    $user=preg_replace("/[^0-9a-zA-Z_\-]+/", '', $_SESSION['username']); 
    echo '<p>Currently logged in as '. htmlentities($user) . '</p>'; 
    echo '<p>Do you want to change user? <a href="include/logout.php">Log out</a>.</p>'; 
} 
else 
{ 
    echo "<p>Currently logged out.</br>Please login to Continue</p>"; 
} 
?> 
</body> 
</html> 

一個很大的問題,這裏是當我嘗試提供憑據我得到

您沒有權限訪問/包括/的process_login .php在這臺服務器上。

我包括目錄有.htaccess文件,並在其中

Order Deny,Allow 
Deny from All 

,我無法訪問process_login.php(沒有HTML內容 - 它的工作就是檢查登錄,如果良好的重定向提供憑據)

在此鏈接(這是接近我可以得到一個類似的問題) protect php includes (with htaccess?) 它說:

因此,簡而言之: 您可以在您的PHP包含目錄中將.htaccess與Deny全部放在一起。 PHP的include指令不通過Apache,所以它不會在意。 理想情況下,您甚至不會將您的PHP include目錄放在您的文檔根目錄下。 你不能這樣做JavaScript,因爲JavaScript訪問通過Apache(就像.html,.png等訪問)。

我這樣做(設置爲一個動作包括目錄,但失敗!) 我該怎麼解決呢?

我的Apache配置文件包含目錄

<Directory /var/www.website.com/include> 
AllowOverride All 
</Directory> 

也對我有 protected_pa​​ge.php嵌入HTML。

另外,我怎麼會使用,因爲我讀了一個地方,在Apache的PHP直接傳遞給PHP引擎,我們只得到回聲輸出 但人們似乎在PHP內使用HTML? (是,即使真的嗎?在這種情況下怎麼做AddHandler指令將斷定哪些需要顯示)

在我的邏輯是沒有我的PHP文件保護和發動機的Apache和如何主題誰能給我解釋一下來,我正在生產禁止的頁面,其中一個不是預期的。

+0

您的表單動作是'包括/ process_login.php',這意味着當表單提交_The browser_將請求發送到該地址 - 但你已經否認了所有HTTP訪問該目錄內的任何內容,所以當然你會在這裏得到403。 – CBroe

+1

_「但是,人們似乎可以用PHP內的HTML?」 _ - 以及有關什麼驚喜你 - 特別是考慮到你正在做的正是自己在你的代碼中已經顯示出...? http://php.net/manual/en/language.basic-syntax.phpmode.php – CBroe

+0

我很驚訝,因爲有人說,是因爲AddHandler指令的客戶看到剛剛回聲輸出,但我們還沒有輸出我們的HTML與回聲命令,它仍然可見我們。那麼我該如何解決這個問題,並讓process_login不可見/可訪問,這是可能的? –

回答

0

如果您使用的是Apache V2.4,嘗試在Apache中的所有* conf文件更改此:

而不是

Order deny,allow 
Deny from all 

(訂購允許,拒絕,並允許所有的自V2起棄用。4)

地說:

Require all denied 

如果你不使用V2.4或Apache更高,那麼它與你的文件/文件夾權限的問題。打開一個終端,導航到您的/include/process_login.php之前的文件夾。 (CD/yourwebPath /)。

然後,做一個

sudo chmod 775 include -R 
sudo chown -R root:root include 
+0

drwxr-XR-×3根根4096 12月2日23:01包括 因爲剛剛在該組的W標誌缺少對包括目錄,我不認爲這就是問題。這是當前LS -la –

+0

編輯我的答案 – SamyQc

+0

不工作 - 在RPI Apache是​​2.2和chmod不能解決問題。 我下令拒絕,允許,而不是verca –