PHP Cookie 安全问题

Posted

技术标签:

【中文标题】PHP Cookie 安全问题【英文标题】:PHP Cookie Security Question 【发布时间】:2009-07-16 18:20:16 【问题描述】:

我有以下代码显示“每日新闻”, 由于我对 php 编码比较陌生,所以我想确保没有任何 关于我如何从 cookie 值中从数据库中进行选择的安全问题。谢谢。

if ($word_of_the_day) 
   $wotd = $wpdb->get_results("SELECT term,definition FROM glossary WHERE term = '$word_of_the_day'");
   foreach ($wotd as $term)  

elseif ($_COOKIE['WOTD']) 
   $word_of_the_day = htmlspecialchars(addslashes($_COOKIE['WOTD']));
   $wotd = $wpdb->get_results("SELECT term,definition FROM glossary WHERE term = '$word_of_the_day'");
   foreach ($wotd as $term)  

else 
   $wotd = $wpdb->get_results("SELECT term,definition FROM glossary ORDER BY RAND() LIMIT 1");
   foreach ($wotd as $term) 
      setcookie("WOTD", $term->term, time()+86400);
   

【问题讨论】:

【参考方案1】:

如果 $word_for_the_day 来自用户输入,那么您的第一个问题就出现了。在使用之前执行此操作:

$word_for_the_day = mysql_real_escape_string($word_for_the_day);

您的 cookie 实际上看起来不错。 htmlspecialchars() 和 addlashes() 调用,在您使用它们的上下文中,似乎不容易受到 SQL 注入或 XSS 攻击。

【讨论】:

【参考方案2】:

您应该查看mysql_real_escape_string:“转义字符串中的特殊字符以用于 SQL 语句”。您不必手动操作 htmlspecialcharsaddslashes。您熟悉SQL injection 安全风险吗?如果您在 SELECT 语句中包含的变量 $word_of_the_day 来自用户,那么您可能存在 SQL 注入问题。

【讨论】:

【参考方案3】:

addslashes 非常弱。首先,通过 mysql_escape_string 运行从数据库查询的所有内容,以防止 sql 注入。这只是基础。

if($word_of_the_day)

$word_of_the_day = mysql_escape_string($word_of_the_day); 
 $wotd = $wpdb->get_results ("SELECT term,definition FROM glossary WHERE term = '$word_of_the_day'");

此外,无论您编写的代码多么安全,cookie 通常都不是很安全。对于更安全的解决方案,我建议您使用 PHP 会话 ($_SESSION)。您可以将变量存储在这个超全局变量中,它会在页面加载之间保留在那里。

http://www.php.net/manual/en/session.examples.basic.php

在那之后,如果你真的想要,你可能想要防止会话劫持或中毒

【讨论】:

【参考方案4】:

您可以考虑的另一种选择是将单词的 id 存储在 cookie 中,而不是单词本身。这样,它只能是一个整数。当然,用这个词也可以,只要你先mysql_real_escape_string它,我只是想提供另一种选择。

【讨论】:

【参考方案5】:

最安全的方法之一是使用实现参数的PDO MySQL函数:

$db = new PDO('mysql:host=hostname;dbname=defaultDbName', 'username', 'password');
$stmt = $db->prepare('SELECT term,definition FROM glossary WHERE term = :wotd');
if ($stmt) 
    if ($stmt->execute(array(':wotd' => $word_of_the_day)))  //This is safe for any input method
        $info = $stmt->fetchAll();
        foreach($info as $row) 
            //Whatever
        
    

PDO 驱动程序根据表中的数据类型进行正确的转义/引用。

【讨论】:

【参考方案6】:

$word_of_the_day 来自哪里?如果它来自用户输入,则您对 SQL 注入持开放态度。

【讨论】:

以上是关于PHP Cookie 安全问题的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中的 PHPSESSID cookie 上设置 httpOnly 和安全

如何使用 PHP 创建一个安全的“记住我”系统?

PHP笔记-随机生成cookie后台检索通过session获取ID增强安全性

70)PHP,cookie的安全传输和HTTPonly

PHP 会话的安全性如何?

如何安全地验证 iframe 中的跨域(不包括第三方 cookie)?