PHP:准备好的语句无法从单引号中逃脱

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP:准备好的语句无法从单引号中逃脱相关的知识,希望对你有一定的参考价值。

我正在为mysql插入值以进行注册。由于“单引号”问题,我使用预备语句。通常我使用的是addslashes但它不适用于所有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();
         }
   }
}

?>

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

答案

你没有使用准备好的陈述!您的应用程序是一场等待发生的巨大安全灾难

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

简而言之,您正在执行的是执行客户端信任的sql命令。

以上是关于PHP:准备好的语句无法从单引号中逃脱的主要内容,如果未能解决你的问题,请参考以下文章

如何使用索引号将数据发送到mysqli(准备好的语句)

运行准备好的语句 (MySQL/PHP)

在 SQLite3 和 PHP 中使用准备好的语句

使用准备好的语句的 PHP 注册脚本

MySQL准备好的语句在PHP中抛出错误

对于 postgresql,java sql 准备好的语句不能正确转义