2014-10-19 84 views
1

我製作了以下顯示博文的腳本。 $ _MULT [0]顯示'blog',$ _MULT [1]顯示blogpost的ID。PHP:這是安全的嗎?

我在想: 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); 
+0

你有沒有考慮使用'bindValue( ':ID',$ _MULT [1],PDO :: PARAM_INT) '而不是那種奇怪的'bindValue(':Id',$ a = $ _ MULT [1],PDO :: PARAM_ING)''? – 2014-10-19 09:38:49

+0

是的,沒有工作奇怪:/所以我不得不使用$ a = $ _ MULT [1] – 2014-10-19 09:41:09

+0

'bindValue'沒有工作? – 2014-10-19 09:47:38

回答

-1

奇怪的代碼,但如果你想使用它改變,如果語句:

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

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