每当我想运行 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];
最佳答案
通常,使用 PDO 绑定(bind)变量是实现一致的、我不必考虑注入(inject)开发的最佳方法。
当您完全控制查询时,除了让自己习惯性地随时接触良好实践外,没有理由需要准备它。
作为旁注,我会避免在任何生产代码中使用 * 并明确指定您想要的字段。
我会清理您当前的用户输入数据,以避免对过去可能输入的内容产生任何担忧。
关于php - 如果在查询中不考虑用户输入,使用 mysqli_query() 是否危险?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28922271/