2011-11-05 125 views
7

我已經習慣了通過我的int函數過濾用戶提交的變量,它確保它是一個數字(如果不是返回0)並且不在mysql查詢中引用該變量。mysql查詢中int值的引號

這是不好的做法?我想我出於性能原因決定這麼做。另外,我一直認爲數字不應該放在引號中。

例子:

if($perpage != $user['perpage']){ 
if($perpage == 50 || $perpage == 100 || $perpage == 200){ 
$DB->query("UPDATE users SET perpage=$perpage WHERE id=$user[id]", __FILE__, __LINE__); 
} 
} 
+0

我很想知道我是否通過這樣做獲得了性能方面的好處。顯然我覺得更安全的把他們放在引號中。 – domino

+0

它似乎你正在使用一些古老的方式獲取文件和錯誤的行。現在不需要手動設置它。 trigger_error()或debug_backtrace()會爲你做 –

+0

性能。你現在有沒有遇到任何問題? –

回答

5

aha!一個有趣的案例!

  1. 你是對的一般。它始終是更好地把數字作爲數字,而不是字符串

    • 它使你的代碼更健全和一致
    • strict_mode設置在MySQL中,這將不會允許你做僞裝一個數字作爲一個字符串,如果打開。
  2. 但是你的實現實際上允許注入!讓我們把它留給你的功課,找到它:)

這是給你一個參考,說明該注射液:http://php.net/language.types.type-juggling

所以,我讓你這樣的代碼

$perpage = intval($perpage); 
if($perpage != $user['perpage'] && in_array($perpage,array(50,100,200) { 
    $DB->query("UPDATE users SET perpage=$perpage WHERE id=$user[id]"); 
} 
+0

我想你錯過了第二個「如果」。該值只能是50,100或200.沒有空間進行注射。 ;) – domino

+0

首先嚐試失敗:) –

+0

我不明白。如果除了這三個數字之外的任何內容都傳遞給查詢,那麼它就會很脆弱。無論如何,$ perpage只能是一個數字。 – domino

2

只要值是通過在使用前用PHP的INTVAL方法的適當的檢查,我沒有看到一個問題吧。如果您需要與認爲引用int值的引號是語法錯誤的數據庫進行交互,那麼您可以在將來通過這種方式來做自己喜歡的事情。 (我相信MS SQL服務器是這樣做的。)