1

誰かがログインしたときに、ホームページにリダイレクトするのに苦労しています。間違いを見つけることができません。助けていただければ幸いです。ありがとう。

<?php

include("scripts/connect.php");

$form = "<form action='home.php' method='post'>
    <table>
    <tr>
        <td>Email:</td>
        <td><input type='text' name='email' class='textbox' size='35'></td>
        <td><a href='register.php'>Register?</a></td>
    </tr>
    <tr>
        <td>Password:</td>
        <td><input type='password' name='password' class='textbox' size='35'></td>
        <td><input type='submit' name='login' value='Login' class='button' alt='Login'></td>
    </tr>
    </table>
</form>";


if ($_POST['login']){
    $email = strip_tags($_POST['email']);
    $password = strip_tags($_POST['password']);

if ($email && $password){

require("scripts/connect.php");

$pass = md5(md5($password));

$query = mysql_query("SELECT * FROM users WHERE email='$email' AND password='$pass'");
        $numrows = mysql_num_rows($query);

            if ($numrows == 1){

                $row = mysql_fetch_assoc($query);
                $dbid = $row['uid'];
                $dbuser = $row['name'];

                $_SESSION['name'] = $dbuser;
                $_SESSION['userid'] = $dbid;


                header("profile.php?uid=$userid");

            }
            else
                echo "Your login information was incorrect! $form";
    }
    else
        echo "You did not fill in the entire form! $form";
}
else
    echo "$form";


  ?>

ヘッダーのセッション変数。

<?php
session_start();
$name = $_SESSION['name'];
$userid = $_SESSION['userid'];
?>
4

3 に答える 3

5
header("profile.php?uid=$userid");

あなたは最も重要な部分を逃しています:

header( "Location: profile.php?uid=$userid" );

さらに、Pavelが以下のコメントで指摘しているように、ユーザーIDはに保存されません$userid

$dbid = $row['uid'];
...
header( "Location: profile.php?uid=$dbid" );

最後に、クエリでSQLインジェクションの可能性を指摘しなければ、公平ではありません。電子メールとパスワードが一致するusersテーブルからすべての行を選択しています。ただし、次のメールアドレスを渡してランダムなパスワードを推測すると、アクセスできるようになります。

' or 'a' = 'a

これをクエリと結合すると、データベースへのクエリは次のようになります。

SELECT * FROM users WHERE email='' or 'a' = 'a' AND password='$pass'"

この時点で、ランダムなパスワードを推測できます。そのパスワードがデータベース内の誰かによって使用されている限り、結果セットの最初のユーザーとして認証されます。パスワードが難しすぎるが、一部のユーザーのメールアドレスを知っていた場合(パスワードは非常に簡単に入手できるため、難しくはありません)、逆にすることができます。

SELECT * FROM users WHERE email='admin@domain.com' AND password='' OR 'a' = 'a'

繰り返しになりますが、ここでは、パスワードが不要になったため、パスワードは関係ありません。'a' ='a'の場合(そして常にそうです)、パスワードは不要になります。提供されたメールアドレスを持っている最初のユーザーとしてログインします。

さらに悪いことに:

SELECT * FROM users WHERE email = '' OR 'a'='a' AND password = '' OR 'a' = 'a'

これにより、最初のユーザーが戻ってきたときにログインします。これは多くの場合、管理者です。

于 2012-04-24T13:16:04.990 に答える
0

変えてみましたか

if ($_POST['login']){

に:

if (isset($_POST['login'])) {

そして、次のようにヘッダーリダイレクトを使用します。

header("Location: page.php");
于 2012-04-24T13:56:13.390 に答える
0

PHPのheader関数を使用すると、ページ ヘッダーを設定できます。あなたの場合、ヘッダーには何も指定していません。header()特殊なケースを使用Locationして、ブラウザーに目的の URL へのリダイレクトを行うように指示できます。

これにより、ブラウザに 302 応答がプッシュされ、リダイレクトが行われます。したがって、コードは次のようになります。

header("Location: http://example.com");

このメソッドは機能しないため、呼び出す前に出力がないことを確認してください。

于 2012-04-24T13:20:58.547 に答える