2010-11-06 18 views
25

Tengo una página que quiero proteger con contraseña. Intenté hacer la autenticación HTTP, pero por alguna razón no funciona en mi hosting. ¿Alguna otra manera rápida (y fácil) de hacer esto? ¡Gracias!Manera fácil de proteger con contraseña la página php

+4

Definir "no funciona". –

+0

Esto depende de muchas cosas. ¿Es solo una página? ¿Necesita que un visitante se mantenga validado incluso si actualiza la página? ¿Estás dispuesto a usar sesiones? –

+0

Es solo una página, no necesitan permanecer validados. Preferiría no utilizar sesiones, a menos que haya una manera realmente simple de hacerlo sin formularios y tal. –

Respuesta

41

No es exactamente la protección de contraseña más robusta aquí, así que no la use para proteger números de tarjeta de crédito o algo muy importante.

Simplemente inserte todo el siguiente código en un archivo llamado (secure.php), cambie el usuario y pase de "admin" a lo que desee. Luego, justo debajo de esas líneas donde dice incluir ("secure.html"), simplemente reemplace eso con el nombre de archivo que desea que puedan ver.

Accederán a esta página en [YouDomain.com/secure.php] y luego la secuencia de comandos PHP incluirá internamente el archivo que desea proteger con contraseña, por lo que no sabrá el nombre de ese archivo, y no puede más tarde solo acceda directamente evitando el aviso de contraseña.

Si desea agregar otro nivel de protección, le recomendaría que tome su archivo (secure.html) fuera de la carpeta raíz de su sitio [/ public_html], y lo coloque en el mismo nivel que ese directorio, para que no esté dentro del directorio. Luego, en el script PHP donde está incluyendo el archivo, simplemente use ("../secure.html"). Eso (../) significa regresar un directorio para encontrar el archivo. Al hacerlo de esta manera, la única forma en que alguien puede acceder al contenido que está en la página (secure.html) es a través del script (secure.php).

<?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> 
    <?} 
} 
?> 
+1

Una manera simple de hacerlo más seguro: en lugar de almacenar la contraseña, almacene el hash md5. Cuando intenten iniciar sesión, marque 'md5 ($ pass)' contra el hash. Mejor aún, almacene el hash md5 en un archivo fuera de la raíz web pública. –

+3

Tiene razón al almacenar la página protegida fuera de la raíz del documento, porque en su código, cualquiera puede visitar 'secure.html' y omitir el script PHP (a menos que esté usando archivos' .htaccess' o algo así). –

+3

Al igual que willell mencionado, y lo diré de nuevo, no trates esto como un script de contraseña segura de ninguna manera. Solo algo que escribí en uno o dos minutos que parecía que podía encajar en la factura simplemente requiere un pase antes de ver una página. – JacobN

1

No es la solución, pero para su interés: la autenticación HTTP solo funciona cuando PHP se ejecuta como módulo Apache. La mayoría de los hosters proporcionan PHP solo como versión CGI.

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

Si lo desea, también puede hacerlo tan sólo ciertas direcciones IP pueden iniciar sesión .. :) muy fácil con lighttpd

Actualización: Voy a publicar algunos ejemplos muy pronto, así que no votar en contra de no hay ejemplos, solo necesito obtener algunos para esta respuesta.

Si desea utilizar las sesiones de los siguientes es el mejor camino a seguir:

# 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"; 

Este método no contiene los ejemplos de más arriba pero con costura interesado en este método. Los otros ejemplos de métodos están por venir, no tengo suficiente tiempo para obtenerlos para las configuraciones de apache o lighttpd y la autenticación del encabezado php: http://php.net/manual/en/features.http-auth.php.

13
<?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."; 
    } 
} 
?> 

Y el formulario de acceso en la página ...
(En la misma página , justo por debajo de la anterior^Posteado código)

<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> 
+3

Usar md5 para contraseñas hash es una mala idea. Considere usar [crypt] (http://php.net/crypt) o [password_hash] (http://php.net/password-hash) (en PHP> = 5.5.0) o [password_compat] (https://github.com/ircmaxell/password_compat) (en PHP> = 5.3.7) en su lugar. – Sherif

19

Esto es un poco tarde pero quería para responder en caso de que alguien más aparezca en esta página y descubrió que la respuesta más alta estaba un poco desajustada. He mejorado un poco el sistema. Tenga en cuenta que todavía no es sorprendentemente seguro, pero es una mejora.

En primer lugar preparar el archivo de sales de contraseña:

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; 

?> 

Tome la salida $userhash y $passhash y los pusieron en dos archivos de texto: user.txt y pass.txt, respectivamente. Otros han sugerido poner estos archivos de texto de distancia por encima de public_html, esto es una buena idea, pero me acaba de utilizar .htaccess y los almacena en una carpeta llamada "cosas"

.htaccess

deny from all 

Ahora nadie puede echar un vistazo al hash. El siguiente es el 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 
} 
3

