2016-11-11 15 views
4

我已經閱讀了許多關於如何過濾字符串爲「字母數字」的其他問題,但他們都提出了preg_replace()方法。從用戶輸入中獲取字母數字字符串的安全方法? (without preg_replace)

根據OWASP

功能的preg_replace()不應該與unsanitised用戶 輸入被使用,因爲有效載荷將是EVAL()」 ED13。 preg_replace(「/.*/ e」,「system('echo/etc/passwd')」);

反射也可能 有代碼注入缺陷。由於它是一個高級主題,因此請參閱相應的反映文檔。

那麼現在如何實現這個沒有preg_replace?

$result = preg_replace("/[^a-zA-Z0-9]+/", "", $_POST['data']); 
// Notice the $_POST['data'] 
+3

如果數據是無效的,那麼爲什麼還要對其進行篩選?只要拒絕它:'$ result = ctype_alnum($ _ POST ['data'])? $ _POST ['data']:null;' –

+0

'filter_input()'或'filter_var()' – cmorrissey

+0

@cmorrissey嘗試了filter_函數,我用很多標誌/過濾器試過了,但是輸出結果從來沒有像上面那樣。例如:'filter_var($ string,FILTER_SANITIZE_STRING,FILTER_FLAG_ENCODE_HIGH)' – Vladimir

回答

5

有使用preg_replace()過濾用戶輸入沒有問題。你引用的OWASP建議是談論模式本身不是用戶輸入。

但是,我想說,使用過濾的輸入本身就是一個問題 - 您應該進行驗證。如同,不要接受無效輸入。

+0

感謝您爲我清除這些信息,當我在OWASP上閱讀該報價時,我感到非常震驚,因爲我已經使用了很多次preg_place。 – Vladimir

1

你可以去這樣的事情:

<?php 
$unsafe_input = 'some"""\'t&%^[email protected]!`hing~~ unsafe \':[]435^%$^%*$^#'; // input from user 

$safe_input = ''; // final sanitized string 

// we want to allow 0-9 A-Z and a-z 
// merge and flip so that we can use isset() later 
$allowed_chars = array_flip(array_merge(range(0, 9), range('A', 'Z'), range('a', 'z'))); 

// loop each byte of the string 
for($i = 0; $i < strlen($unsafe_input); ++$i) 
{ 
    // isset() is lightyears faster than in_array() 
    if(isset($allowed_chars[$unsafe_input[$i]])) 
    { 
     // good, sanitized, data 
     $safe_input.= $unsafe_input[$i]; 
    } 
} 

echo $safe_input; 
1

嗯,我們也有類似的情況,我們使用以下命令:

if (! preg_match('/^[a-z0-9:_\/|-]+$/i', $str)) 
{ 

//do your stuff 
} 
2
  1. 正如其他人所指出的那樣,你鏈接的OWASP漏洞,當你正在評估的表達,你不應該只適用無論如何都不會做。
  2. 以我的經驗,正則表達式對於PHP內置的字符串函數足夠簡單的操作非常不滿意。字符串函數也更快。
  3. 如果數據無效,那麼你不應該過濾它,你應該拒絕它。

例子:

$result = ctype_alnum($_POST['data']) ? $_POST['data'] : null; 
+0

謝謝你教我使用ctype方法進行驗證。 – Vladimir

相關問題