SQL注入:这是安全的吗?

时间:2011-10-02 03:59:13

标签: sql sql-injection

我的网站包含以下参数:

http://www.example.com.com/pagination.php?page=4&order=comment_time&sc=desc

我使用每个参数的值作为SQL查询中的值。

我正在尝试测试我的应用程序并最终破解我自己的应用程序以用于学习目的。

我正试着注入这句话:
http://www.example.com.com/pagination.php?page=4&order=comment_time&sc=desc'或1 = 1 -

但它失败了,MySQL说:

  

警告:mysql_fetch_assoc()期望参数1是资源,   第132行/home/dir/public_html/pagination.php中给出的布尔值

我的应用程序完全没有SQL注入,或者它仍然可能吗?

编辑:我是否可以找到一个有效的sql注入语句来输入到URL的一个参数中?

5 个答案:

答案 0 :(得分:2)

从sql injection never 保护的应用程序会产生无效查询。

显然你还有一些问题。

任何输入的编写良好的应用程序会产生有效和预期的输出。

答案 1 :(得分:2)

这完全是易受攻击的,而且你可以导致语法错误这一事实证明了这一点。

没有功能可以转义列名称或按指示排序。这些函数不存在,因为直接在URL中公开DB逻辑是不好的方式,因为它使URL依赖于对数据库逻辑的更改。

我建议使用将“order”参数值映射到列名的数组:

$order_cols = array(
    'time' => 'comment_time',
    'popular' => 'comment_score',
    ... and so on ...
);

if (!isset($order_cols[$_GET['order'])) {
    $_GET['order'] = 'time';
}
$order = $order_cols[$_GET['order']];

手动限制“sc”:

if ($_GET['sc'] == 'asc' || $_GET['sc'] == 'desc') {
    $order .= ' ' . $_GET['sc'];
} else {
    $order .= ' desc';
}

然后保证您可以安全地将其附加到查询中,并且URL与数据库实现无关。

答案 2 :(得分:0)

我不是100%肯定,但我会说它似乎仍然容易受到我的影响 - 事实上它接受单引号(')作为分隔符,然后在后续注入的代码中产生错误说对我而言,它不应该传递给MySQL。

任何可能从您的应用程序本身以外的地方获取的数据应首先通过mysql_real_escape_string()。这样整个' or 1=1部分作为值传递给MySQL ......除非你直接传递“sc”以获得排序顺序,例如

$sql = "SELECT * FROM foo WHERE page='{$_REQUEST['page']}' ORDER BY data {$_REQUEST['sc']}";

......你也不应该这样做。尝试以下几点:

$page = mysql_real_escape_string($_REQUEST['page']);
if ($_REQUEST['sc'] == "desc")
  $sortorder = "DESC";
else
  $sortorder = "ASC";

$sql = "SELECT * FROM foo WHERE page='{$page}' ORDER BY data {$sortorder}";

我仍然不能说这是完全注射防护,但它肯定更强大。

答案 3 :(得分:0)

我假设您生成的查询与

类似
select <some number of fields>
from <some table>
where sc=desc
order by comment_time

现在,如果我要按语句而不是WHERE攻击订单,我可能会得到一些结果......想象一下我添加了以下内容

comment_time; select top 5 * from sysobjects

返回到前端的查询将是sysobjects的前5行,而不是您尝试生成的查询(取决于前端的很多)...

答案 4 :(得分:0)

这实际上取决于PHP如何验证这些参数。如果MySQL给你一个警告,这意味着黑客已经通过你的第一道防线,这是你的PHP脚本。

在将所有输入传递给MySQL之前,先使用if(!preg_match('/^regex_pattern$/', $your_input)) filter输入所有输入。