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?
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' ) );
}
?>
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.
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.
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.
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.');
}
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