2012-03-09 26 views
1

更新別人的舊PHP項目,我不熟悉正則表達式。需要知道這個正則表達式是做什麼的,它安全嗎?

問題一是:這是做什麼的?

preg_match('/^[0-9]+[.]?[0-9]*$/', $variable) 

問題二是:這是插入一個安全過濾器進入MySQL數據庫沒有mysql_real_escape_string()?我知道答案是概率否,但是隻有當這個正則表達式不通過時纔會使用mysql_real_escape_string()。

謝謝。

+3

此正則表達式匹配一個或多個數字(0-9)可選包含單個'。'在數字的中間或末尾。 – Andrew 2012-03-09 16:54:39

+0

只需使用準備好的語句,那麼您將永遠不必擔心SQL注入。 – CountMurphy 2012-03-09 16:56:47

+0

@CountMurphy這不完全正確。 – 2012-03-09 16:58:40

回答

5
^  // start of string 
[0-9]+ // one or more numbers (could also be \d+) 
[.]? // zero or one period (could also be \.?) 
[0-9]* // zero or more numbers (could also be \d*) 
$  //end of string 

所以,它確保所述輸入是一個數字,如123.652.也將匹配)。它不會匹配.3512a6

數據庫插入似乎足夠安全,因爲它只允許數字。

+0

'\。+'將匹配多個句點,如果匹配嘗試找到一個十進制數字,則可能不需要。 – Andrew 2012-03-09 16:58:24

+1

@Andrew:這是一個錯字,應該是'\。?'。 – 2012-03-09 16:59:05

0

它試圖匹配一個十進制數(儘管很差)。它不會修改$variable,所以你需要在傳遞給MySQL之前正確地轉義它。

+0

爲什麼'$ variable'必須以數字開頭並且必須(但可選)以小數結尾,後面跟隨(可選)數字才需要轉義?如果它沒有通過,那麼該領域顯然需要逃避,但是你沒有在你的答案中提到這一點。 – 2012-03-09 16:59:37

+0

我想解釋的是,如果正則表達式不匹配,則使用mysql_real_escape_string()進行轉義,否則只是插入。 – 2012-03-09 17:03:27

0

這將匹配小數點前至少有一位的數字(如果有小數點)。如果這個值與這個正則表達式匹配,我不會看到將它插入數據庫是不安全的。

0

看起來是否完全匹配。 它匹配 234234232432343.231313132321 和和 322332. 而不是 0.32232 而不是

1

它匹配的字符串:

  1. 開始至少有1位0-9
  2. 在前n位數字0或1後有小數點
  3. 有字符後的任何數字0次或多次
1

它不清理數據庫的字符串。

它檢查是否$variable匹配這個模式...

  1. 開始與一個或多個數字(^[0-9]+
  2. 其次是可選.[.]?
  3. 其次是儘可能多或儘可能少的數字只要你喜歡([0-9]*
  4. 其次是字符串的結尾($
+0

'[。]'不匹配任何東西,只是一個文字週期。 – Andrew 2012-03-09 16:58:55

+0

是的 - 我只是在你的評論前幾​​秒鐘就改變了。 – 2012-03-09 16:59:37

0

這是一個安全的過濾器插入mysql數據庫沒有mysql_real_escape_string()?

假設可能使用這個變量,我會說mysql_real_escape_string()對它來說是無用的。
需要查詢組裝代碼是肯定的。