可能从日期字符串中注入选择查询

时间:2009-09-03 14:38:57

标签: php sql mysql sql-injection

我有一个有点奇怪的问题。我的页面包含一个html链接,它刷新页面并调用PHP变量。此变量将日期字符串附加到url字符串,该字符串被输入MySQL查询,该查询将获取与此日期匹配的记录。我认为这会引起注入,因为它有时会从数据库中删除用户!

我知道在超链接中使用'#'可能存在安全问题,但我想知道最新情况。这也会对不同的浏览器产生不同的影响,看它是如何使用javascript的。被删除的用户似乎只发生在某些人的计算机上。

PHP代码计算三天后的时间戳,然后将其置于SQL格式:

$ts_threeDays   = mktime(1,0,0,date('m'), date('d')+3-date('w'), date('y'));     
$threeDaysAhead = date('y-m-d', $ts_second_day);    

然后脚本会侦听页面上超链接传递的url字符串中的'day'变量:

$date = mysql_real_escape_string($_GET['day']);

JavaScript和超链接是:

<a href='#' onClick="document.location.href='planner.php?day=<?php echo $threeDaysAhead; ?>'"> 3 Days Later</a>

MySQL查询更大但是用户操作所需的唯一输入是上面的日期字符串。查询基本上看起来像这样(使用另一个select语句来访问users表):

SELECT planner.details FROM planner 
WHERE  planner.date = '$date' AND users.`user_id` = '$id' // Logged in Id superglobal

如果有人能帮助我并解释我的问题,我将非常感激。 非常感谢

2 个答案:

答案 0 :(得分:2)

当你将$date传递给mysql_real_escape_string时,怀疑必须落在$id或我们看不到的地方。

SELECT语句不会从您的数据库中删除内容。您的PHP文件中还有哪些内容负责删除用户,您是否还有一些损坏的if / else逻辑,这些逻辑最终会通过一个函数来删除用户?

答案 1 :(得分:0)

以前的回答很好地解释了你的问题。

你可以这样验证你的'day'获取var:

$day = '';
if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $_GET['day'])
{
    $day = $_GET['day'];
} else {
    die("bye bye");
}