PHP:htmlspecialchars&真正的逃脱字符串&引用

时间:2014-10-14 17:24:04

标签: security pdo mysql-real-escape-string quote htmlspecialchars

我现在使用PDO编写PHP5编程,不使用预处理语句,而只是使用“普通”查询:

$oQuery = $oDatabase->query(
  "SELECT
    Content
  FROM
    CMS
  WHERE
    Title = '". $this->TITLE ."'
  LIMIT 1"
);

$aItem = $oQuery->fetch();

echo stripslashes($aItem['Content']);

现在我有两个问题:

  1. 如果我想插入一些内容,这是否足以保护SQL注入?

    $something = quote($something);
    
  2. HTML SQL注入是否足够?

    $something = htmlspecialchars($something, ENT_QUOTES);
    
  3. 请注意ENT_QUOTES,因为这也将取代:'


    这个怎么样?

    $this->TITLE = mysql_real_escape_string($this->TITLE);
    
    $oQuery = $oDatabase->query(
      "SELECT
        Content
      FROM
        CMS
      WHERE
        Title = '". $this->TITLE ."'
      LIMIT 1"
    );
    
    $aItem = $oQuery->fetch();
    
    echo stripslashes($aItem['Content']);
    

    或者我还应该使用准备好的陈述吗?

    谢谢!

2 个答案:

答案 0 :(得分:0)

不,HTML和SQL根据上下文有不同的特殊字符。所以他们需要一种不同的,对情境敏感的治疗方法。

即使引用的HTML属性值(使用double quotessingle quotesMySQL string literals,乍一看似乎相似,也有不同的特殊字符集和不同的转义序列。特别是if MySQL uses backslashes for escape sequences, htmlspecialchars won’t prevent SQL injections in string literals

答案 1 :(得分:0)

我认为你误解了一些事情。

HTML注入:

htmlspecialchars将特殊字符转换为HTML实体。

这就是它,它只对将数据显示到网页有帮助,以便有人不会尝试注入html。例如:

echo '<p> Welcome: ' . htmlspecialchars($_GET['username']) . '</p>';

SQL注入

您正在使用PDO,这很棒,但您未能准备好查询。

你不能手动逃避准备陈述的全部内容。

在没有准备的情况下查询非常非常糟糕,你应该做好准备。

$oQuery = $oDatabase->prepare(
  "SELECT
    Content
  FROM
    CMS
  WHERE
    Title = :title
  LIMIT 1"
);
$oQuery->execute(array('title'=>$this->TITLE));
$aItem = $oQuery->fetch();
$content = $aItem['Content'];

仅当没有参数

时才使用query
$oDatabase->query("SELECT Content FROM CMS");

否则总是准备避免sql注入