web-dev-qa-db-fra.com

Un moyen facile de protéger la page php par mot de passe

J'ai une page que je veux protéger par mot de passe. J'ai essayé l'authentification HTTP, mais pour une raison quelconque, cela ne fonctionne pas sur mon hébergement. Un autre moyen rapide (et facile) de le faire? Merci!

32
Leticia Meyer

La protection par mot de passe n’est pas exactement la plus robuste ici. Ne l’utilisez donc pas pour protéger les numéros de carte de crédit ou quelque chose de très important.

Il suffit de déposer tout le code suivant dans un fichier appelé (secure.php), de changer d'utilisateur et de passer de "admin" à celui que vous souhaitiez. Puis, juste sous les lignes où il est dit inclure ("secure.html"), remplacez-le simplement par le nom de fichier que vous voulez qu'ils puissent voir.

Ils accéderont à cette page à l'adresse [YouDomain.com/secure.php], puis le script PHP inclura en interne le fichier que vous souhaitez protéger par mot de passe afin qu'ils ne connaissent pas le nom de ce fichier et ne puissent pas le faire plus tard. il suffit d’y accéder directement en ignorant l’invite de mot de passe.

Si vous souhaitez ajouter un niveau de protection supplémentaire, je vous conseillerais de placer votre fichier (secure.html) en dehors du dossier racine de votre site [/ public_html] et de le placer au même niveau que ce répertoire, afin qu'il soit correctement placé. pas à l'intérieur du répertoire. Ensuite, dans le script PHP où vous incluez le fichier, utilisez simplement ("../secure.html"). Cela (../) signifie revenir à un répertoire pour trouver le fichier. En procédant de cette façon, le script (secure.php) est le seul moyen d’accéder au contenu de la page (secure.html).

<?php
$user = $_POST['user'];
$pass = $_POST['pass'];

if($user == "admin"
&& $pass == "admin")
{
        include("secure.html");
}
else
{
    if(isset($_POST))
    {?>

            <form method="POST" action="secure.php">
            User <input type="text" name="user"></input><br/>
            Pass <input type="password" name="pass"></input><br/>
            <input type="submit" name="submit" value="Go"></input>
            </form>
    <?}
}
?>
49
JacobN

C'est un peu tard, mais je voulais répondre au cas où quelqu'un d'autre viendrait sur cette page et constaterait que la réponse la plus haute était un peu fausse. J'ai amélioré le système juste un tout petit peu. Remarque, il n'est toujours pas incroyablement sécurisé, mais c'est une amélioration.

Commencez par préparer votre fichier sels de mot de passe:

hash_generate.php:

 <?php

 $user = "Username"; // please replace with your user
 $pass = "Password"; // please replace with your passwd
 // two ; was missing

 $useroptions = ['cost' => 8,];
 $userhash    = password_hash($user, PASSWORD_BCRYPT, $useroptions);
 $pwoptions   = ['cost' => 8,];
 $passhash    = password_hash($pass, PASSWORD_BCRYPT, $pwoptions);

 echo $userhash;
 echo "<br />";
 echo $passhash;

 ?>

Prenez votre sortie $userhash et $passhash et mettez-les dans deux fichiers texte: user.txt et pass.txt, respectivement. D'autres ont suggéré de ranger ces fichiers texte au-dessus de public_html, c'est une bonne idée, mais je viens d'utiliser .htaccess et de les stocker dans un dossier appelé "stuff"

.htaccess

 deny from all

Maintenant, personne ne peut jeter un coup d'oeil dans le hash. Ensuite, votre index.php:

index.php:

<?php
$user = ""; //prevent the "no index" error from $_POST
$pass = "";
if (isset($_POST['user'])) { // check for them and set them so
    $user = $_POST['user'];
}
if (isset($_POST['pass'])) { // so that they don't return errors
    $pass = $_POST['pass'];
}    

$useroptions = ['cost' => 8,]; // all up to you
$pwoptions   = ['cost' => 8,]; // all up to you
$userhash    = password_hash($user, PASSWORD_BCRYPT, $useroptions); // hash entered user
$passhash    = password_hash($pass, PASSWORD_BCRYPT, $pwoptions);  // hash entered pw
$hasheduser  = file_get_contents("stuff/user.txt"); // this is our stored user
$hashedpass  = file_get_contents("stuff/pass.txt"); // and our stored password


