PHP 5.4基本登录脚本

时间:2012-12-25 18:34:07

标签: php mysql login

尝试通过一些数据库交互学习自己的PHP并且我试图做一个“简单”(大多数事情可能是相对...)登录脚本,当我第一次尝试它时,我得到了一些关于session_register的错误我现在理解已被弃用,我试图将其更改为$ _SESSION ['something'] ='某事';

我的数据库是由用户设置的,我可以正常连接并选择正确的数据库但是当我输入用户名和密码时,我会回到登录表单,它应该在失败时执行。

当我使用已弃用的版本时,我确实有一些东西可以捕获错误的用户名或密码。我只有三个提交,main_login.php,checklogin.php和login_success.php,并将它们发布在下面。

main_login.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" 
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en'>
<head>
    <meta http-equiv='content-type' content='application/xhtml+xml; charset=UTF-8' />

    <title>Login</title>
    <!-- JAVASCRIPTS -->
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
    <script type="text/javascript" src="script/jquery.js"></script>
    <!-- CSS FILES -->
    <link rel='stylesheet' type='text/css' href='css/default.css' />
</head>
<body>
    <div id='wrapper'>
        <div id='loginform'>
            <form action="checklogin.php" method='post' id='login'>
                Username: <br />
                <input type='text' name='username' /><br />
                Password: <br />
                <input type='text' name='password' /><br />
                <input type='submit' value='Login' />
            </form>
        </div>
    </div>
</body>

checklogin.php

<?PHP
//Server/database settings
ob_start();
$host       = "localhost";
$username   = "root";
$password   = "";
$db_name    = "user";
$tbl_name   = "userdata";

//Connect to the server and select the database
mysql_connect("$host", "$username", "$password") or die ("cannot connect");
mysql_select_db("$db_name") or die ("cannot select DB");

//Get the username and password from the login form
//Prevent SQL injections
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string(md5($_POST['password']));
$username = stripslashes($username);
$password = stripslashes($password);
//$username = mysql_real_escape_string($username);
//$password = mysql_real_escape_string($password);
$sql = "SELECT * FROM $tbl_name WHERE username = '$username'
and password = '$password'";
$result = mysql_query($sql);

//Count the table row. 0 = No user exists
$count = mysql_num_rows($result);

//If $result is 1 the user exists
if($count == 1) {
    $_SESSION['username'] = '$username';
    $_SESSION['password'] = '$password';
    header('location:login_success.php');
}

/*  //If the result match the $username && $password, table row will be 1
if($count == 1) {
    session_register('username');
    session_register('password');
    header('location:login_success.php');
}*/

//If it does not match, give a return message
else {
    echo 'Wrong Username or Password';
}
ob_end_flush();
?>

和最后一次login_success.php

<?PHP
session_start();
if (!isset($_SESSION['username'])) {
    header('location:main_login.php');
}
?>
<html>
    <body>
        Login Successful
    </body>
</html>

这只会让我回到登录页面:/

此外,如果有人注意到任何可能容易受到SQL注入攻击的代码,请随时指出并建议我应该做什么。

3 个答案:

答案 0 :(得分:2)

好吧,我在checklogin.php

中没有看到session_start()电话

你的代码确实容易受到注入,因为出于某种原因,你正在剥离你之前使用过的行。为什么要stripslashes()拨打电话?

另外,请注意mysql_real_escape_string()本身并不能阻止注射 只有格式正确的数据才能保证您注射,并且有近十几种格式规则,而不是一种 虽然只要您在查询中仅添加带引号的字符串,并通过mysql_real_escape_string()传递每个字符串,您的查询就非常安全。

答案 1 :(得分:1)

$_SESSION['username'] = $username;
$_SESSION['password'] = $password;

正如Your Common Sense所述,请在session_start()的开头添加checklogin.php

答案 2 :(得分:0)

删除引号:

$_SESSION['username'] = '$username';
$_SESSION['password'] = '$password';

替换为:

$_SESSION['username'] = $username;
$_SESSION['password'] = $password;

替换

ob_start();

使用:

session_start();
ob_start();

你为什么要删除它?

//$username = mysql_real_escape_string($username);
//$password = mysql_real_escape_string($password);

非常需要,否则您的代码很容易受到SQL注入。