【问题标题】:PHP Code protection on Apache results in permission forbiddenApache 上的 PHP 代码保护导致权限被禁止
【发布时间】:2016-03-08 08:41:02
【问题描述】:

我有一个运行 apache 的 Raspberry Pi 设备。我已经尝试为一个小型登录页面实现代码,该页面具有 MySQL 数据库支持的内部制作的会话管理。

这里是 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>

这里的一个大问题是当我尝试提供我得到的凭据时

您无权访问此服务器上的 /include/process_login.php。

我的包含目录有 .htaccess 文件并在其中

Order Deny,Allow
Deny from All

而且我无法访问 process_login.php(它没有 HTML 内容 - 它的工作只是检查登录并在提供良好凭据的情况下重定向)

在这个链接上(这是我能找到的类似问题的最接近的地方) protect php includes (with htaccess?) 它说:

所以,简而言之: 你可以在你的 PHP 包含目录中放置一个 .htaccess 并拒绝所有。 PHP 的 include 指令不通过 Apache,所以它不会在意。 理想情况下,您甚至根本不将 PHP 包含目录放在文档根目录下。 您不能对 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 指令如何确定需要显示的内容)

有人可以向我解释一下,我的逻辑在 Apache 上的 php 文件保护和引擎这一主题上失败了,以及我为什么会生成一个不希望出现的禁止页面。 p>

【问题讨论】:

  • 您的表单操作是include/process_login.php,这意味着当表单提交时,浏览器将向该地址发送请求——但您拒绝了对任何内容的所有 HTTP 访问在那个目录里面,所以你当然会在这里得到一个 403。
  • “但人们似乎在 php 中使用 HTML ?” – 这让您感到惊讶 – 特别是考虑到您在显示的代码中完全是这样做的已经 …? php.net/manual/en/language.basic-syntax.phpmode.php
  • 这让我感到惊讶,因为据说由于 AddHandler 指令,客户端只能看到 echo 输出,但我们还没有使用 echo 命令输出我们的 HTML,它仍然对我们可见。那么我怎样才能修复它 403 却让 process_login 不可见/不可访问,这可能吗?
  • 感谢我为你投票的 URL,它有助于理解。所以基本上我们转义了 PHP 并且 HTML 部分被 PHP 引擎忽略了。谢谢!

标签: php apache .htaccess security


【解决方案1】:

如果您使用的是 apache v2.4,请尝试在 Apache 的所有 *.conf 文件中进行更改:

代替

Order deny,allow
Deny from all

(从 V2.4 开始不推荐使用 Order allow、deny 和 Allow from all)

放:

 Require all denied

如果您使用的不是 Apache V2.4 或更高版本,则可能是您的文件/文件夹权限有问题。打开终端,导航到 /include/process_login.php 之前的文件夹。 (CD /yourwebPath/) .

然后,做一个

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

【讨论】:

  • drwxr-xr-x 3 root root 4096 Dec 2 23:01 include 我认为这不是问题,因为包含目录中缺少组上的 w 标志。这是当前的 ls -la
  • 不起作用 - 在 RPi Apache 上是 2.2 并且 chmod 不能解决问题。我下令拒绝,允许,而不是相反
猜你喜欢
  • 2021-04-28
  • 1970-01-01
  • 2014-10-30
  • 2022-01-18
  • 2014-04-10
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多