$query = 'SELECT ROW FROM TABLE LIMIT' . $start . ', ' . $limit;
$ start和$ limit是用户输入,所以我认为可以通过为$ start输入类似于1;CREATE DATABASE A;
的内容来注入,这将创建一个新的数据库'A'。什么是防止这种情况的最佳做法?请具体,包括示例代码将很好。
答案 0 :(得分:1)
像你提到的请求
$start = 1;CREATE DATABASE A;
无法正常工作,因为默认情况下PHP已禁用堆叠查询。
$ start和$ limit是数字,所以只要说PHP那些变量是整数:
$query = 'SELECT ROW FROM TABLE LIMIT ' . (int)$start . ', ' . (int)$limit;
这将使SQL注入无法进行,但黑客仍然可以破解该请求并获取一些信息(例如,错误的痕迹,mysql错误),因此您只需要通过正则表达式验证$ start和$ limit。
此外,准备好的陈述是预防和注射的最佳方式。
答案 1 :(得分:1)
最佳做法是将准备好的语句与PDO或mysqli一起使用,例如
$stmt = $db->prepare("SELECT ROW FROM TABLE LIMIT :limit1, :limit2");
$sth->bindParam(':limit1', $start, PDO::PARAM_INT);
$sth->bindParam(':limit2', $limit, PDO::PARAM_INT);
$stmt->execute();
答案 2 :(得分:0)
您可以使用以下内容简单地检查它是否为数值:
if (is_numeric($start) && is_numeric($limit)) {
$query = 'SELECT ROW FROM TABLE LIMIT' . $start . ', ' . $limit;
}
答案 3 :(得分:0)
1)你知道start和limit需要是整数,所以强制将它们转换为整数类型。
2)使用PDO
或MySQLi
界面来防止代码注入不当,请勿使用原生mysql