在这里阻止SQL注入的最佳做法是什么?

时间:2015-03-16 19:34:49

标签: php sql sql-injection

$query = 'SELECT ROW FROM TABLE LIMIT' . $start . ', ' . $limit;

$ start和$ limit是用户输入,所以我认为可以通过为$ start输入类似于1;CREATE DATABASE A;的内容来注入,这将创建一个新的数据库'A'。什么是防止这种情况的最佳做法?请具体,包括示例代码将很好。

4 个答案:

答案 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)使用PDOMySQLi界面来防止代码注入不当,请勿使用原生mysql