web-dev-qa-db-fra.com

empêcher l'accès direct au fichier php

J'ai un fichier php dire "check.php" sur mon site et il est exécuté lorsqu'un formulaire est soumis.

disons que mon site web est "myweb.com" et que le fichier php est dans un répertoire "PHP" 

Je veux empêcher l'accès direct au fichier "check.php" c'est-à-dire si quelqu'un tape l'url "myweb.com/PHP/check.php", le fichier php ne doit pas être exécuté il devrait plutôt renvoyer un message d'erreur.

J'ai essayé d'empêcher l'accès en définissant une règle dans .htaccess, mais cela bloque le php même lorsque j'essaie de soumettre le formulaire.

règle .htaccess: 

RewriteEngine on 
RewriteCond %{THE_REQUEST} \.php[\ /?].*HTTP/ 
(.*)\.php$ /index.html [L] 

Y a-t-il un moyen possible de le faire?

8
It Assistors

Vous pouvez le faire avec PHP

<?php
    /* at the top of 'check.php' */
    if ( $_SERVER['REQUEST_METHOD']=='GET' && realpath(__FILE__) == realpath( $_SERVER['SCRIPT_FILENAME'] ) ) {
        /* 
           Up to you which header to send, some prefer 404 even if 
           the files does exist for security
        */
        header( 'HTTP/1.0 403 Forbidden', TRUE, 403 );

        /* choose the appropriate page to redirect users */
        die( header( 'location: /error.php' ) );

    }
?>
17
RamRaider

Placez ce code en haut de check.php:

if(!isset($_SERVER['HTTP_REFERER'])){
    // redirect them to your desired location
    header('location:../index.php');
    exit;
}

Si l'utilisateur accède à check.php en saisissant directement l'URL, il les redirigera vers l'emplacement de votre choix.

4
Westly Tanbri

Essayez ceci dans Root/.htaccess:

RewriteEngine on


RewriteCond %{REQUEST_METHOD} !^POST$
RewriteRule ^php/check.php$ - [NC,R=404,L]

Cela retournera 404 non trouvé si check.php n'est pas utilisé par la méthode post-formulaire.

3
starkeen

J'ai essayé la réponse choisie, mais des problèmes se sont posés pour la mettre en œuvre, notamment si je voulais renvoyer des valeurs à partir de fonctions situées dans le fichier PHP à l'aide de GET avec Ajax.

Après avoir effectué une recherche approfondie sur d'autres solutions (et un peu de test par moi-même), j'ai proposé le code suivant:

<?php
$currentPage = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_Host]$_SERVER[REQUEST_URI]";

if ($_SERVER['REQUEST_METHOD'] == "GET" && strcmp(basename($currentPage), basename(__FILE__)) == 0)
{
    http_response_code(404);
    include('myCustom404.php'); // provide your own 404 error page
    die(); /* remove this if you want to execute the rest of
              the code inside the file before redirecting. */
}
?>

J'ai trouvé que le code ci-dessus fonctionnait comme je le voulais et je ne pense pas qu'il aurait de problèmes avec plusieurs navigateurs, contrairement à l'autre réponse. Je ne pense pas non plus que cela poserait des problèmes de sécurité, mais je peux me tromper (dites-moi si je le suis (et pourquoi)), je suis relativement nouveau dans le domaine de la programmation Web.

Ajoutez simplement ce code au-dessus de chaque fichier pour bloquer l'accès direct aux URL (avant tout, même requiert, inclut et session_starts) et vous êtes prêt à partir.

1
Martin Koch

c'est ce que google utilise dans ses exemples php 

if (php_sapi_name() != 'cli') {
  throw new \Exception('This application must be run on the command line.');
}
0
Toskan

Essayez celui-ci aussi. Passé en haut de check.php 

<?php debug_backtrace() || die ("<h2>Access Denied!</h2> This file is protected and not available to public."); ?>

Un accès refusé sera présenté lorsque le fichier est directement accessible dans l'URL

0
icynets