Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP5.4基本登录脚本_Php_Mysql_Login - Fatal编程技术网

PHP5.4基本登录脚本

PHP5.4基本登录脚本,php,mysql,login,Php,Mysql,Login,尝试通过一些数据库交互来学习PHP,我正在尝试做一个“简单”(大多数事情可能是相对的…)登录脚本,当我第一次尝试它时,我得到了一些关于会话注册的错误,我现在理解它已被弃用,我尝试将其更改为$_会话['something']='something' 我的数据库设置了一个用户,我可以很好地连接并选择正确的数据库,但是当我输入用户名和密码时,我会将sen返回到登录表单,当它失败时应该这样做 当我使用不推荐的版本时,我确实发现了一些错误的用户名或密码。我只有三个字段,main_login.php、che

尝试通过一些数据库交互来学习PHP,我正在尝试做一个“简单”(大多数事情可能是相对的…)登录脚本,当我第一次尝试它时,我得到了一些关于会话注册的错误,我现在理解它已被弃用,我尝试将其更改为$_会话['something']='something'

我的数据库设置了一个用户,我可以很好地连接并选择正确的数据库,但是当我输入用户名和密码时,我会将sen返回到登录表单,当它失败时应该这样做

当我使用不推荐的版本时,我确实发现了一些错误的用户名或密码。我只有三个字段,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();
?>

最后一次登录是_success.php

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

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

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

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

如前所述,请在checklogin.php的开头添加
session\u start()

好吧,我在checklogin.php中没有看到
session\u start()
调用

<?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();
?>
您的代码确实容易被注入,因为出于某种原因,您正在剥离之前应用了一行的转义。为什么要调用stripslashes()

另外,请记住,
mysql\u real\u escape\u string()
本身不会阻止注入。
只有格式正确的数据才能保证不被注入,并且有近十几条格式规则,而不是一条。
虽然只要您只在查询中添加带引号的字符串,并通过
mysql\u real\u escape\u string()
传递每个字符串,您的查询是完全安全的。

删除引号: 替换为:
代替 与:
你为什么要删除这个?
这是非常必要的,否则您的代码容易受到SQL注入的攻击。

我删除了它,因为我在上面几行直接添加了$username=mysql\u real\u escape\u string($\u POST['username']);,是不是错了,我需要两个都要?@Angel不,是对的。好的。:)如果我想输出一个带引号的字符串,但在这里可能不需要,我就可以在这里使用它,只需要玩一下。谢谢你对SQL的反馈,对它来说还是很新的,并且会记住你关于引号的建议。你说的“剥离我应用的所有转义”是什么意思?你是说使用stripslashes()调用会使它更容易被注入?为什么是向下投票?我没有向论坛提出相关问题,还是我选择了错误的标签?
$_SESSION['username'] = $username;
$_SESSION['password'] = $password;
ob_start();
session_start();
ob_start();
//$username = mysql_real_escape_string($username);
//$password = mysql_real_escape_string($password);