如何在 PHP 登录脚本中验证来自 SQL 的串联?

Posted

技术标签:

【中文标题】如何在 PHP 登录脚本中验证来自 SQL 的串联?【英文标题】:How do I validate a concatenation from SQL in a PHP login script? 【发布时间】:2018-07-06 14:39:06 【问题描述】:

我正在编写一个包含 2 个字段(全名和密码)的登录脚本。我的 SQL 表有 ID、名字、姓氏、密码。用户将从一个选择中选择他们的名字,选择是从他们的名字和姓氏(全名)的串联中动态填充的,然后输入他们的密码。

//my SQL table
ID  |   firstname  |  lastname  |  password
-------------------------------------------
01      John          Smith        ezaccess


//my SQL query
$query2 = "SELECT CONCAT(firstname, ' ', lastname) AS fullname FROM tbl_users";
$result1 = mysqli_query($DBcon, $query2);


//my html select
<select class="form-control" name="fullname" required>
        <option value="">Select name</option>
        <?php while($row1 = mysqli_fetch_array($result1)):;?>
        <option value="<?php echo $row1["fullname"];?>"><?php echo $row1["fullname"];?></option>
        <?php endwhile;?>
</select>

所以这就是我迷路的地方,新创建的“全名”选择的验证。我只是更好地创建一个全名 SQL 列,然后验证它吗?我知道我刚刚从查询中创建了全名数组,但不知道如何继续使用它来验证我在上一个查询中的登录。

if (isset($_POST['btn-login'])) 

$fullname = strip_tags($_POST['fullname']);
$password = strip_tags($_POST['password']);

$fullname = $DBcon->real_escape_string($fullname);
$password = $DBcon->real_escape_string($password);

$query = $DBcon->query("SELECT * FROM tbl_users WHERE firstname AND lastname='$fullname'");
$row=$query->fetch_array();

$count = $query->num_rows;

if (password_verify($password, $row['password']) && $count==1) 
    $_SESSION['userSession'] = $row['user_id'];
    header("Location: home.php");
 else 
    $msg = "<div class='alert alert-danger'>
                <span class='glyphicon glyphicon-info-sign'></span> &nbsp; Invalid name or Password !
            </div>";

$DBcon->close();

【问题讨论】:

为什么要在顶部查询而不是底部查询中使用 concat?应该是同一个过程。 $query = $DBcon-&gt;query("SELECT * FROM tbl_users WHERE firstname AND lastname='$fullname'"); 改为$query = $DBcon-&gt;query("SELECT * FROM tbl_users WHERE CONCAT(firstname, ' ', lastname)='$fullname'"); 你也应该停止使用转义字符串,转义密码在这里没有用处,你应该使用带有参数的准备好的语句作为全名。 给他们一半登录所需的数据似乎有点奇怪,大多数系统都希望你全部输入。 另外while($row1 = mysqli_fetch_array($result1)):; 应该删除尾随分号。 【参考方案1】:

虽然我玩过串联,但由于某种原因我没有让它工作,但这对最后一个查询起到了作用:

$query = $DBcon->query("SELECT * FROM tbl_users WHERE CONCAT(firstname, ' ', lastname)='$fullname'");

请注意,在这种情况下安全性不是优先事项,因此我的代码不是最安全的。

【讨论】:

以上是关于如何在 PHP 登录脚本中验证来自 SQL 的串联?的主要内容,如果未能解决你的问题,请参考以下文章

Facebook SDK:验证请求,以便 php 服务器知道它来自登录用户

如何在登录表单php上使用密码验证

SQL Server 2008 Windows 身份验证登录错误:登录来自不受信任的域

使用php和ajax实现登录

用于 SQL Server 登录表单的 PHP 脚本

用于显示来自 SQL 数据库的数据的 php 脚本