1

こんにちは、単純なログイン システムを作成しています。私は自分のやり方が完全に安全ではないことを認識していますが、私はphpを初めて使用するため、学習目的のためだけです。検証に問題があります。現在、ユーザー名またはパスワードが txt ファイルに存在するかどうかが報告されていません。また、セッション (完全には実装されていません) を使用して、ユーザーがログインしているかどうかを追跡します。

         <?php 
      session_start(); // session


       if(isset($_POST['register'])) //  Register USER
    {
      $user  = $_POST['username'];
      $password=$_POST['password'].PHP_EOL;
      $fh = fopen("file.txt","a+");
      fwrite($fh,$user." ".$password); //write to txtfile
      fclose($fh);
    }

txt ファイルの出力は次のようになります。

      user1 password1
      user2 password2

これは私が助けを必要とするところです

      if(isset($_POST['Login']))
      {
      $_SESSION['username']=$user; 
  $_SESSION['password']=$password;

  $file = file_get_contents("file.txt");



 if (strpos($file, "$user $password".PHP_EOL) !== false) 
  {
     // go to login page
  }
  else 
{ 
     //ERROR
}

    ?>
4

4 に答える 4

4

file_get_contents()ファイルポインタではなくファイル名を取るのでfile_get_contents('file.txt')fopen呼び出しを使用して削除する必要があります。

http://php.net/manual/en/function.file-get-contents.php

次に、 の値は$file、ファイルのすべての内容を 1 つの文字列として含む文字列です。したがって、通常の文字列操作を使用でき、そのようなものは必要ありませんfeof

ただし、 を見たいと思うかもしれませんがfile()、おそらく役に立つでしょう:

http://php.net/manual/en/function.file.php

編集:

ロジックにも問題があります。

最初にユーザー名を確認し、次に別の操作としてパスワードを確認しています。これにより、任意のユーザーと任意のユーザーのパスワードが一致します。パスワードが「foo」のユーザー alice とパスワードが「bar」の bob がいるとします。現在のロジックでは、alice はパスワードとして「foo」または「bar」を使用してログインできます。

したがって、実際に探しているのは、ファイルにあるように、ユーザー名とパスワードを連結した単一の文字列です (例: "alice foo".PHP_EOL):

if (strpos($file, "$user $password".PHP_EOL) !== false) {
    // go to login page
} else {
    // error
}

そこに が必要な理由PHP_EOLは、これがレコードの終わりを示すために使用したものだからです。検索文字列に入れない場合は、空のパスワードを含め、実際のパスワードの任意の部分文字列と一致します。(ファイルにはテキストが"alice foo".PHP_EOL含まれており、テキストは含まれています"alice "が、テキストは含まれていません"alice ".PHP_EOL)。

于 2013-03-01T09:06:21.227 に答える
1

引用符内の php 変数は、string $_SESSION['username']="$user"; のみのように動作します。$_SESSION['username']=$user; のように使用します。

于 2013-03-01T09:52:35.410 に答える
1

問題はここにあります:

$fp = fopen ("file.txt", "r"); // read from file
$file = file_get_contents($fp);

を使用fopenすると、ファイルを1行ずつ読み取ることができfile_get_contents、ファイルハンドルではなく引数としてファイル名を指定することにより、ファイルの内容全体を文字列として取得できます。

あなたは両方を混同しています。

于 2013-03-01T09:06:52.207 に答える
0

学習中なので、コードは提供しませんが、"\n" でロジックを展開し、結果の配列値をスペースで展開することができます。

配列の値 0 と 1 がユーザー名とパスワードと等しいかどうかを確認し、同じ場合は成功

まだ疑問がある場合はお気軽に質問してください

于 2013-03-01T09:19:18.843 に答える