【发布时间】:2014-12-14 11:07:26
【问题描述】:
我制作了以下显示博文的脚本。 $_MULT[0] 显示“博客”,$_MULT[1] 显示博文的 ID。
我想知道: 1) 这个脚本对于 SQL 注入安全吗? 2)如果我删除 ctype_digit() 怎么办?那它还会安全吗?
<?php
error_reporting(E_ALL);
$db = new PDO('mysql:host=localhost;dbname=blablabla','blablabla','passwd');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
echo '<h2>Blog</h2>';
$iTijd = time();
$_MULT = explode("/", $_GET['p']);
if($_MULT[0] == 'blog' AND isset($_MULT[1]))
{
if(ctype_digit($_MULT[1]))
{
// query
$sql = "SELECT Titel, Post, Datum FROM Blog WHERE Id = :Id AND Status = :Status AND Datum < :Tijd LIMIT 1";
// prepare query
$stmt = $db->prepare($sql);
// bind values
$stmt->bindParam(':Id', $a=$_MULT[1], PDO::PARAM_INT);
$stmt->bindParam(':Status', $a='1', PDO::PARAM_INT);
$stmt->bindParam(':Tijd', $a=$iTijd, PDO::PARAM_INT);
// execute query
$stmt->execute();
// select data from db
$aRow = $stmt->fetch(PDO::FETCH_ASSOC);
// show blogpost
echo '<h4>'. $aRow['Titel'] .'</h4><br />';
$datum = $aRow['Datum'];
$datum = date("d-m-Y", $datum);
echo '<i>'. $datum.'</i> - '. $aRow['Post'];
}
else
{
echo "<h2>404 - Pagina niet gevonden</h2>";
}
}
else
{
// query
$sql = "SELECT Id, Titel FROM Blog WHERE Status = :Status AND Datum < :Tijd ORDER BY Id DESC LIMIT 10";
// prepare query
$stmt = $db->prepare($sql);
// bind values
$stmt->bindParam(':Status', $a='1', PDO::PARAM_INT);
$stmt->bindParam(':Tijd', $a=$iTijd, PDO::PARAM_INT);
// execute query
$stmt->execute();
echo '<br /><ul>';
// select data from db
while($aRow = $stmt->fetch(PDO::FETCH_ASSOC))
{
echo '<h4><li><a href="http://myurl.ext/blog/'. $aRow['Id'] .'" title="'. $aRow['Titel'].' ">'. $aRow['Titel'] .'</a></li>
</h4>';
}
echo '</ul>';
if($stmt->rowCount() == 0)
{
echo '<p>Er zijn nog geen blogposts toegevoegd.</p>';
}
}
?>
这样安全吗?我该怎么办?就这样吧?
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
【问题讨论】:
-
你有没有考虑过使用
bindValue(':Id', $_MULT[1], PDO::PARAM_INT)而不是bindValue(':Id', $a=$_MULT[1], PDO::PARAM_ING)那种奇怪的hack? -
是的,这还不够奇怪:/ 所以我不得不使用 $a=$_MULT[1]
-
bindValue没用?? -
它没有用,但是当我这样做时它起作用了 $a=$_MULT[1] 但这不是我打开这个话题的原因,我想知道我这样做的方式是否安全,以及当我删除 ctype_digit 时会发生什么。那么它(仍然)安全吗?
-
对我来说看起来很安全。您可能想查看
filterextension。关于PDO::ATTR_EMULATE_PREPARES属性,它模拟了准备好的语句的“准备好的”部分(即在插入变量之前它不会将准备好的语句发送到数据库服务器)。其他人has asked about it.