if ((password_verify($user, $hasheduser)) && (password_verify($pass,$hashedpass))) {

    // the password verify is how we actually login here
    // the $userhash and $passhash are the hashed user-entered credentials
    // password verify now compares our stored user and pw with entered user and pw

    include "pass-protected.php";

} else { 
    // if it was invalid it'll just display the form, if there was never a $_POST
    // then it'll also display the form. that's why I set $user to "" instead of a $_POST
    // this is the right place for comments, not inside html
    ?>  
    <form method="POST" action="index.php">
    User <input type="text" name="user"></input><br/>
    Pass <input type="password" name="pass"></input><br/>
    <input type="submit" name="submit" value="Go"></input>
    </form>
    <?php 
} 
23
Juan
<?php
$username = "the_username_here";
$password = "the_password_here";
$nonsense = "supercalifragilisticexpialidocious";

if (isset($_COOKIE['PrivatePageLogin'])) {
   if ($_COOKIE['PrivatePageLogin'] == md5($password.$nonsense)) {
?>

    <!-- LOGGED IN CONTENT HERE -->

<?php
      exit;
   } else {
      echo "Bad Cookie.";
      exit;
   }
}

if (isset($_GET['p']) && $_GET['p'] == "login") {
   if ($_POST['user'] != $username) {
      echo "Sorry, that username does not match.";
      exit;
   } else if ($_POST['keypass'] != $password) {
      echo "Sorry, that password does not match.";
      exit;
   } else if ($_POST['user'] == $username && $_POST['keypass'] == $password) {
      setcookie('PrivatePageLogin', md5($_POST['keypass'].$nonsense));
      header("Location: $_SERVER[PHP_SELF]");
   } else {
      echo "Sorry, you could not be logged in at this time.";
   }
}
?>

Et le formulaire de connexion sur la page ...
(Sur la même page , juste en dessous du code affiché ci-dessus)

<form action="<?php echo $_SERVER['PHP_SELF']; ?>?p=login" method="post">
<label><input type="text" name="user" id="user" /> Name</label><br />
<label><input type="password" name="keypass" id="keypass" /> Password</label><br />
<input type="submit" id="submit" value="Login" />
</form>
13
Mafia

Voici un moyen très simple:

Créez deux fichiers:

protect-this.php

<?php
    /* Your password */
    $password = 'MYPASS';

    if (empty($_COOKIE['password']) || $_COOKIE['password'] !== $password) {
        // Password not set or incorrect. Send to login.php.
        header('Location: login.php');
        exit;
    }
?>

login.php:

<?php
    /* Your password */
    $password = 'MYPASS';

    /* Redirects here after login */
    $redirect_after_login = 'index.php';

    /* Will not ask password again for */
    $remember_password = strtotime('+30 days'); // 30 days

    if (isset($_POST['password']) && $_POST['password'] == $password) {
        setcookie("password", $password, $remember_password);
        header('Location: ' . $redirect_after_login);
        exit;
    }
?>
<!DOCTYPE html>
<html>
<head>
    <title>Password protected</title>
</head>
<body>
    <div style="text-align:center;margin-top:50px;">
        You must enter the password to view this content.
        <form method="POST">
            <input type="text" name="password">
        </form>
    </div>
</body>
</html>

Ensuite, exigez protect-this.php en haut des fichiers que vous souhaitez protéger:

// Password protect this content
require_once('protect-this.php');

Exemple de résultat:

 password protect php

Après avoir rempli le mot de passe correct, l'utilisateur est dirigé vers index.php. Le mot de passe est stocké pendant 30 jours.

PS: Ce n’est pas centré sur la sécurité, mais sur la pratique. Un pirate informatique peut forcer cela brutalement. Utilisez-le pour éloigner les utilisateurs normaux. Ne l'utilisez pas pour protéger des informations sensibles.

7
Lucas Bustamante

Je chercherais simplement une variable $_GET et redirigerais l'utilisateur si ce n'est pas correct.

<?php
$pass = $_GET['pass'];
if($pass != 'my-secret-password') {
  header('Location: http://www.staggeringbeauty.com/');
}
?>

Maintenant, si cette page est située à dire: http://example.com/secrets/files.php

Vous pouvez maintenant y accéder avec: http://example.com/secrets/files.php?pass=my-secret-password N'oubliez pas que ce n'est pas le moyen le plus efficace ou le plus sécurisé, mais qu'il s'agit néanmoins d'un moyen simple et rapide. (De plus, je sais que ma réponse est obsolète, mais quelqu'un d'autre en train de regarder cette question peut la trouver utile)

6
Singularity
Some easy ways:
Use Apache's digest authorization.
Use lighttpd's digest authorization.
Use php's header digest authorization.

Si vous le souhaitez, vous pouvez également le configurer de sorte que seules certaines adresses IP puissent se connecter. :) très facile avec lighttpd

Mise à jour: Je publierai quelques exemples sous peu, alors ne cédez pas à l'acte, vous avez juste besoin d'en obtenir quelques-uns pour cette réponse.

