我有以下代码,提出“每日一词”, 因为我对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);
}
}
答案 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语句中使用”。您不必手动执行htmlspecialchars
和addslashes
所做的事情。您熟悉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注入。