php:prepared语句不能从单引号转义

vbopmzt1  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(359)

我正在向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();
         }
   }
}

?>

正如你所看到的,我完全按照事先准备好的陈述来工作。但我不明白为什么单引号不能插入数据库。更奇怪的是:我可以插入双引号。

68bkxrlz

68bkxrlz1#

你没有使用事先准备好的语句!你的应用程序是一个巨大的安全灾难等待发生
您正在android应用程序中生成一个sql字符串,并将其发布到web应用程序。web应用程序确实调用 $conn->prepare 但它使用的是一个完整的sql语句,它是在其他地方用字符串mung构建的。它没有任何用于参数绑定的占位符。
简而言之,您所做的是执行客户机信任地提供给您的sql命令。

相关问题