2011-12-08 192 views
0

我正在審查我的所有代碼,並且在驗證用戶輸入前驗證用戶輸入的必要性有第二個想法。舉例來說,信用卡CVV的驗證:驗證之前驗證是否需要驗證?

// validation required? 
if(!preg_match('/^[\d]{3,4}$/', $_POST['card_CVV'])) 
{ 
unset($_POST['card_CVV']); 
$error++; 

// verification 
} 
elseif($card_CVV != $_POST['card_CVV']) 
{ 
$error++; 
} 

// pass verification 
else 
{ 
// process transaction 
} 

是否應該在未驗證的情況下進行驗證?

+0

嗯,我想即使在這裏有注射可能。永遠和總是驗證和過濾用戶輸入 - 意味着你不應該在elseif中使用未經過濾的$ _POST'變量,對嗎?! – Anonymous

+0

我不確定我完全理解驗證和驗證之間的區別。他們看起來事實上是同一件事情......您正在檢查輸入是否處於預期形式,通常是以相當簡單的方式進行,通常是在對這些輸入進行更嚴格的處理之前,向用戶返回錯誤消息。 – cdeszaq

+0

@ Dan Surfrider,我不存儲用戶數據,是否仍然存在風險? –

回答

2

在這種特殊情況下,它不是必要的,實際上什麼也不做,因爲假設它是錯誤的格式,它永遠不會是正確的。

在提交表單之前,在javascript中驗證客戶端的格式是更有意義的,也許是因爲它們的類型是如果你想獲得更多的花式,那麼用戶得到即時反饋並知道它是提交前錯誤。

此外,如果您將$_POST['card_CVV']的內容放入SQL查詢或以HTML格式顯示在某處,您應該瞭解注入的可能性。你說你沒有把它存儲起來,從顯示的代碼中它只用於直接字符串比較,所以我懷疑它應該沒問題,但請在代碼的其餘部分注意這一點。

1

實時取決於您需要顯示回給用戶的上下文和/或錯誤消息。

例如,您需要對第一個輸入進行上述驗證,並且如果它不是有效的輸入,則會將消息顯示給用戶。但是,如果您想檢查用戶是否輸入了正確的card_CVV,則需要兩個因爲您的錯誤消息不同:不是有效的cvv或cvv不匹配。

+0

我可以說如果我只是想給出一個普通的信息「這個交易已被拒絕」,那麼我不需要驗證步驟? –

+2

是的,但是如果你是一個開發者,你根本就不會幫助用戶,所以你需要對用戶的輸入操作進行簡單的明確和有意義的錯誤。 –

+0

是的,我通常會給出更準確的錯誤信息,但對於信用卡交易,它是否太多暗示? –

0

在所有情況下,您都需要確保處理代碼的行爲正確,這幾乎總是意味着如果您沒有所需的輸入,則必須使處理失敗。在你的處理流程中你在哪裏檢查事情並不重要,但是「快速失敗」並讓用戶知道發生了什麼是一個好習慣。

與此同時,您不想重複代碼(保持乾爽),這意味着您不應該多次檢查相同的問題。