【发布时间】: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