参数化语句和安全性

问题描述:

我想使这个页面安全,但我不知道我应该从哪里开始。因为我昨天注入了一些资源,所以我逃避了mysql的转义字符串,但是我没有太多帮助。我不知道任何有关PDO的事情,你能把我搞定吗?这是代码。参数化语句和安全性

<?php 
//category.php 

require_once('startsession.php'); 
require_once('php/mysql_prisijungimas.php'); 
include 'connect.php'; 

//first select the category based on $_GET['cat_id'] 
$sql = "SELECT 
      cat_id, 
      cat_name, 
      cat_description 
     FROM 
      categories 
     WHERE 
      cat_id = " . mysql_real_escape_string($dbc, trim($_GET['id'])); 

$result = mysql_query($sql); 

if(!$result) 
{ 
    echo 'The category could not be displayed, please try again later.' . mysql_error(); 
} 
else 
{ 
    if(mysql_num_rows($result) == 0) 
    { 
     echo 'This category does not exist.'; 
    } 
    else 
    { 
     //display category data 
     while($row = mysql_fetch_assoc($result)) 
     { 
      echo '<h2>Topics in &prime;' . $row['cat_name'] . '&prime; category</h2><br />'; 
     } 

     //do a query for the topics 
     $sql = "SELECT 
        topic_id, 
        topic_subject, 
        topic_date, 
        topic_cat 
       FROM 
        topics 
       WHERE 
        topic_cat = " . mysql_real_escape_string($dbc, trim($_GET['id'])); 

     $result = mysql_query($sql); 

     if(!$result) 
     { 
      echo 'The topics could not be displayed, please try again later.'; 
     } 
     else 
     { 
      if(mysql_num_rows($result) == 0) 
      { 
       echo 'There are no topics in this category yet.'; 
      } 
      else 
      { 
       //prepare the table 
       echo '<table border="1"> 
         <tr> 
         <th>Topic</th> 
         <th>Created at</th> 
         </tr>'; 

       while($row = mysql_fetch_assoc($result)) 
       {    
        echo '<tr>'; 
         echo '<td class="leftpart">'; 
          echo '<h3><a href="topic.php?id=' . $row['topic_id'] . '">' . $row['topic_subject'] . '</a><br /><h3>'; 
         echo '</td>'; 
         echo '<td class="rightpart">'; 
          echo date('d-m-Y', strtotime($row['topic_date'])); 
         echo '</td>'; 
        echo '</tr>'; 
       } 
      } 
     } 
    } 
} 
?> 
+0

那么这将无法与MySQL的扩展。 PDO支持[预先准备的语句](http://php.net/manual/en/pdo.prepared-statements.php) – 2013-05-13 14:12:24

+0

[伟大的逃避现实(或:你需要知道如何处理文本中的文本)](http ://kunststube.net/escapism/) – deceze 2013-05-13 14:27:32

在你的情况下环绕mysql_real_escape_string加上引号,像这样:

SELECT * FROM table WHERE ID = '".mysql_real_escape_String($_POST['ID'])."' 

注意额外的单引号。这将使它更安全,但使用准备好的语句更好。除了喜欢在mysql_query上使用预处理语句外,从php版本5.5.0开始,函数mysql_query()将被弃用。

在stackoverflow上还有另一个主题,它提出了“如何防止PHP Pdo中的SQL注入”问题。你可能会发现一些样本和额外的信息: How can I prevent SQL injection in PHP?

+0

谢谢你的帮助。 – 2013-05-13 15:02:31