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 语句”。您不必手动操作 htmlspecialchars
和 addslashes
。您熟悉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 和安全