我用下面的代码做了一张报名表。正如您在图片底部看到的,最后一行显示header(“location:../signup.php?signup=success”);退出();当我尝试注册时,顶部的url显示signup=success。但当我进入数据库时,数据没有被插入。
请帮助我:(我检查了名称/变量的拼写错误,但没有。我还检查了链接/连接,我相信它是正确的。表单正确链接到正确的php文件,该文件在下面。
<?php
if(isset($_POST['submit'])) {
include_once 'dbh.inc.php';
$first = $_POST['first'];
$last = $_POST['last'];
$email = $_POST['email'];
$uid = $_POST['uid'];
$pwd = $_POST['pwd'];
if (empty($first) || empty($last) || empty($email) || empty($uid) || empty($pwd)) {
header("Location: ../signup.php?signup=empty"); exit();
}
else {
if (!preg_match("/^[a-zA-z]*$/", $first) || !preg_match("/^[a-zA-z]*$/", $last)) {
header("Location: ../signup.php?signup=flnameinvalid"); exit();
}
else {
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
header("Location: ../signup.php?signup=emailinvalid"); exit();
}
else{
$mysql = "SELECT * FROM users WHERE user_uid='uid'";
$result = mysqli_query($conn, $mysql);
$resultCheck = mysqli_num_rows($result);
if ($resultCheck > 0) {
header("Location: ../signup.php?signup=uidtaken"); exit();
}
else {
$hashedPwd = password_hash($pwd, PASSWORD_DEFAULT);
$sql = "INSERT INTO users (user_first, user_last, user_email, user_uid, '$hashedPwd') VALUES (?, ?, ?, ?, ?);";
$stmt = mysqli_stmt_init($conn);
if (!mysqli_stmt_prepare ($stmt, $sql)){
echo "SQL error!";
}
else {
mysqli_stmt_bind_param ($stmt, "sssss", $first, $last, $email, $uid, $hashedPwd);
mysqli_stmt_execute ($stmt);
}
header("Location: ../signup.php?signup=success"); exit();
4条答案
按热度按时间hgc7kmma1#
代码看起来不错,发现了一个问题。更换此线路
具有
下面是php的官方文档表单。你可以用例句核对公文
krcsximq2#
乍一看,我注意到你说你已经改正的列名不对。所以错误可能在这一部分:
试试这个:
anauzrmj3#
为什么在post请求中接受uid,通常会根据数据库自动确定(增量等)。
老实说,您需要重新编写大量代码,因为您的代码完全易受攻击,所以不会有一个解决方案。
记住只接受您需要的输入,顺便说一句,如果我要编辑我的uid,除了能够发送任何我喜欢的uid外,我还可以使其成为恶意负载,如:
它应该给我10000的uid,并且删除整个用户表,所以我给自己一个很棒的uid并不重要,因为现在整个表都被删除了。也可以这样转储整个数据库
10000; SELECT * FROM users;
不确定这些查询是否特别有效,但它们是易受攻击的。我知道这并不能完全回答您的问题,但我建议您重新编写大部分代码并使用良好的实践。
顺便说一句,您很可能得到了重定向,因为如果您启动初始的isset($\u post['submit']),然后点击每一条else语句,您就会收到成功消息。
z9smfwbn4#
在sql语句中,密码的列名设置为哈希密码的值。这将导致sql查询失败。
您需要表中列的名称。只要替换一下
whateverthiscolumnnameis
表中密码列的名称。编辑:
正如cillian collens所指出的,您确实应该清理您在其他查询中的输入和/或使用准备好的语句来抵御典型的sql注入攻击。