проблема с логином php - PullRequest
0 голосов
/ 09 января 2009

Я использую этот код для входа в систему, но когда я ввожу имя пользователя и пароль, он просто загружает страницу и снова отображается страница входа. Почему это происходит?

<?php
    session_start();
    if(!isset($_POST['username']) || !isset($_POST['password']) || empty($_POST['username']) || empty($_POST['password']))
    {
?>
        <html>
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Welcome to yachts database &nbsp;&nbsp;&nbsp;</title>
        <script type="text/javascript">
        function validate()
        {
            var username=document.getElementById("username").value;
            var password=document.getElementById("password").value;
            if(username.length==0)
            {
                alert("Please enter your user name");
                document.getElementById("username").focus();
                document.getElementById("username").select();
                return false;
            }
            if(password.length==0)
            {
                alert("Please enter your password");
                document.getElementById("password").focus();
                document.getElementById("password").select();
                return false;
            }
            submitOK="false";
        }
        </script>
        <?php
            include("styles.txt");
        ?>
        </head>
        <body onLoad="self.focus();document.login.username.focus()">
        <br><br><br><br><br><br><br>
        <center><font size=5 color=blue><b>University of ....... </b></font></center>
        <center><font size=5 color=blue><b>Yachts Database Project</b></font></center>
        <form name="login" method="post" action="<?php $_SERVER['PHP_SELF'];?>" onSubmit="return validate()">
        <table width="350" border="1" align="center" cellpadding=0 cellspacing=0  bgcolor=#ffffff bordercolor=#ffffff>
        <tr>
            <th colspan=2 height=30 bgcolor=#050E8C><font size=4 color=#ffffff>Please, enter user name and password</font></th>
        </tr>
        <tr>
            <th bgcolor=#E0E0FF><font size=4 color=#2020ff>User name</font></th>
            <td bgcolor=#E0E0FF align=center><input type="text" name="username" id="username" size="30"></td>
        </tr>
        <tr>
            <th bgcolor=#E0E0FF><font size=4 color=#2020ff>Password</font></th>
            <td bgcolor=#E0E0FF align=center><input type="password" name=" password" id="password" size="30"></td>
        </tr>
        <tr>
            <td bgcolor=#E0E0FF colspan=2 align=right><input type="submit" name="login" value="&nbsp;&nbsp;Login&nbsp;&nbsp;">&nbsp;&nbsp;<input type="reset" name="reset" value="&nbsp;&nbsp;Reset&nbsp;&nbsp;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=register.php class=links>Register</a>&nbsp;&nbsp;&nbsp;&nbsp;</td>
        </tr>
        </table>
        </form>
        </body>
        </html>
<?php
    }
    else
    {
        $connect= mysql_connect("localhost","root") or die ("Sorry, Can not connect to database");
        mysql_select_db("login") or die (mysql_error());
        $username1=$_POST['username'];
        $password1=$_POST['password'];
        if($username1 && $password1)
        {
            $query="SELECT * FROM users WHERE username='$username1' AND password='$password1'";
            $result=mysql_query($query,$connect) or die(mysql_error());
            $rowcount=mysql_num_rows($result);
        }
        if($rowcount)
        {
            //$_SESSION['username']=$rowcount['username'];
            $user1=$username1;
            $pass1=$password1;
            session_register("user1");
            session_register("pass1");
            header("location: main.php");
        }
        else
        {
?>
            <html>
            <head>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
            <title>Welcome to yachts database &nbsp;&nbsp;&nbsp;</title>
            <script type="text/javascript">
            function validate()
            {
                var username=document.getElementById("username").value;
                var password=document.getElementById("password").value;
                if(username.length==0)
                {
                    alert("Please enter your user name");
                    document.getElementById("username").focus();
                    document.getElementById("username").select();
                    return false;
                }
                if(password.length==0)
                {
                    alert("Please enter your password");
                    document.getElementById("password").focus();
                    document.getElementById("password").select();
                    return false;
                }
                submitOK="false";
            }
            </script>
            <?php
                include("styles.txt");
            ?>
            </head>
            <body  onLoad="self.focus();document.login.username.focus()">
            <br><br><br><br><br><br><br>
            <center><font size=5 color=blue><b>University of ....... </b></font></center>
            <center><font size=5 color=blue><b>Yachts Database Project</b></font></center>
            <form name="login"  method="post" action="<?php echo $_SERVER['PHP_SELF'];?>" onSubmit="return validate()">
            <table width="350" border="1" align="center" cellpadding=0 cellspacing=0  bgcolor=#ffffff bordercolor=#ffffff>
            <tr>
                <th colspan=2 height=30 bgcolor=#050E8C><font size=4 color=#ffffff>Please, enter user name and password</font></th>
            </tr>
            <tr>
                <th bgcolor=#E0E0FF><font size=4 color=#2020ff>User name</font></th>
                <td bgcolor=#E0E0FF align=center><input type="text" name="username" id="username" size="30"></td>
            </tr>
            <tr>
                <th bgcolor=#E0E0FF><font size=4 color=#2020ff>Password</font></th>
                <td bgcolor=#E0E0FF align=center><input type="password" name=" password" id="password" size="30"></td>
            </tr>
            <tr>
                <td bgcolor=#E0E0FF colspan=2 height=30 align=right><input type="submit" name="login" value="&nbsp;&nbsp;Login&nbsp;&nbsp;">&nbsp;&nbsp;<input type="reset" name="reset" value="&nbsp;&nbsp;Reset&nbsp;&nbsp;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=register.php class=links>Register</a>&nbsp;&nbsp;&nbsp;&nbsp;</td>
            </tr>
            <tr>
                <td bgcolor=#E0E0FF colspan=2 height=30 align=center><font size=3 color=#ff0000>User name or Password wrong!</font></td>
            </tr>
            </table>
            </form>
            </body>
            </html>
            <?php
        }
    }
