2011-01-24 43 views
0

我想確定,我沒有使用$ _POST或$ _GET的方式攻擊者可以利用(XSS攻擊,SQL注入) 。要查找我用$ _GET或$ _POST我用這個命令所有行:

egrep "_GET|_POST" -r -i MyFolder > dangerousUse.txt 

dangerousUse.txt有439線。如果我這樣搜索:

egrep "\$_GET|\$_POST" -r -i MyFolder > dangerousUse.txt 

dangerousUse.txt有0行。如果我這樣搜索:

egrep "_GET\[|_POST\[" -r -i MyFolder > dangerousUse.txt 

dangerousUse.txt有385行。我認爲這是我想要的數字,但我希望$ -sign也能匹配。

我的第一個問題是:爲什麼第二個egrep-command沒有工作?

現在我確信,如果下面的命令之一已應用於輸入使用正確的:

  • mysql_real_escape_string(htmlspecialchars($input))mysql_real_escape_string (htmlspecialchars ($input))或其他組合,帶空格。
  • intval($input)
  • isset($input)
  • $input ==== $input

我怎麼能找到只有那些線,在$ _ POST或$ _GET是沒有這些功能的使用?也可以刪除dangerousUse.txt中的行,這些函數應用於此行中的每個$ _POST或$ _GET。

編輯:

egrep '\$_GET\[|\$_POST\[' -r -i MyFolder > dangerousUse.txt 

作品,感謝VGE的答案的第一部分。現在dangerousUse.txt有385行。但第二個對我來說更重要。

用於第二部分,egrep -v反轉匹配:

egrep '(isset|intval|mysql_real_escape_string\(htmlspecialchars|md5|datum_anpassen)[\w]*\(\$_' -i -v dangerousUse.txt > dangerousUse2.txt 
+0

我已經加入了殼的標籤,因爲你的問題是有關殼報價和逃跑。 – VGE 2011-01-24 08:08:26

+0

當值首先寫入變量但後來被消毒時,您會做什麼? – poke 2011-01-24 08:16:38

+0

http://www.joelonsoftware.com/articles/Wrong.html – 2011-01-26 05:42:46

回答

4

殼牌雙引號需要雙轉義。

爲例echo "\$"將打印「$」 但echo "\\$"將打印「\ $」

和「$」是行正則表達式標誌的結束,是shell變量前綴。 下面的模式將工作的罰款

egrep "\\\$_GET|\\\$_POST" -r -i MyFolder > dangerousUse.txt 
egrep "[$]_GET|[$]_POST" -r -i MyFolder > dangerousUse.txt 
egrep '\$_GET|\$_POST' -r -i MyFolder > dangerousUse.txt 

最新的是簡單,因爲外殼沒有單引號內執行變量插值並沒有逃逸。

可能確保您檢查所有輸入的一種方法是定義執行所有內容的sanitized_GETsanitized_POST函數。

0

在您的示例\$可能是由你的shell和解釋的非轉義$傳遞給grep,由於Shell擴展變量開始$。嘗試使用單引號或殼逃脫\$來代替:

egrep '\$_GET|\$_POST' 
egrep "\\\$_GET|\\\$_POST" 

此外,你可能要分別使用-H-n選項輸出匹配的文件和行號。通過這種方式,您可以輕鬆找到危險的使用位置。

可以篩選出「好」用grep也使用-v(恢復)開關從「dangerousUse.txt」匹配:

egrep -H -n '\$_GET|\$_POST' -r -i MyFolder | egrep -v 'mysql_real_escape_string|intval|isset|<...>' > dangerousUse.txt