如何验证整数值以避免SQL注入?

时间:2012-03-12 13:16:57

标签: php mysql sql integer sql-injection

避免SQL注入定义值类型(如数字)的最佳方法是验证值;因为与mysqli准备相比,这样做更容易。在PHP中,我们可以做到这一点。

1. if(!is_numeric($value)) {$value=0;}
2. $value=floatval($value);
3. $value=intval($value);
4. $value=$value * 1;

最可靠的是什么?还是一个更好的主意?

更新:虽然我在原始问题中已经说过,但大多数人都强调参数化查询的用处。当然,这是避免SQL注入的最有效方法。但是当我们可以简单地验证整数数值时;恕我直言,没有必要进行参数化。

6 个答案:

答案 0 :(得分:5)

对于整数和浮点数,如果您不想进行参数化查询,可以使用它。

$clean_number = (int)$value;

$clean_number = (float)$value;

这些实际上将值转换为intfloat,这比intval()floatval()更快,例如因为它不会遇到函数开销。

答案 1 :(得分:3)

我更喜欢使用the filter extension

$id = filter_var($id, FILTER_SANITIZE_NUMBER_INT);

你应该明确去参数化查询。

答案 2 :(得分:2)

您可以使用intval()将值强制转换为整数。避免SQL注入的最可靠方法是使用参数化查询。

答案 3 :(得分:2)

$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

$sth = $dbh->prepare('SELECT * FROM table WHERE id = :id');
$sth->bindParam(':id', $id, PDO::PARAM_INT); 
$sth->execute();
$result = $sth->fetchAll(PDO::FETCH_ASSOC);

答案 4 :(得分:1)

如果你想要一个经验丰富的建议,你必须改变主意。完全。

事实上,作为您主要关心的事情是世界上最无法忽视的事情。您可以使用这种或那种方式,没有丝毫差异。没有“最可靠”的方式。这只是做同样的几种方式。

另一方面,“没有必要参数化”是一种严重的妄想 参数化查询只有在整个站点中明确使用时才能做任何好事,没有例外。一个例外可以破坏所有防守。

更不用说参数化查询可以让您的生活更轻松,更轻松 准备好的语句不是一些由一些爱好者在这个网站上传播的丑陋代码。它实际上是编写安全代码的快速而简洁的方式 比如说,使用cetver十几行的代码可以只用一个完成:

$data = $db->getAll("SELECT * FROM table WHERE id = :placeholder:",$id);

并且非常安全 没有丑陋的手动装订 没有易出错的手动铸造。

另一个向您展示占位符

的强大功能的示例
$sql = "SELECT * FROM table WHERE tstamp BETWEEN ?i AND ?i AND flag=?s AND IN in (?a)";
$data = $db->getAll($sql,$min,$max,$flag,$array_of_ids);

两行。

我对PDO不太好,但即使没有连接也会像打开代码行

$in  = implode(',', array_fill(0, count($array_of_ids), '?'));
$sql = "SELECT * FROM table WHERE tstamp BETWEEN ? AND ? AND flag=? AND id IN ($in)"
$sth = $dbh->prepare($sql);
$stmt->bindValue(1, $min);
$stmt->bindValue(2, $max);
$stmt->bindValue(3, $flag);
foreach ($array_of_ids as $i => $id) {
  $stmt->bindValue(($i+4), $id);
}
$sth->execute();
$result = $sth->fetchAll(PDO::FETCH_ASSOC);

与您当前的手动演员相当。

这实际上是编程的力量。
可以写一个程序来为他们做所有肮脏的工作 这个网站上几乎从未见过的方法。

Sapienti坐

答案 5 :(得分:-1)

你可以使用这个函数mysql_real_escape_string()来逃避特殊字符,但你正在做什么来保护sqli攻击。