MySQLi准备好了声明,我不确定哪些变量需要占位符

时间:2012-08-06 01:37:03

标签: php mysql prepared-statement

对于我的查询的正确编码以使用预准备语句,我有这样的查询:

$sql = "SELECT *
        FROM photos
        WHERE g_id = ?
        LIMIT $curPage,".$totalPix;
$result = $conn->query($sql) or die(mysqli_error());
$row = $result->fetch_assoc();

这里的问题是,我应该使用$curPage$totalPix的预准备语句占位符吗?如果是,我会这样做:

$sql = "SELECT *
        FROM photos
        WHERE g_id = ?
        LIMIT ?,".?;
$gid = $i; $lm = $v1; $mt = $v2 
$stmt = $conn->prepare($randPic);
$stmt->bind_param('iii', $gid, $lm, $mt);
$stmt->bind_result($p_fname);
$stmt->execute();
$stmt->store_result();
$stmt->fetch();

...或者变量$curPage$totalPix是不是让查询对SQL注入开放?非常感谢提前!

1 个答案:

答案 0 :(得分:0)

你正在使用?在正确的地方(因为它只能用于变量绑定)。但是,在查询中简单地放置$curPage or $totalPix是不安全的。我假设它们必须是整数,所以要保证安全并不是很难。

使用intval($curPage) and intval($totalPix)确定它们。

但是,如果你想允许字符串,那就有点难了。不确定它是不是解决方案,但我打赌通过检查它是否是你设计的东西来“白名单”可能的选项。

例如:SELECT * FROM sometable WHERE $somevar = ?变量($ somevar)仍然可以是'1 --',它将返回所有行。但很可能你的意思是$ somevar ='id'或$ somevar ='email'。这可以通过一些if语句轻松检查,并且不会影响性能。也许有点打字,但如果你没心情打字我建议使用一些框架查询或某种ORM。

功能或页面开头的

if ($somevar !== 'id') exit('Cannot find entries');