如何让php网站更安全

时间:2016-09-24 08:25:21

标签: php

我发现了这个tutorial但是现在我甚至无法访问我的php页面。

索引页面效果很好。我有通过index.php文件提取的初始页面:

<?php

    include ("home.html");

?>

这很好用。

但是当我尝试打开此页面时:

<a href="our_projects.php" id='text'>

导致此错误:

禁止

You don't have permission to access /our_projects.php on this server.

Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.

由于我添加的设置:

# In case there is no PHP, deny access to php files (for safety)
<IfModule !php5_module>
    <FilesMatch "\.(php|phtml)$">
        Order allow,deny
        Deny from all
    </FilesMatch>
</IfModule>
# the following should be added if you want to parse .php and .phtml file as PHP
# .phps will add syntax highlighting to the file when requesting it with a browser
<IfModule php5_module>
    AddType text/html .php .phtml .phps
    AddHandler application/x-httpd-php .php .phtml
    AddHandler application/x-httpd-php-source .phps
</IfModule>

我的问题是如何防止外部下载php文件,但同时允许浏览器显示内容。

我不希望某人读取PHP文件的主要原因是无法将一些安全数据(如密码等)读取到数据库等。

此外,我想在地址行中删除显示.php。我找到an answer,但地址行仍然在路径中包含.php。

1 个答案:

答案 0 :(得分:1)

我个人会说这样的安全问题是无用的。在我建立的众多网站中。我从来没有使用过这些。

我知道防止人们进入你不希望他们去的地方的最佳方法是将所有课程集中到一个文件夹中并拒绝从外部访问所述文件夹。然后,您使用根目录中的一个文件(index.php左右)通过请求的URL调用所述文件。这也可以为您提供用户友好的URL。

一些针对对象的编码应该解决大多数安全问题。

我会在这里给你一个这样一个壮举的实例:

您的根文件:

<强> htaccess的:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
#Request index.php and put a GET parameter 'request'
RewriteRule ^(.+)$ index.php?request=$1 [QSA,L]

然后,从您的 index.php 中添加您的主类和路由

  require_once 'application/main.php';
  require_once 'application/routing.php';

您无法访问的文件:

将这些放在子目录中,例如/ application / 的 htaccess的:

#This will deny access from any outside source.
#You reach these files through index.php
deny from all

主要课程

 class main
  {
    public $someVar;

    public function setSomeVar(){
      $this->someVar = "I can get into the main class,
                        and shall use it for global functions!";
    }
}

请求的网页类:home.php

class home extends main
{
  public function renderTemplate(){
    //You can reach the main's functions from here
    //You could create a rendertemplate function in the main class
    //And set the template from this function for example.
     $this->setSomeVar();
     echo $this->someVar();
   }
}

然后,最重要的是,您将拥有路由

  $noRequest = true;
  $params    = array();
  $class;
  //all routes go from your index.php's location
  $filepath = "application/";
  //Get the requested class and parameters
  $getRequest = explode('/', $request->get('request'));
  //Load homepage if no special request is made
  if( $getRequest[0] == '' ) {
    $page = "home";
  } else {
    //get the class
    $page = rtrim($getRequest[0], '/');
    //Get the called function
    $getFunction = isset( $getRequest[1] ) ? $getRequest[1] : false;
  }
  //Include the requested class. Otherwise, give back a 404
  if( file_exists($filepath . $page . ".php") ) {
    //include the class
    require_once $filepath . $page . ".php";
    //set the class object
    $class = new $page();
  } else {
    header($_SERVER["SERVER_PROTOCOL"] . " 404 Not Found", true, 404);
    //TODO:create 404 class
    echo "Page not found";
    exit();
  }

  //There is a function being called, go get it!
  if( $getFunction ) {
    //Make sure you've gotten the parameters as well
    $paramCount = count($getRequest);
    //skip 0 and 1, as those are the class and function
    for( $i = 2; $i < $paramCount; $i++ ) {
      $params[] = $getRequest[$i];
    }
    //Check if method exists
    if( method_exists($class, $getFunction) ) {
      //Always echo the function for returns. This is made for AJAX calls.
      echo call_user_func_array(array(
              $class,
              $getFunction
      ), $params);
    } else {
      die( "function $getFunction was not found in $page" );
    }
    exit();
  } else {
    //No function being called, this has to be a pageload;
    //Don't echo the function because of the templates
    $class->renderTemplate();
  }

- 以上是MVC如何做到这一点的基本形式,它是我一直使用的愚蠢版本。基本上,这会为您的网站提供一个单一的入口点(index.php)并禁止其他一切。这样,没有人可以做任何你的路由不允许的事情。通过一个稳定的class->function路由系统,没有人可以疯狂地浏览你的网址,寻找漏洞。

从这一点开始,您的网址将如下所示: http://website.com/page2将成为班级page2,并在班级内做任何你想做的事。

http://website.com/page2/functionOfPage2Class可用于ajax调用。

旁注: 这样,您也可以通过简单地使用$this->Myfunction();来调用模板中的所述函数类。

现在,我不打算说这是最好的方法或者你得到的最佳答案。我要说的唯一一件事是,这与我迄今为止的工作大致相同,据我所知,我的客户都没有被黑客入侵。

如果我做错了或有任何问题,请告诉我。

您实际上并不需要所有这些类

我认为重要的是要提到你实际上不必使用我给你的这个结构。它只是一个例子。显然,只要您通过index.php路由任何想做的事情,就可以做任何你想做的事情。这就是示例脚本的全部内容。

长话短说:您将所有php文件放入子文件夹并拒绝所有访问权限。