2009-09-03 119 views
3

我有一个问题,这有点奇怪。我的页面包含一个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字符串变量页:

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

的JavaScript和超链接是:

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

的MySQ L查询较大,但用户操作所需的唯一输入是上述日期字符串。查询基本上就像这样(使用另一个select语句访问用户表):

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

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

回答

2

当你通过$datemysql_real_escape_string,怀疑必须落在$id,或者我们看不到的东西。

A SELECT声明不会从您的数据库中删除东西。你还有什么在你的PHP文件中负责删除用户,并且你可能有一些破坏的逻辑,最终通过删除用户的功能,当他们真的不应该这样做时?

0

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

而且你可以验证你的“天”获得VAR像这样:

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

你甚至可以指定'$ day'正则表达式相匹配的部分。这种方式如果你有垃圾包含日期(如'2009-09-03'); DROP TABLE学生;'),你把垃圾拿走。 – 2009-09-03 15:19:09

+0

你说得对。正则表达式应该是'^ \ d {4} - \ d {2} - \ d {2} $'^。我的错 – inakiabt 2009-09-03 17:26:24