更新別人的舊PHP項目,我不熟悉正則表達式。需要知道這個正則表達式是做什麼的,它安全嗎?
問題一是:這是做什麼的?
preg_match('/^[0-9]+[.]?[0-9]*$/', $variable)
問題二是:這是插入一個安全過濾器進入MySQL數據庫沒有mysql_real_escape_string()?我知道答案是概率否,但是隻有當這個正則表達式不通過時纔會使用mysql_real_escape_string()。
謝謝。
更新別人的舊PHP項目,我不熟悉正則表達式。需要知道這個正則表達式是做什麼的,它安全嗎?
問題一是:這是做什麼的?
preg_match('/^[0-9]+[.]?[0-9]*$/', $variable)
問題二是:這是插入一個安全過濾器進入MySQL數據庫沒有mysql_real_escape_string()?我知道答案是概率否,但是隻有當這個正則表達式不通過時纔會使用mysql_real_escape_string()。
謝謝。
^ // 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
所以,它確保所述輸入是一個數字,如12
或3.6
(52.
也將匹配)。它不會匹配.35
或12a6
。
數據庫插入似乎足夠安全,因爲它只允許數字。
'\。+'將匹配多個句點,如果匹配嘗試找到一個十進制數字,則可能不需要。 – Andrew 2012-03-09 16:58:24
@Andrew:這是一個錯字,應該是'\。?'。 – 2012-03-09 16:59:05
它試圖匹配一個十進制數(儘管很差)。它不會修改$variable
,所以你需要在傳遞給MySQL之前正確地轉義它。
爲什麼'$ variable'必須以數字開頭並且必須(但可選)以小數結尾,後面跟隨(可選)數字才需要轉義?如果它沒有通過,那麼該領域顯然需要逃避,但是你沒有在你的答案中提到這一點。 – 2012-03-09 16:59:37
我想解釋的是,如果正則表達式不匹配,則使用mysql_real_escape_string()進行轉義,否則只是插入。 – 2012-03-09 17:03:27
這將匹配小數點前至少有一位的數字(如果有小數點)。如果這個值與這個正則表達式匹配,我不會看到將它插入數據庫是不安全的。
看起來是否完全匹配。 它匹配 234234232432343.231313132321 和和 322332. 而不是 0.32232 而不是
它匹配的字符串:
它不清理數據庫的字符串。
它檢查是否$variable
匹配這個模式...
^[0-9]+
).
([.]?
)[0-9]*
)$
)'[。]'不匹配任何東西,只是一個文字週期。 – Andrew 2012-03-09 16:58:55
是的 - 我只是在你的評論前幾秒鐘就改變了。 – 2012-03-09 16:59:37
這是一個安全的過濾器插入mysql數據庫沒有mysql_real_escape_string()?
假設可能使用這個變量,我會說mysql_real_escape_string()對它來說是無用的。
需要查詢組裝代碼是肯定的。
此正則表達式匹配一個或多個數字(0-9)可選包含單個'。'在數字的中間或末尾。 – Andrew 2012-03-09 16:54:39
只需使用準備好的語句,那麼您將永遠不必擔心SQL注入。 – CountMurphy 2012-03-09 16:56:47
@CountMurphy這不完全正確。 – 2012-03-09 16:58:40