-2

尝试通过一些数据库交互来学习 PHP,我正在尝试做一个“简单”(大多数事情都可以是相对的......)登录脚本,当我第一次尝试它时,我得到了一些关于 session_register 的错误,我现在明白这些错误已被弃用我试图将其更改为 $_SESSION['something'] = '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>

检查登录.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 注入攻击的代码,请随时指出并建议我应该做什么。

4

3 回答 3

2

session_start()好吧,我在 checklogin.php 中没有看到调用

而且您的代码确实容易受到注入,因为出于某种原因,您正在剥离您之前应用的一行的转义。为什么打这个stripslashes()电话?

另外,请记住,mysql_real_escape_string()它本身并不能阻止注射。
只有正确格式化的数据才能保证您不会被注入,并且格式化规则有近十种,没有一个。
尽管只要您只将带引号的字符串添加到查询中,并将其中的每一个字符串都传递给mysql_real_escape_string(),您的查询是完全安全的。

于 2012-12-25T18:38:22.047 回答
1
$_SESSION['username'] = $username;
$_SESSION['password'] = $password;

正如你的常识所说,请session_start()在开头添加checklogin.php.

于 2012-12-25T18:37:09.767 回答
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 注入的攻击。

于 2012-12-25T18:38:56.037 回答