php - 邮箱验证错误

标签 php pdo

这是我在 stackoverflow 上的第一篇文章,我不会说英语,但我可以尽量弄清楚我的问题:)

我有一个 PHP 注册表单和两个语句:

第一个声明:例如,如果没有另一个伪/电子邮件,则在我的表“用户”中搜索。

$request = $db->prepare("SELECT * FROM users WHERE USE_USERNAME = :username AND USE_EMAIL = :email AND USE_PASSWORD = :password");
$request->bindParam(':username', $username, PDO::PARAM_STR);
$request->bindParam(':email', $email, PDO::PARAM_STR);
$request->bindParam(':password', $password, PDO::PARAM_STR);
$request->execute();
var_dump($request);
while ($row = $request->fetchAll(PDO::FETCH_ASSOC)){
    if ($username == $row['USE_USERNAME']){ ...

第二个声明:如果用户输入了正确的数据,我可以将输入插入到我的数据库中。

$request = $db->prepare("INSERT INTO users (USE_USERNAME, USE_EMAIL, USE_PASSWORD) VALUES (:username, :email, :password)");
            $request->bindParam(':username', $username, PDO::PARAM_STR);
            $request->bindParam(':email', $email, PDO::PARAM_STR);
            $request->bindParam(':password', $pass_hache, PDO::PARAM_STR);
            $request->execute();

我的问题:

当我在输入中插入 'OR 1=1' 时,我可以在数据库中插入相同的电子邮件地址。

我在这个网站上搜索了一个解决方案,并将这些行添加到我的数据库连接中:

    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

但我的数据插入甚至我在我的 PHP 代码中放入错误消息(在我的 while 循环中使用 Javascript 弹出窗口)。

我是初学者,我正在寻找类似的问题,但如果您有答案,谢谢您的帮助:)

祝你有美好的一天:)

编辑 : 我会在我管理 PHP 中的错误时向你解释 :

while ($row = $request->fetchAll(PDO::FETCH_ASSOC)){
    if ($username == $row['USE_USERNAME']){
        ?>
        <script type="text/javascript">
            alert("Erreur#5 : Pseudonyme Faux !");  //Cas dans lequel les identifiants sont incorrects.
            document.location.href="subscribe.php";
        </script>
        <?php
        $error++;

这很平庸,但我有一个从 0 开始的变量 $error,我递增它以停止 PHP 脚本。

唯一的用户名和电子邮件存在错误。在我的 prepare 语句之前,我的错误起作用了,但现在我想防止我的表单受到 SQL 注入(inject)。

最佳答案

这是一个有很多怪癖的问题:

1st - 你应该用类似的东西验证你的输入 filter_var('bob@example.com', FILTER_VALIDATE_EMAIL) http://php.net/manual/en/function.filter-var.php

第二 - 你应该在你的数据库中放置一个关于你的电子邮件的唯一性约束 ALTER TABLE user ADD UNIQUE unique_index_email(电子邮件);

第三 - 如果用户名和密码也相同,您的查询只会返回电子邮件。您应该只查询电子邮件。就像是 $request = $db->prepare("SELECT * FROM users WHERE USE_EMAIL = :email"); 因为这将确保如果 1 存在,它将被返回

第四 - 我强烈建议您不要在数据库中保留密码,只保留散列值。你有加密强大的库作为 php 库可用,并内置于 some这应该可以解决问题

关于php - 邮箱验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35987814/

相关文章:

php - $this->Agreements->save() - 只创建一条记录,为什么?

PHP 将 Array 转换为 JSON 问题?

php - 根据mysql中的值连接2个以上的表

php - PDO 执行数组 - 安全吗?

php - 当提供空字符串时如何强制增加主键?

php - 通过 pdo_ibm 模块连接到 db2 手动配置错误 SQL10007N -5005

php is_function() 判断变量是否为函数

php - HY093 : Wrong number of parameters - positional

php - 嵌套 PDO 查询失败?

PHP 命名空间的奇怪行为。调用PDO方法又触发__autoload?