顯示具有 Security 標籤的文章。 顯示所有文章
顯示具有 Security 標籤的文章。 顯示所有文章

星期五, 10月 23, 2015

擴充Phalcon的filter過濾 xss 攻擊


其實直接用htmlentities or htmlspecialchars就可以了
不過因為一些問題,所以得加上一些參數
見這篇 到底要用htmlenties 還是htmlspecialchars

如果各自使用htmlentities 又容易漏參數
於是想寫個helper類的來幫助

後來想想,幹脆直接擴充phalcon的filter,再透過di統一取得
如此一來就能規範大家用相同的設定也挺不錯的

service.php的設定
$di->setShared("filter", function(
    $filter = new \Phalcon\Filter();
    // Using an anonymous function
    $filter->add('xss', function ($value) {
        $flags = ENT_QUOTES;
        $encoding = "UTF-8";
        $doubleEncode = false;
        return htmlspecialchars($value, $flags, $encoding, $doubleEncode);
    });
    return $filter
));

使用方法
$filter = $di->get("filter");          //取得filter
 
//統一透過filter,寫法能夠一致
$filter->sanitize($value, "xss");      //自寫的,用specialchars
$filter->sanitize($value, "string");   //用htmlentities,不建議用
$filter->sanitize($value, "int");
$filter->sanitize($value, "email");

星期三, 10月 21, 2015

到底要用htmlenties 還是htmlspecialchars

基本上... 要看情況,但先寫通用的結論,就是用htmlspecialchars()
但是!!!! 要加幾個參數,完整如下
htmlspecialchars("i'm 魚乾'", ENT_QUOTES, "UTF-8", false)

先說明後面三個parameters,再說明為何不用htmlentities

  • param 2: $flags = ENT_QUOTES
    避免SQL Injection,所以一律對單引號做轉換
  • param 3: $encoding = "UTF-8",
    encoding一定要加,免得被不同版本的PHP影響
    5.4 預設"UTF-8"
    5.6 是吃default_charset設定
  • param 4: $double_encode = false
    避免重覆encode, ex: &的&會重覆encode


為何不用htmlentities

因為特殊字元會有亂碼問題
htmlentities遇到認不出文字,會轉成亂碼or特殊字
echo htmlentities('魚乾') . PHP_EOL;                 //é­▒ä¹¾ ö
echo htmlspecialchars('魚乾 ö'). PHP_EOL;            //魚乾 ö

//雖然可以decode還原,但如果直接看DB資料時總怪怪的

中文字加上固定的encoding就ok了,但有些字還是會被encode
echo htmlentities('魚乾 ö') . PHP_EOL;                    //é­▒ä¹¾ ö
echo htmlentities('魚乾 ö',ENT_QUOTES,"UTF-8") . PHP_EOL; //魚乾 ö 為會轉為  ö
echo htmlspecialchars('魚乾 ö'). PHP_EOL;                 //魚乾 ö

結論:
內容並不是我們想轉換的特殊字,所以遇到特殊字就不要理,這是htmlspecialchars的理念
那何時適用htmlentities?
就... 你要encode特殊字的時候....
何時會需要... 存的media不支援特殊字時...吧...




星期日, 6月 30, 2013

MD5被破解了,要改用SHA

過去很常用MD5做訊息摘要,近來發現某些地方會用SHA做摘要
google了一下,發現MD5因hash不夠強而被破解了,能夠偽造相同的訊息摘要
大致問題如下
  1. MD5的hash值,google就會找到了,
    本來沒在意這點,不過有時會用在儲存密碼上
    這就容易被反推,記得幾年前也有朋友用google MD5去找密碼...
  2. 相同的訊息摘要
    MD5本來就不以安全為出發點,只是做摘要用,因此hash不夠強,會發生兩個不同的message,但產生相同的hash碼
  3. 利用MD5做檔案特徵碼也有相同的問題
    SHA的訊息摘要的長度更長,因此較不會發生碰撞,也更為安全
    不過相對MD5,運算也相對較慢,所以適合用在摘要小段訊息
    檔案還是用MD5比較快

PHP寫法
$data = "魚乾的筆記本";
$key = "fishjerk";

$sig = md5($data, true);  // = hash('md5', $data);
//Output 32個字元特徵碼: 9fc745260dedf115ec7b62fa811f0698

$sig = hash_hmac('sha256', $data, $key ); //跟hash('sha256')的差別是多了$salt改變特徵碼
//Output 64個字元特徵碼: 7b8ddbde1cc031945d23d82af786a83048e40efff7c1194ed9ea6c6f0fae39b2

$sig = hash_hmac('sha512', $data, $key );
//Output 128個字元特徵碼: 8cb44d44e52b443fa3095a06668dd6e31b8ce973f3b4f353d40ca35b47605dc41ff3ab003f375aee5ed1a14456e2b783d1f98543cc111822ea63d26d1427ea61


SHA有5種演算法,SHA-0 ~ SHA-5
目前 SHA-0 及 SHA-1 也都被破了
SHA-2 以上還沒出現有效的攻擊,SHA256 及 SHA512 即為 SHA-2

過去上密碼學時,都沒注意到原來SHA是Secure Hash Algorithm 縮寫
都說是Secure了,還在用MD5玩~ (羞)
難怪之前用 facebook 金流時,人家也用sha256

References