PHP Cookie安全问题

时间:2009-07-16 18:20:17

标签: php sql database security cookies

我有以下代码,提出“每日一词”, 因为我对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);
   }
}

6 个答案:

答案 0 :(得分:4)

如果$ word_for_the_day来自用户输入,那么这是你的第一个问题。在使用之前执行此操作:

$word_for_the_day = mysql_real_escape_string($word_for_the_day);

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

答案 1 :(得分:1)

你应该看看mysql_real_escape_string:“转义字符串中的特殊字符以便在SQL语句中使用”。您不必手动执行htmlspecialcharsaddslashes所做的事情。您熟悉SQL injection安全风险吗?如果您在SELECT语句$word_of_the_day中包含的变量来自用户,那么您可能会遇到SQL注入问题。

答案 2 :(得分:1)

addslashes非常弱。首先,通过mysql_escape_string运行您从db查询的所有内容,以防止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

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

最安全的方法之一是使用实现参数的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驱动程序根据表中的数据类型执行正确的转义/引用。

答案 5 :(得分:0)

$ word_of_the_day来自哪里?如果它来自用户输入,则可以使用SQL注入。