2012-01-16 104 views
3

这是我现在拥有的。如何在将日期传递给strtotime()之前使日期合法/安全?

$date = mysqli_real_escape_string($dbc, trim(date('Y-m-d',strtotime($_POST['date'])))); 

我被告知,我需要确保的是,$date是将它传递给strtotime()前安全/合法的。我怎么做?我抬头看了http://us3.php.net/strtotime,但它真的不告诉我我在想什么。

有人可以向我解释一些更好的细节如何清理提交给strtotime吗?

回答

3

这远远超出了你需要做的事情。 strtotime()函数应该执行所有你需要的“验证” - 要么它会返回一个有效的日期,要么不会。之后,您不需要修改或转义date()的输出 - 输出由您决定。这里是我会做什么:

$date = strtotime($_POST['date']); 
if($date) { 
    $date = date('Y-m-d', $date); 
    //do stuff based on valid date 
} 
else { 
    //handle invalid date. 
} 
+0

我问的原因是因为我有这样的代码:'echo'

Date Filed:  
';',我期望让它“安全”,因为有人告诉我它不是。你在这种情况下显示的代码将如何工作? – 2012-01-16 13:52:13

+0

其中$ row ['date']来自哪里?至于为什么我的方法是安全的 - 'strtotime()'可以安全地将字符串转换为一个整数。一旦你通过了输入,你就不必担心它们(只要你以后不直接访问输入)。如果在我的文章是处理'strtotime()'失败并返回false的情况。 – MrGlass 2012-01-16 14:02:17

+0

它们可能是指确保日期格式正确。考虑'12/12/12',这在传递给时间的时候是不明确的。解决方案将使用date_create_from_format或使用爆炸(或类似)拆分日期并重建为非模糊形式 – 2012-01-16 14:19:26

5

没有真正的理由提前清理值。可能发生的最糟糕的情况是时间无效,并且strtotime()返回false(您也可以使用它来检查日期字符串是否有效)。

此外,没有理由修剪和跳过date('Y-m-d')函数的返回值:它永远不会返回带有尾随空格的值或任何应该转义的值。

+0

+1还要检查[的strtotime手记](http://uk3.php.net/strtotime#refsect1-function.strtotime-notes):根据格式的日期字段您的结果可能会出乎意料(特别是美国/欧盟日期)。 – cmbuckley 2012-01-16 13:49:31

+0

@Juhana它不会受到注射的影响? – 2012-01-16 13:54:19

+0

@MattRidge什么样的注射? 'strtotime($ x)'返回'false'或一个整数,具体取决于'$ x'的值。任何人都无法用数字攻击你的数据库。 – JJJ 2012-01-16 14:05:25

相关问题