1

私はphpを使ってログインシステムを作っています。ログインとサインアップ自体は機能しますが、ログイン後、ページはphpを使用して、ユーザー名とパスワードの非表示の入力を含むhtmlフォームを印刷し、送信ボタンはそれらの入力を「プロファイル」phpページに投稿します、そのユーザーからのメッセージを表示し、ユーザーが新しいメッセージを投稿できるようにします。ログイン.php:

<html>
<head>
<title>Login</title>
<?php
if(isset($_POST['submit1'])){
    $canconnect=false;
    $user_name="root";
    $password="";
    $database="users";
    $server="localhost";
    $user=$_POST['username'];
    $pass=$_POST['pass'];
    $db_handle=mysql_connect($server,$user_name,$password);
    $db_found=mysql_select_db($database,$db_handle);
    if($db_found){
        $SQL="SELECT * FROM users";
        $result=mysql_query($SQL);
        while($db_field=mysql_fetch_assoc($result)){
            if(($user==$db_field['Username'])&&($pass==$db_field['Password'])){
                $canconnect=true;
            }
        }
        mysql_close($db_handle);
        if($canconnect){
            print("Welcome, ".$user."<br><form name='ftoprof' method='post' action='profile.php'><input type='hidden' name='hiduser' value='<?php echo $user;?>'/><input type='hidden' name='hidpass' value='<?php echo $pass;?>'/><input type='submit' name='profsub' value='View Profile'/></form>");
        }else{
            print("Username or password incorrect, please try again.");
        }
    }else{
        print("Users Database not found.");
        mysql_close($db_handle);
    }
}else{
    print("Enter Username and corresponding Password.");
}
?>
</head>
<body>
<form name="form1" method="post" action="login.php">
<input type="text" name="username" value="User"/>
<input type="text" name="pass" value="password"/>
<input type="submit" name="submit1" value="Submit"/>
</form>
Don't have an account? <a href="signup.php">Sing Up</a>
</body>
</html>

問題がここにあるのか、profile.php にあるのかわかりません:

<html>
<head>
<title>Profile</title>
<?php
if(isset($_POST['profsub'])){
$user=$_POST['hiduser'];
$pass=$_POST['hidpass'];
$canconnect=false;
$username="root";
$password="";
$server="localhost";
$database="users";
$db_handle=mysql_connect($server,$username,$password);
$db_found=mysql_select_db($database,$db_handle);
if($db_found){
    $SQL="SELECT * FROM users";
    $result=mysql_query($SQL);
    while($db_field=mysql_fetch_assoc($result)){
    if(($user==$db_field['Username'])&&($pass==$db_field['Password'])){
        $canconnect=true;
    }
    }
    $SQL="SELECT * FROM messages";
    $result=mysql_query($SQL);
    while($db_field=mysql_fetch_assoc($result)){
    print($db_field['message']."<br><br>");
    }if($canconnect){
    print("<form name='mesform' method='post' action='profile.php'><input type='hidden' name='user' value='<?php echo $user; ?>'/><input type='text' name='message' value='message'/><input type='submit' name='messub' value='submit'/></form>");
    }
}else{
    print("Database not found");
}
}elseif(isset($_POST['messub'])){
$mes=$_POST['message'];
$user=$_POST['user'];
$server="localhost";
$username="root";
$password="";
$database="users";
$db_handle=mysql_connect($server,$username,$password);
$db_found=mysql_select_db($database,$db_handle);
if($db_found){
        $SQL="INSERT INTO messages (User, Message) VALUES ('{$user}','{$mes}')";
        $result=mysql_query($SQL);
    }else{
        print("Database not found");
    }

}else{
print("No user's profile to display");
}
?>
</head>
<body>
</body>
</html>

ログインページにユーザー名とパスワードを入力すると、「プロフィールを表示」というボタンが表示されます。users データベース テーブルには、Username Password Email と Power(admin) があります。Messages db テーブルには、Message と User (投稿したユーザー) だけがあります。[プロフィールを表示] ボタンをクリックすると、プロフィール ページが表示されますが、そのページには何も表示されません。これで。これを機能させるためにコードに何をする必要があるか教えてください。ちなみに、私は自分のコンピューターで wamp を使用して「サーバー」を実行しているため、localhost を使用しました。これは私の最初の php プロジェクトなので、助けなしで最初の試行で完璧になるとは思っていませんでした。はい、パスワードがテキストを使用していることに気づきました。

4

2 に答える 2

2
print("Welcome, $user <br><form name='ftoprof' method='post' action='profile.php'><input type='hidden' name='hiduser' value='$user'/><input type='hidden' name='hidpass' value='$pass'/><input type='submit' name='profsub' value='View Profile'/></form>");

の後に行を置き換えます

if($canconnect){ 

上記の行でおそらく問題が解決します

于 2012-09-18T15:57:09.787 に答える
1

お願いします!セキュリティのために、このコードは使用しないでください。

@TimGがコメントで言ったように「PDO、PDO、PDO」

教育を支援するために、このコードにある2つの主要な問題について言及させてください。

問題1

この select ステートメントは、すべてのユーザーを要求し、それらを循環します。データベース クエリでは、WHERE移動するデータの量を制限する句を使用する必要があります。

$SQL="SELECT * FROM users";
while($db_field=mysql_fetch_assoc($result)){
  if(($user==$db_field['Username'])&&($pass==$db_field['Password'])){
      $canconnect=true;
  }
}

ISSUE2本当のキラー:

$SQL="INSERT INTO messages (User, Message) VALUES ('{$user}','{$mes}')";

これは、起こるのを待っている SQL インジェクション攻撃です。この用語について詳しくはググってみてください。簡単に言えば、SQL インジェクション攻撃は、最も一般的で、最も簡単で危険な脆弱性の 1 つです。このコードは、文字通り、データベースの残りの部分への開かれたドアです。

問題 3平文パスワード

パスワードを平文で保存するのは非常に悪い考えです。ここでは、パスワードをソルトして暗号化する方法について、SO に関する多くの議論があります。

PHP でデータベース プログラミングを学習する場合は、くだらないことを学ぶという心の痛みから解放され、最初から PDO とセキュリティを学習してください。

于 2012-09-18T19:20:03.420 に答える