Si vous souhaitez utiliser des sessions, voici la meilleure solution:

# admin.php
session_start();
if(!$_SESSION["AUTH"])
    require_once "login.php";
# Do stuff, we are logged in..

# login.php
session_start();
if($_REQUEST["username"] == "user" && $_REQUEST["password"] == "pass")
    $_SESSION["AUTH"] = true;
else $_SESSION["AUTH"] = false; # This logs you out if you visit this login script page without login details.

if($_SESSION["AUTH"])
    require_once "admin.php";

Cette méthode ne contient pas les exemples ci-dessus, mais vous semblez intéressée par cette méthode. Les autres exemples de méthodes restent à venir, je n'ai pas assez de temps pour les obtenir pour les paramètres Apache ou lighttpd et l'authentification d'en-tête php: http://php.net/manual/en/features.http-auth.php Ça ira.

4
JamesM-SiteGen
</html>
<head>
  <title>Nick Benvenuti</title>
  <link rel="icon" href="img/xicon.jpg" type="image/x-icon/">
  <link rel="stylesheet" href="CSS/main.css">
  <link rel="stylesheet" href="CSS/normalize.css">
  <script src="JS/jquery-1.12.0.min.js" type="text/javascript"></script>
</head>
<body>
<div id="phplogger">
  <script type="text/javascript">
  function tester() {
  window.location.href="admin.php";
  }
  function phpshower() {
  document.getElementById("phplogger").classList.toggle('shower');
  document.getElementById("phplogger").classList.remove('hider');
  }
  function phphider() {
  document.getElementById("phplogger").classList.toggle('hider');
  document.getElementById("phplogger").classList.remove('shower');
  }
</script>
<?php 
//if "login" variable is filled out, send email
  if (isset($_REQUEST['login']))  {

  //Login info
  $passbox = $_REQUEST['login'];
  $password = 'blahblahyoudontneedtoknowmypassword';

  //Login
  if($passbox == $password) {

  //Login response
  echo "<script text/javascript> phphider(); </script>";
  }
 }
?>
<div align="center" margin-top="50px">
<h1>Administrative Access Only</h1>
<h2>Log In:</h2>
 <form method="post">
  Password: <input name="login" type="text" /><br />
  <input type="submit" value="Login" id="submit-button" />
  </form>
</div>
</div>
<div align="center">
<p>Welcome to the developers and admins page!</p>
</div>
</body>
</html>

Fondamentalement, ce que j'ai fait ici est de créer une page dans un seul fichier php dans lequel, lorsque vous entrez le mot de passe, vous obtiendrez le mot de passe masqué. et ensuite, voici le css qui est une partie cruciale car il fait les classes qui cachent et montrent les différentes parties de la page.

  /*PHP CONTENT STARTS HERE*/
  .hider {
  visibility:hidden;
  display:none;
  }

  .shower {
  visibility:visible;
  }

  #phplogger {
  background-color:#333;
  color:blue;
  position:absolute;
  height:100%;
  width:100%;
  margin:0;
  top:0;
  bottom:0;
  }
  /*PHP CONTENT ENDS HERE*/
2
Nick

Cela m'a beaucoup aidé et m'a permis d'économiser beaucoup de temps, il est facile à utiliser et fonctionne bien. J'ai même pris le risque de le changer et cela fonctionne toujours.

Assez bon si vous ne voulez pas perdre trop de temps à le faire :)

http://www.zubrag.com/scripts/password-protect.php

2
Baldráni

Pas la solution, mais pour votre intérêt: l'authentification HTTP ne fonctionne que lorsque PHP est exécuté en tant que module Apache. La plupart des hébergeurs fournissent PHP comme version CGI uniquement.

1
Busydude

vous pouvez spécifier un mot de passe dans votre code php et autoriser uniquement les utilisateurs ayant l'URL secrète:

mywebsite.com/private.php?pass=secret

dans votre dossier:

<?php
     if(isset($_GET["pass"] && $_GET["pass"]=="secret"){
           //put your code here
     }
     else{
           echo "you're not allowed to access this page";
     }
?>
1
mondersky

Un moyen simple de protéger un fichier sans nécessiter de page de connexion distincte - ajoutez simplement ceci en haut de la page:

Changez secretuser et secretpassword en votre utilisateur/mot de passe.

$user = $_POST['user'];
$pass = $_POST['pass'];

if(!($user == "secretuser" && $pass == "secretpassword"))
{
    echo '<html><body><form method="POST" action="'.$_SERVER['REQUEST_URI'].'">
            Username: <input type="text" name="user"></input><br/>
            Password: <input type="password" name="pass"></input><br/>
            <input type="submit" name="submit" value="Login"></input>
            </form></body></html>';
    exit();
}
0
A.Badger