使用以下代码会发生奇怪的事情。而不是完全重定向。它将重定向的页面加载到登录页面中并混合起来。
Q1 :如何进行完整重定向。 - 会话开始是第一行 - 标题之前没有输出任何内容。 - 至于空格,我不确定下面脚本中的空格是什么。
Q2 :我如何preg_replace一个字符串只允许小案例和大写字母和0-9个数字再次如何preg替换emaail以允许'@'charecter和字母数字。< / p>
Q3 :检查用户尝试登录的用户与注册用户完全匹配的最佳方式是什么?
Q4 :黑客对我的会话变量有什么危险?
PHP代码
<?php
session_start();
require_once 'db_conx.php';
$email = preg_replace ('#[^A-Z, 0-9 ]#i', '', $_POST['email']);
$pwd = preg_replace ('#[^A-Z, 0-9 ]#i', '', $_POST['pwd']);
if ($uname == '' || $pwd == ''){
echo '<span style="color:#F00">Please fill in all login details.</span>';
} else {
$Result = mysql_query("SELECT * FROM users WHERE uemail = '$uname' && pwd = '$pwd'")
or die (mysql_error());
while($row = mysql_fetch_array($Result)){
$_SESSION['Sname'] = $row['firstname'];
$_SESSION['Slname'] = $row['lastname'];
$_SESSION['SUid'] = $row['uid'];
$_SESSION['Semail'] = $row['uemail'];
$_SESSION['Suid'] = $row['uid'];
$_SESSION['Szip'] = $row['zip'];
}
if (mysql_num_rows($Result) > 0){
header ('Location: ../user.php');
} else {
echo '<span style="color:#F00">Your account details do not match, please check your details and try again or try to recover your account if you forgot your password</span>';
}
}
?>
感谢。
答案 0 :(得分:4)
<强> Q1 强>
而不是使用header( 'Location...)
你可以使用
echo '<meta http-equiv="refresh" content="0; URL= http://something.com">';
修改强> 我相信你也可以使用以下内容。骰子应该允许重定向,但根据我的经验,它并不总是与jquery相处。
header('Location: http://something.com');
die();
如果您在同一页面上的jquery中使用event.preventDefault();
,这将特别有用,这几乎总是会导致标头位置重定向被忽略。当您使用get请求在索引文件中包含php页面时,此方法也适用,从而导致类似http://somesite.com/index.php?page=home
的网址
编辑以上信息错误它不适合我,因为php已经发送了标题。我是个白痴。
而不是这个元刷新,你可以这样做,这应该产生所需的结果。
echo '<script type="text/javascript">window.location = "yoururlhere"</script>';die;
<强> Q2 强>
$step1 = preg_replace('#[^A-Z, 0-9 ]#i', $_POST["variable"]);
$step2 = strtolower($step1);
echo $step2;
<强> Q3 强>
这是一个难以回答的问题,但基本上你想要在那里哈希密码,然后检查它是否与数据库中的密码匹配。这是一个简短的伪代码。
$username = $db->real_escape_string(strip_tags($_POST["username"]));
$password = hash('sha512', $salt.$_POST["Password"});
$db->query("SELECT * FROM `usertable` WHERE `Username`='$username' AND `Password`='$password' AND Username IS NOT NULL AND Username != '' LIMIT 1");
$result = $db->get();
if(!$result){
//the query returned a null result, so the username or password was incorrect.
}else{
//set user session and log them in.
}
<强> Q4 强> 我不是专家,但这完全取决于应用程序的体系结构以及如何设置会话和cookie。我认为使用formkeys并阻止xss,rfi,sql注入和lfi,然后担心会话变量。在尝试保护用户会话时,获得解决上述问题的经验将为您提供信心和更广泛的理解。
可以从php.net/manual/en/session.security.php和stackoverflow.com/questions/328/php-session-security
获取更多信息感谢DanFromGermany的建议,他改进了这个答案。