web-dev-qa-db-ja.com

PHPページをパスワードで保護する簡単な方法

パスワードで保護したいページがあります。 HTTP認証を試しましたが、何らかの理由でホスティングで機能しません。これを行う他の迅速な(そして簡単な)方法はありますか?ありがとう!

37
Leticia Meyer

ここで最も堅牢なパスワード保護ではないため、クレジットカード番号や非常に重要なものを保護するためにこれを使用しないでください。

次のコードをすべて(secure.php)というファイルにドロップし、ユーザーを変更して「admin」から必要なものに渡します。次に、include( "secure.html")と表示されている行のすぐ下で、表示したいファイル名に置き換えます。

彼らは[YouDomain.com/secure.php]のこのページにアクセスし、PHPスクリプトはパスワードで保護したいファイルを内部に含めるので、そのファイルの名前はわかりませんが、パスワードプロンプトをバイパスして直接アクセスすることはできません。

さらに保護レベルを追加する場合は、サイトのルートフォルダー[/ public_html]の外にある(secure.html)ファイルを取得し、そのディレクトリと同じレベルに配置することをお勧めします。ディレクトリ内ではありません。次に、PHPスクリプトを使用して、ファイルをインクルードします( "../secure.html")を使用します。これは(../)は、ファイルを見つけるためにディレクトリに戻ることを意味します。この方法で、誰かが(secure.html)ページにあるコンテンツにアクセスできる唯一の方法は、(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>
    <?}
}
?>
50
JacobN

これは少し遅れますが、このページに他の誰かが来て、最高の返信が少しずれている場合に備えて返信したいと思いました。システムを少し改良しました。注、まだ驚くほど安全ではありませんが、改善されています。

最初にパスワードソルトファイルを準備します:

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;

 ?>

出力を取得$userhashおよび$passhashそして、それぞれuser.txtとpass.txtの2つのテキストファイルに入れます。他の人はこれらのテキストファイルをpublic_htmlの上に置くことを提案しています、これは良いアイデアですが、私は.htaccessを使用して「stuff」というフォルダに保存しました

。htaccess

 deny from all

今では誰もハッシュを覗き見ることができません。次は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 
} 
25
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.";
   }
}
?>

そして、ページ上のログインフォーム...
同じページ、上記の投稿コードのすぐ下)

<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

これは非常に簡単な方法です。

2つのファイルを作成します。

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>

次に、保護するファイルの上部にprotect-this.phpを必要とします。

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

結果の例:

password protect php

正しいパスワードを入力すると、ユーザーはindex.phpに移動します。パスワードは30日間保存されます。

PS:安全であるように焦点を合わせているのではなく、実用的です。ハッカーはこれを総当たり攻撃できます。通常のユーザーを遠ざけるために使用します。機密情報を保護するために使用しないでください。

7

私は単に$_GET変数を使用し、正しくない場合はユーザーをリダイレクトします。

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

このページが次の場所にある場合:http://example.com/secrets/files.php

これでアクセスできます:http://example.com/secrets/files.php?pass=my-secret-passwordこれは最も効率的で安全な方法ではありませんが、それでも簡単で高速な方法です。 (また、私の答えは時代遅れですが、この質問を見ている誰かがそれを価値があると感じるかもしれません)

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

必要に応じて、特定のIPアドレスのみがログインできるようにすることもできます。

更新:すぐにいくつかの例を投稿しますので、例に投票しないでください。この答えに答える必要があります。

セッションを使用する場合は、次の方法が最適です。

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

このメソッドには上記の例は含まれていませんが、このメソッドに興味を持っていると思います。他のメソッドの例はまだありません。Apacheまたはlighttpdの設定とphpヘッダー認証用に取得するのに十分な時間がありません: http://php.net/manual/en/features.http-auth .php 行います。

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>

基本的にここでやったことは、パスワードを入力するとパスワード画面が非表示になり、保護されたものが前面に表示されるように、1つのphpファイルでページを作成することです。次に、CSSは重要な部分です。CSSは、ページのさまざまな部分を非表示および表示するクラスを作成するためです。

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

これは私を大いに助け、私を多くの時間を節約し、使いやすく、うまく機能します。変更の危険を冒しましたが、それでも動作します。

あなたがそれをすることに多くの時間を失いたくないなら、かなり良いです:)

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

2
Baldráni

解決策ではありませんが、興味がある場合:HTTP認証は、PHPがApacheモジュールとして実行される場合にのみ機能します。ほとんどのホスティング業者は、CGIバージョンのみとしてPHP.

1
Busydude

pHPコードでパスワードを指定し、シークレットURLを持つユーザーのみを許可できます。

mywebsite.com/private.php?pass=secret

あなたのファイルに:

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

別のログインページを必要とせずにファイルを保護する簡単な方法-これをページの上部に追加するだけです。

Secretuserとsecretpasswordをユーザー/パスワードに変更します。

$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