【问题标题】:PHP: Is this safe?PHP:这安全吗?
【发布时间】: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 时会发生什么。那么它(仍然)安全吗?
  • 对我来说看起来很安全。您可能想查看filter extension。关于PDO::ATTR_EMULATE_PREPARES 属性,它模拟了准备好的语句的“准备好的”部分(即在插入变量之前它不会将准备好的语句发送到数据库服务器)。其他人has asked about it.

标签: php mysql security pdo


【解决方案1】:

奇怪的代码,但如果你想使用它,请将 if 语句更改为:

if($_MULT[0] == 'blog' && ! empty($_MULT[1])) { ... }

if(ctype_digit( (string) $_MULT[1])) { ... }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 2011-03-20
    • 2017-03-09
    相关资源
    最近更新 更多