yo simplemente buscar una variable $_GET y redirigir al usuario si no es correcta.

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

Ahora bien, si esta página se encuentra en decir: http://example.com/secrets/files.php

Ahora puede acceder a ella con: http://example.com/secrets/files.php?pass=my-secret-password Tenga en cuenta que esta no es la forma más eficaz o seguro, pero no obstante se trata de una manera fácil y rápida. (Además, sé que mi respuesta es anticuado, pero otra persona mirando esta pregunta puede resultar valioso)

-2

Se puede utilizar esta: http://ps.lixter.com/loginexample.php

<?php 
$u=$_GET['usn']; 
$p=$_GET['psw']; 
$correct=array(
    array("admin","password"), //the combine of username and password 
    array("usn1","12345"), 
    array("usn2","let-me-in"), 
    array("abc","pass9210"), 
    array("20141218","today") 
); 
for ($x = 0; $x < 5; $x++) { //edit the number of pairs combination 
    if ($u == $correct[$x][0] && $p == $correct[$x][1]) { 
     $sta = "you have login successfully! <br>some secret document. some secret document. some secret document."; 
     break; 
    } else { 
     $sta = "you'll have to try another one"; 
    } 
} 

echo "The username is '<b><u>" . $u . "</u></b>' and the password is '<b><u>" . $p . "</u></b>', so " . $sta . "!!"; 
?> 
<p> 
How to get in: 
add the following things to the url bar: 
?usn=admin&psw=password 
or those: 
?usn=usn1&psw=12345 
?usn=usn2&psw=let-me-in 
?usn=abc&psw=pass9210 
?usn=20141218&psw=today 
</p> 
+3

No es una idea muy inteligente colocar una contraseña de texto plano como parámetro GET en una url. Estas URL se registrarán en historiales del navegador, registros de enrutadores, redes wifi abiertas, etc. ... así que realmente cualquiera puede tener acceso a la combinación de usuario/pase sin conocimientos especiales o habilidades de pirateo. – auco

+2

Enlace en la parte superior de con respuesta es virus spam! – StephanieQ

1

Esto me ha ayudado mucho y me ahorrará mucho tiempo, es fácil de usar y funciona bien, incluso me atrevo a cambiarlo y todavía funciona.

bastante buena si no quieres que perdió mucho tiempo en hacerlo :)

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

+1

Creo que quería decir esto: http://www.zubrag.com/scripts/password-protect.php en su lugar –

+0

¡Editado! (Ok, ha pasado un tiempo, pero aún lo he hecho: D) –

2
</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> 

Básicamente lo que hice aquí es hacer una página todo en un archivo php donde cuando ingresas la contraseña, si está a la derecha, ocultará la pantalla de contraseña y traerá las cosas que protegen hacia adelante. y luego está el CSS, que es una parte crucial porque hace que las clases que se esconden y muestran las diferentes partes de la página.

/*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*/ 
1

puede especificar una contraseña en el código php y sólo permitir a los usuarios que tengan la URL secreta:

mywebsite.com/private.php?pass=secret 

en su archivo:

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

Aquí está una manera muy simple:

Agregue esto a index.php o similar:

<?php 
    // Simple password protection 
    if (!isset($_COOKIE['password']) || $_COOKIE['password'] !== 'MYPASS') { 
     header('Location: login.php'); 
     exit; 
    } 
?> 

continuación, crea un archivo llamado login.php:

<?php 
    if (isset($_POST['password']) && $_POST['password'] == 'MYPASS') { 
     setcookie("password", 'MYPASS', strtotime('+30 days')); 
     header('Location: index.php'); 
     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> 

Ejemplo resultado:

password protect php

Después de llenar la contraseña correcta, el usuario es llevado a index.php. La contraseña se almacena durante 30 días.

PD: No está enfocado para ser seguro, sino para ser práctico. Un hacker puede forzar la fuerza bruta. Úselo para mantener a los usuarios normales alejados. No lo use para proteger información sensible.

Cuestiones relacionadas