每当我想运行MySQL查询时,我都会准备我的语句:
$query = "SELECT * FROM users WHERE name = ?";
$stmt = mysqli_stmt_init($con);
$stmt->prepare($query);
$stmt->bind_param('s', $_POST['user']);
$stmt->execute();
$result = $stmt->get_result();
$assoc = mysqli_fetch_assoc($result);
但如果我不接受用户的任何信息呢?是这样的:
$query = "SELECT * FROM users";
$stmt = mysqli_stmt_init($con);
$stmt->prepare($query);
$stmt->execute();
$result = $stmt->get_result();
$assoc = mysqli_fetch_assoc($result);
和以下一样安全:
$assoc = mysqli_fetch_assoc(mysqli_query($con, "SELECT * FROM users"));
请记住,用户在创建帐户时可能仍然会在之前输入SQLi语句,现在我在没有准备的情况下选择它。
如果我只选择一个只存储数字的列(数据类型为double),该怎么办:
$assoc = mysqli_fetch_array(mysqli_query($con, "SELECT version FROM users ORDER BY version LIMIT 1"))[0];
答案 0 :(得分:2)
与PDO结合使用的变量通常是一致的,不必考虑注射开发的最佳方法。
当您完全控制查询时,除了让您在任何时候都习惯性地接受良好做法外,没有理由需要做好准备。
作为附注,我会避免在任何生产代码中使用*并明确指定您想要的字段。
我会清除您当前用户输入的数据,以避免担心过去可能输入的数据。
答案 1 :(得分:0)
如果您在另一个查询中使用返回的数据,那将是危险的。如你所知,我没有看到危险。
例如
$query = "SELECT email FROM useremails";
$stmt = mysqli_stmt_init($con);
$stmt->prepare($query);
$stmt->execute();
$result = $stmt->get_result();
$assoc = mysqli_fetch_assoc($result);
$query = "SELECT email FROM users where email = '" . $assoc['email'] . "'";
$stmt = mysqli_stmt_init($con);
$stmt->prepare($query);
$stmt->execute();
如果电子邮件列中包含恶意数据,则可能会导致注入。