尝试通过一些数据库交互学习自己的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注入攻击的代码,请随时指出并建议我应该做什么。
答案 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注入。