0

按照我的查询的正确编码以使用准备好的语句,我有这个查询:

$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 注入开放?提前谢谢了!

4

1 回答 1

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');在函数或页面的开头

于 2012-08-06T01:52:13.637 回答