【问题标题】:PHP: Prepared Statements cannot escape from single quotesPHP:准备好的语句不能从单引号中转义
【发布时间】:2018-08-31 07:35:18
【问题描述】:

我正在向 MySql 插入值以进行注册。由于“单引号”问题,我使用了准备好的语句。通常我使用的是addlashes,但它不适用于所有sql查询,只适用于特定的行。让我解释一下:

这是简单的注册活动。

我的代码的 Android 端:

 final String email=_email.getText().toString();
        final String password=_password.getText().toString();

        final String sqlcode ="Insert into login (email,password) VALUES ('"+email+"','"+password+"')";
        final String sqllogin="SELECT email FROM login WHERE email= '"+email+"'";

@Override
            protected Map<String, String> getParams() {
                Map<String,String> params=new HashMap<>();
                params.put("sqllogin",sqllogin);
                params.put(getString(R.string.sqlcode),sqlcode);
                return params;
            }

我的代码的 PHP 方面:

<?php

if ($_SERVER['REQUEST_METHOD'] =='POST'){

    $sqllogin = $_POST["sqllogin"];
    $sqlcode= $_POST["sqlcode"];

    require_once 'connect.php';

    mysqli_query($conn,"SET NAMES 'utf8'");

    $stmtcheck = $conn->prepare($sqllogin);
    $stmtcheck->execute();
    $stmtcheck->store_result();

      if ( $stmtcheck->num_rows >0) { // if email exists
      $result["message"] = "duplicate";

        echo json_encode($result);
        mysqli_close($conn);
        $stmtcheck->close();
      }
      else //if email !exists create one
      { 
        $stmtcheck->close();
        $stmtadd = $conn->prepare($sqlcode);

        if ($stmtadd->execute()) { 
            // it worked
            $result["message"] = "success";
            echo json_encode($result);
            mysqli_close($conn);
            $stmtadd->close();
         } else {
            // it didn't
            $result["message"] = "error";
            echo json_encode($result);
            mysqli_close($conn);
            $stmtadd->close();
         }
   }
}

?>

如您所见,我完全使用准备好的语句。但我不明白为什么单引号不插入数据库。 更奇怪的是:我可以插入双引号。

【问题讨论】:

  • 我看不到任何准备好的语句。不要将 SQL 查询从 android 发送到后端
  • 据我所知 $stmt 是准备好的声明。但我想,我知道错了
  • 您的 Android 代码不使用准备好的语句,并且会受到 SQL 注入攻击,具体取决于提供的电子邮件和密码。这是一个重大的安全风险。您的密码似乎也被保存为纯文本,这是另一个主要的安全风险。
  • 我需要在android中使用sql查询。因为当我想发送一个参数时,我正在使用 item.php,而且我使用了将近 50 次。我无法创建 50 个不同的 php 文件。所以我从 android 发送查询。

标签: php mysql mysqli escaping prepared-statement


【解决方案1】:

您没有使用准备好的语句!您的应用是一场等待发生的巨大安全灾难

您正在 Android 应用程序中生成一个 SQL 字符串并将其发布到 Web 应用程序。 Web 应用程序确实调用了$conn-&gt;prepare,但它使用了一个完整的 SQL 语句,该语句是在其他地方使用字符串修改构建的。它没有任何用于参数绑定的占位符。

简而言之,您所做的是执行客户端信任您提供的 sql 命令。

【讨论】:

  • 那么,您知道“为什么双引号有效而单引号无效”吗?通常两者都不起作用。
  • 您是否还在考虑解决问题,而不仅仅是发送带有电子邮件和密码的请求?
  • 我向 php.ini 发送了电子邮件和密码。我用了addlashes。现在它的工作
  • 仅供参考,如果您正确使用bind_param,则不需要使用addlashes
  • 效果很好。现在我在这之后使用这个 bind_param 而不是添加斜杠。我什至可以将这个参数与我的所有 sql 查询结合起来,比如这里 (sqlcode)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
相关资源
最近更新 更多