如果在查询中没有考虑用户输入,那么使用mysqli_query()是危险的吗?

时间:2015-03-08 01:55:55

标签: php mysql

每当我想运行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];

2 个答案:

答案 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();

如果电子邮件列中包含恶意数据,则可能会导致注入。