PHP: Prepared Statements 无法从单引号中转义
PHP: Prepared Statements cannot escape from single quotes
我正在向 MySql 中输入值以进行注册。由于 'single quotes' 问题,我使用了准备好的语句。通常我使用的是 addslashes 但它不适用于所有 sql 查询,仅适用于特定行。让我解释一下:
注册很简单 activity。
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 应用程序确实调用了 $conn->prepare
,但它使用的是完整的 SQL 语句,该语句是在其他地方使用字符串修改构建的。它没有任何参数绑定的占位符。
简而言之,您正在执行 sql 客户信任您的命令。
我正在向 MySql 中输入值以进行注册。由于 'single quotes' 问题,我使用了准备好的语句。通常我使用的是 addslashes 但它不适用于所有 sql 查询,仅适用于特定行。让我解释一下:
注册很简单 activity。
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 应用程序确实调用了 $conn->prepare
,但它使用的是完整的 SQL 语句,该语句是在其他地方使用字符串修改构建的。它没有任何参数绑定的占位符。
简而言之,您正在执行 sql 客户信任您的命令。