对于我的查询的正确编码以使用预准备语句,我有这样的查询:
$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注入开放?非常感谢提前!
答案 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');