?>

Ответы [ 6 ]

12 голосов
/ 09 января 2009

Есть несколько вещей, которые вы должны изменить в этом коде ...

  1. Вам не нужно делать !isset() и empty(): просто empty() сделает
  2. Вы не должны дублировать HTML-код для страницы входа в систему - либо поместите его в переменную, либо include() и используйте PHP, чтобы поместить туда сообщение об ошибке.
  3. Вы используете устаревший HTML, такой как <center> и <font> - замените их на CSS
  4. В JavaScript, submitOK="false"; должно быть return true;
  5. name=" password" должно быть name="password" (пробелы в атрибутах должны быть обрезаны, но я не хотел бы полагаться на это.
  6. Вы помещаете необработанный ввод в запрос MySQL, оставляя себя уязвимым для внедрения SQL. Используйте mysql_escape_string()
  7. Не используйте session_register, используйте $_SESSION.
  8. Местоположение заголовка должно быть действительно каноническим URL (начиная с http://), хотя каждый известный мне браузер принимает относительный URL.
  9. Удобство использования - выньте кнопку сброса.
2 голосов
/ 09 января 2009

Интересно, как выглядит сгенерированный HTML для этой формы?

как

action="<?php $_SERVER['PHP_SELF'];?>"

должно быть

action="<?php echo $_SERVER['PHP_SELF'];?>"

иначе вы можете найти сгенерированный HTML-код action = "", и в этом случае он может не обработать форму, как вы ожидаете

1 голос
/ 09 января 2009

Когда у вас возникают проблемы со сценарием, иногда проще, если вы удалите весь лишний пух. Попробуйте код ниже. Я немного прибрался.

Я не проверял это, но все еще думаю, что это шаг вперед.

<?php

    session_start();

    /* If the form has been submitted. */
    if (!empty ($_POST))
    {

        /* If there is not missing data. */
        if (empty ($_POST['username']) && empty ($_POST['password']))
        {
            /* Connect to the database server. */
            $connection = mysql_connect ("localhost", "root") or die ("Error: can not connect to the database.");

            /* Select the database. */
            mysql_select_db ("login") or die ("Error: Can not select the database.");

            /* Make the query. */
            $login_check = mysql_query ("SELECT * FROM users WHERE username = '" . mysql_escape_string ($_POST['username']) . "' AND password = '" . mysql_escape_string ($_POST['password']) . "' LIMIT 1") or die ("MySQL query error.");

            /* If there is a row returned. */
            if (mysql_num_rows ($login_check) > 0)
            {
                echo 'The username and password have matched.';
                exit;
            }

            /* There were no rows returned. */
            else
            {
                $_SESSION['login_error'] = 'Incorrect username or password.';
            }
        }

        /* There's missing data. */
        else
        {
            $_SESSION['login_error'] = 'Both the username and password are required.';
        }
    }

?>  
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Testing Login Form</title>
    </head>
    <body>
        <form name="login" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
            <p>User name: <input type="text" name="username" id="username"></p>
            <p>Password: <input type="password" name="password" id="password"></p>
            <p><input type="submit" name="login" value="Login"></p>
            <?php

                if (!empty ($_SESSION['login_error']))
                {
                    echo '<p>', htmlspecialchars ($_SESSION['login_error'], ENT_QUOTES), '</p>';
                    unset ($_SESSION['login_error']);
                }

        ?>
        </form>
    </body>
</html>

Пожалуйста, примите во внимание все, что набрал Роборг. Это очень хороший совет.

1 голос
/ 09 января 2009

У вас есть много кода для того, чего вы пытаетесь достичь. Не пытаясь показаться снисходительным, я бы предложил вернуться на чертежную доску, в Google «аутентификация пользователя php» или подобное и посмотреть, есть ли несколько простых примеров, которым вы можете следовать.

0 голосов
/ 09 января 2009

Вы также можете подумать, что произойдет, если я введу такой пароль, как этот

' or 1=1 or '

Научитесь дезинфицировать все входные данные, поступающие извне!

0 голосов
/ 09 января 2009
<input type="password" name=" password" id="password" size="30">

В имени поля пароля есть пробел, поэтому значение хранится в $ _POST ['password'], а не в $ _POST ['password']

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...