header('Location: success.php');
,但它没有帮助。这是我的server.php代码:
<?php
session_start();
$message = "Wrong input";
$username = "";
$email = "";
$errors = array();
$db = mysqli_connect('localhost', 'root', 'root', 'example');
if(isset($_POST['register'])) {
$username = mysqli_real_escape_string($db, $_POST['username']);
$email = mysqli_real_escape_string($db, $_POST['email']);
$password = mysqli_real_escape_string($db, $_POST['password']);
if(empty($username) || empty($email) || empty($password)) {
echo "<script type='text/javascript'> alert('$message');</script>";
array_push($errors, "err");
}
}
if(count($errors) == 0) {
$pass = md5($password);
$query = "INSERT INTO users (username, email, password) VALUES ('$username', '$email', '$pass')";
mysqli_query($db, $query);
header('Location: success.php');
}
?>
答案 0 :(得分:1)
f5将再次发送最后一个请求,因此您无法阻止它
如果你想阻止它,你应该在创建一个新用户之前添加一些测试(检查用户是否是新的,验证电子邮件...)并将其存储在db
中并更改密码的md5哈希值。你应该使用salt + sha *哈希解决方案。您应该考虑使用preparedStatement更新代码
答案 1 :(得分:0)
你在这里获得垃圾数据的原因是你没有验证逻辑。每个应用程序必须至少进行某种表面参数清理,例如删除无关的空格,强制某些字段的大写或大写,以及剥离任何不需要的字符。
然后,您需要检查所需的字段是否存在,并且采用可接受的形式。例如,电子邮件地址必须至少包含@
,名称必须至少包含一个字母,依此类推。不同的字段类型有不同的要求,通常密码具有最多的约束,因为您可能需要强制执行最小/最大长度,大写字母和/或数字的存在以及其他此类注意事项。
当且仅当数据通过了scruitiny时,您是否继续进入应用程序必须执行的创建阶段验证某些字段的唯一性。这通常需要快速检查表格:
SELECT COUNT(*) FROM users WHERE username=?
请注意,此检查仅被视为建议,此处收集的信息将立即被视为过时。它可用于以错误的形式向用户呈现信息。它在代码中不可信任,也就是说,您的数据库可以并且将在执行该语句后发生更改,从而使任何测试无效。
第三步是提交记录,实际插入它。为了防止重复,您需要对必须唯一的任何字段设置UNIQUE
约束。您还需要拥有捕获这些错误的代码,并以他们能够理解的形式将它们重新呈现给用户。
如果这听起来像很多工作,那是因为它是。 不要手工编写所有这些代码,这是浪费时间,你会错的。使用Communicating with Other Fragments为您提供此类基础。它们有各种各样的口味,从非常轻的development framework到极其全功能的Fat-Free Framework以及它们之间的所有色调。这些以不同的方式实现了我所谈论的一切,语法和方法可以有很大不同,但原则是相同的。
找一个你喜欢的,好好学习,并遵循他们的社区最佳实践。