2012-01-16 47 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

相關問題