我正在创建一个包含小而简单数据库的php页面。
当我在线访问它并尝试传递参数" length"在网址中:index.php/?length=1
它可以正常工作并获取数据。
如果我添加单引号如index.php/?length=1'
我在页面上没有SQL错误...
但如果我使用index.php/?length=-1
,我会在页面中看到SQL错误。
这是否意味着我的网页容易受到攻击?
如何进一步测试并解决问题?
编辑:添加了代码
$length = $wpdb->get_results( $wpdb->prepare("SELECT `title`, `website`, `material`, `color`, `width`, `height`, `group`, `category`, `numbers_positive`, `numbers_negative`, `custom` FROM {$wpdb->shirts} WHERE `id` = '%d' ORDER BY `rank` ASC, `id` ASC", intval($shirt_id)) );
if (!isset($shirt[0])) return false;
$shirt= $shirt[0];
$shirt->title = htmlspecialchars(stripslashes($shirt->title), ENT_QUOTES);
$shirt->custom = maybe_unserialize($shirt->custom);
$shirt->color = maybe_unserialize($shirt->color);
if ( $this->hasBridge() ) {
global $lmBridge;
$shirt->shirtColor = $lmBridge->getShirtColor($shirt->color);
}
$shirt = (object)array_merge((array)$shirt,(array)$shirt->custom);
unset($shirt->custom);
return $shirt;
答案 0 :(得分:1)
是的,从您提供的URL示例中,您似乎接受了用户输入并直接将其插入到MySQL语句中。这绝对是最糟糕的。您应始终解析用户输入,因为来自用户的直接输入可能导致字符串被转义,并且它们会删除数据库中的每个表。这是一个很好的例子:Bobby Tables
此外,这是一个非常讨论的话题。有一个很好的答案here
编辑*使用WordPress框架并查看您的代码,它没有看起来那么糟糕。
答案 1 :(得分:0)
接受,但在-1上产生错误并不意味着你对注射攻击是可以理解的。只要你变量输入是一个整数并且只使用整数组件,你就相当安全。
通过从查询中分离数据,准备好的语句使其更加安全。这样做意味着某人可以从不'突破'你应该做的事情。这绝对是使用SQL的正确方法。
我们甚至可以通过限制帐户的能力来执行其他任何运行存储查询的内容,并将查询存储在SQL服务器端而不是PHP中,从而进一步迈出新的步伐。那时,即使他们爆发(他们不能),他们也只能访问那些定义的查询。