星期一, 12月 21, 2015

Java Web Services and Security 課堂筆記



  • 過去有PRC, RMI, COMBO,不過都過時了
  • Base64會做Binary大1/3倍,300KB=>400KB
  • XML定義
    • Well-Formed XML
      • 有PI
      • 唯一root
      • 對應的tag
      • 大小寫有分
    • Validated XML(Valid XML)
      • DTD
      • XML Schema
  • 歷史
    • XML已式微,但有其功能
      • 交換資料可驗證
        • ex, 潤年 2015-02-29(不需AP判斷)
    • SOAP也式微,但
      • 電子簽章等
      • 自己寫也可以... 所以有點雞肋
  • 名詞
    • AP Server
      • Web Container
      • EJB Container
      • 實做Jave EE製定的規格
    • Tomcat只有web container及實做一點點Java EE的規格
  • 名詞
    • REpresentational Service
      • 可output各式的format, json, xml, csv, ...
  • Convention
    • db命名單數 tb_member
    • RESTFul複數 members
  • JSON定義
    • [ { a: 1 } ] , 不合法(但可用),最上層要加{ }
    • [ ]的Security Issue
    • javascript會呼叫array construction,而js允許亡寫array的constructor,駭客可透過此攻擊系統
    • 修改方法:利用{ }包起來





星期一, 12月 14, 2015

加強json_encode的xss 防禦

由於常把資料從db拉出來,再整個json_encode丟給前端
因此要一個個filter還挺累的
如果可以直接對encode過的string filter最好了~

幸好json_encode有好用的參數
完整參數如下
json_encode($value, JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS);
PHP官網有完整範例,以下截錄
$a = array('',"'bar'",'"baz"','&blong&', "\xc3\xa9");

echo "Normal: ",  json_encode($a), "\n";
echo "Tags: ",    json_encode($a, JSON_HEX_TAG), "\n";
echo "Apos: ",    json_encode($a, JSON_HEX_APOS), "\n";
echo "Quot: ",    json_encode($a, JSON_HEX_QUOT), "\n";
echo "Amp: ",     json_encode($a, JSON_HEX_AMP), "\n";
echo "Unicode: ", json_encode($a, JSON_UNESCAPED_UNICODE), "\n";
echo "All: ",     json_encode($a, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE), "\n\n";

Normal: ["","'bar'","\"baz\"","&blong&","\u00e9"]
Tags: ["\u003Cfoo\u003E","'bar'","\"baz\"","&blong&","\u00e9"]
Apos: ["","\u0027bar\u0027","\"baz\"","&blong&","\u00e9"]
Quot: ["","'bar'","\u0022baz\u0022","&blong&","\u00e9"]
Amp: ["","'bar'","\"baz\"","\u0026blong\u0026","\u00e9"]
Unicode: ["","'bar'","\"baz\"","&blong&","e"]
All: ["\u003Cfoo\u003E","\u0027bar\u0027","\u0022baz\u0022","\u0026blong\u0026","e"]
Reference
Example #2 A json_encode() example showing some options in use

星期五, 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不支援特殊字時...吧...




星期二, 9月 01, 2015

DevOps conf 2015 (9/1)

*因為沒有提供投影片,所以抄的零零落落

開場
  • 搶先一步的IT競爭力
    • 南非Standard Bank加快發佈軟體2000倍
    • 反之,若是競爭對手的速度快2000倍
  • 實例Standard Bank
    • 除了Dev與Ops Team外,更應用在流程面
      • 新服務申請新的Server,層層的人工簽核
    • 由於改變流程,因此花時間讓高層瞭解
      • 熟悉用詞
      • 導入衝擊
    • 建立文化
      • 將Dev, Ops於同一辦公室工作
      • 宣言服裝(ChopChop)
Conquer CI Server - 樂天 直井和久
  • 因無人專職維運CI Server,同仁也不太會用,所以效能低落
    • 專職維運CI Server
  • Project Metrics
    • 指標太多,訂出要衡量什麼,才能取捨
    • Show progress easily
    • observer the transition
  • Reduce exchange between Dev & Ops team
    • 許多環境設定waste time on communication
    • 透過CHEF, Docker
      • Developer可自行測試
      • Operation直接放設定檔
    • 調整CI Alert mail
      • 寫看的懂,留useful的資訊
      • you don't need to measure everything. only useful information
      • 逐步設定其他的metric
  • how we nurture member
    • share knowledge face-to-face weekly.
  • Conclusion
    • Find/measure/review Project Metrics to consolidate ... 忘了
    • Use useful information for communication
  • 相關軟體
    • Cobertura
    • Jacoco

Enterprise DevOps - Michael Ducy

  • Cultural and Professional movement
    • Book: The Phoenix Project
  • Increasing the flow of work through the IT system
  • DevOps are CALMS
    • Culture (learning, improvement, failure and betterment)
    • Automation (work flow)
    • Lean 
    • Measurement (看的到,才知道要改善什麼)
    • Sharing 
  • "... software is eating the world" Marc Anderson
  • Lean
    • 每次上版要花多少時間在process
      • it's a waste
  • 30 Day Challenges (DevOps Dojo)
    • Time boxed Project
    • Give origination a chance to experiment
    • Eliminate old process to prove new 
    • Eliminate waste
  • Culture 無法被管理
    • 是有最底層的membr形成
    • Managers are no longer a manager
      • "the team i support"
    • The Coaching kata

Yahoo 持續交付 - 應百怡
  • CD如何保持Speed & Quality
    • Speed
      • Eliminate human involvement
      • Small batch
        • Easy to identity issue
          • Check & revise
    • Quality
      • Build the  right thing
        • Small batch
        • Build the thing right
          • Lots test
  • No human allowed
  • Yahoo CEO
    • NO CD, NO LAUNCH, NO FOOLING
  • 5 Stage
雲端OS Team落實CI - 雙子星執行長 符儒嘉
  • Biz -> Dev -> Test -> Ops -> Market
    • Dev過程有Agile
    • Test有CD
    • Ops有 infrastructure as code
  • Branching Methodology
    • feature 
    • release integration
    • release candidate
Whoscall - 葉秉哲
  • get a little better every single day
  • 要monitoring什麼
    • 從Risk management出發(risk有機會的意思)
      • CPU Usage, 不busy的可調整
    • Application 
      • Metric
        • availible
        • response time
        • error
      • Service
        • pingdom => slack
        • Crashlytics => slack
          • 分析crash report
    • DB
      • Metric
        • R/W lock
        • Size
        • Load
        • Speed
      • Service
        • MongoDB Cloud Manager
    • Poor Performance
      • Metric
        • instance metrics
        • application metrics
        • resource
    • Malfunction
      • log分析
        • fluentd->elesticsearch
        • 較複雜的用BigQuery
      • New Realic
        • 看stack trace
        • 各段執行時間
      • Java Metrics
        • 程式自己定metric,不用再刻前後執行執行時間
      • sentry
        • slack
        • hook在app裡

      • Service
        • 統一的fluentD 格式 
          • fluentD
            • ruby實作,部份用c,效能較好
          • logstash
            • java實作,需jvm,效能較差 (講師:java魔人不要罵我)
        • 普羅米修期
          • 多維度,時間序列



星期四, 8月 13, 2015

Linux排程重覆執行問題

有時排程未跑完,下一個週期的排程又被啟動
雖然自己有想法解這問題,不過這應該一堆神人遇過,一定有厲害的解法
請教了google大神,果然出現超強解法
只要改crontab的指令就好,連程式都不用改

* * * * *  sh '/home/fish/test.sh'  #原寫法
* * * * *  flock -xn /tmp/test.lock -c '/home/fish/test.sh' #flock寫法

注意事項
  1. test.lock 會自動產生,不用理,放在/tmp可避免權限問題
  2. 利用flock,得確定執行角色有test.sh的執行權限

超簡單又不用改程式,爽~~~~~~~~~~~

more~

以上的寫法是當重覆執行時,新的排程就直接放棄不執行
但如果是要執行,但可等個幾分鐘怎麼做哩
只要改參數即可
#等60秒後,再執行(要拿掉n,加上w)
* * * * *  flock -x /tmp/test.lock -w 60 -c '/home/fish/test.sh' 


星期三, 8月 05, 2015

Jira, Confluence Chart Plugin中文亂碼

JVM 內建字型不足所導致

1.install missing Chinese fonts

  • cjkuni-ukai-fonts (楷體)
  • cjkuni-uming-fonts (明體)
  • cjkuni-fonts-common
  • cjkuni-fonts-ghostscript
  • wqy-zenhei-fonts (文泉驛,黑體)
  • wqy-zenhei-fonts-common


2.copy to jvm
mkdir /opt/atlassian/confluence/jre/lib/fonts/fallback
cp /usr/share/fonts/cjkuni-ukai/ukai.ttc /opt/atlassian/confluence/jre/lib/fonts/fallback
cp /usr/share/fonts/cjkuni-uming/uming.ttc /opt/atlassian/confluence/jre/lib/fonts/fallback
cp /usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc /opt/atlassian/confluence/jre/lib/fonts/fallback

p.s. 不知道cjkuni-fonts-common, cjkuni-fonts-ghostscript, wqy-zenhei-fonts-common在哪... 等待有緣人指點一下

3. restart Jira, Confluence

Reference



星期一, 7月 20, 2015

列出排序後的圖檔

說明:
每個分類會有對應的圖檔,原本利用id當檔名存
但因介接系統只認檔名,所在在相同檔名下,更換圖檔內容不會觸發介接系統更新圖
因此利用filename加timestamp來觸發(跟css, js加上?v=xxx同義)

做法:
資料夾下會有多個圖檔,而圖檔的filename會夾timestamp,
在不靠其他persistent data的做法下(記在db or file),就直接sort timestamp當最新的圖檔


  1. 取得所有jpg圖
  2. $files = glob("/path/to/directory/*.jpg");
    --
    Array
    (
        [0] => /path/to/directory/1.jpg
        [1] => /path/to/directory/2.jpg
        [2] => /path/to/directory/3.jpg
    )
    
  3. 加上其他圖檔格式(靠GLOB_BRACE)
    $images = glob("files/*.{jpg,gif,png}", GLOB_BRACE);
    
  4. 還有大小寫問題 >_<
    $images = glob("files/*.{[jJ][pP][gG],[gG][iI][fF],[pP][nN][gG]}", GLOB_BRACE);
    


  5. 排序部份靠php,完整的寫法如下(如果還要其他圖檔格式,就自己加囉)
    $images = glob("files/*.{[jJ][pP][gG],[gG][iI][fF],[pP][nN][gG]}", GLOB_BRACE);
    $sorted = rsort($images); //由大到小
    


Reference
Using PHP's glob() function to find files in a directory

星期四, 6月 18, 2015

Scrum是提早給feedback,但講好的需求,就是要上線啊

看到好多單位都能研究新的技術,並提出相關的應用
心裡在想為何別人能持續在技術有進步

公司最近有個顧問要離開
提到「這幾個月他工作滿開心的,因為沒有人assign工作給他,所以有時間鑽研他有興趣的議題」

也讓我回想到去年底時,因健況出了問題,在家專心養病
沒有時程壓力,便有時間大量閱讀某技術的相關資料
今年回來時,也帶顉同事使用該技術

後來在David Ko的Blog看到這張圖
要 Output 還是要 Outcome

讓我回想,回到工作崗位後,疲於趕user的feature,一直在拚output
如果省下時間只做有價值的產品
我想整個team都會有更多時間在打混開發更有價值的東西,以及技術研究上 XD

local server拿ISO當yum repo server

Linux Server在內網,被限禁無法對外連
因此要yum install時,都得自己找rpm
而公司又會鎖ftp,因此找rpm都很難找

最近要裝新東西,實在被搞煩了
看一下有好東西,可以直接拿ISO檔當yum repository
Step1. mount iso
Creating a Local Yum Repository Using an ISO Image
Step2. setup yum server
Setting up a Local Yum Server Using an ISO Image

還滿容易的~
現在下yum install就自己裝好了
好感動,差點哭出來...


p.s. yum install可能還會出現以下錯誤
GPG key retrieval failed: [Errno 14] Could not open/read file:///etc/pki/rpm-gpg/RPM-GPG-KEY
只要加上--nogpgcheck即可
[root]#yum install --nogpgcheck {packagename}

星期六, 6月 06, 2015

Kanban Board應放哪裡

因團隊是在會議室內,理所當然放會議室裡
daily meeting,討論issue等,也都在會議室內

由於自主管理,主管也不太曉得我們在做什麼
反正沒出什麼包,就放給我們自己玩
只不過都關在房間裡,有天反問我,不曉得team在做什麼
這實在很難解釋...

後來有個團隊沒有會議室,只好將看板貼在放走廊上
嘿~ 這還不錯,因旁人都看的到,感覺有在做事
所以也把看板搬出來了

幾天後主管就說感覺工作氣氛不一樣
每個team比較活絡有互動~

有時還是得表現給別人看(誤)

提早得到feedback,但調整也得花時間呀~ user老大

最近開始run scrum
每回合產出的項目,也讓user實際操作體驗
在正式上線前得到不少feedback及調整需求
感覺挺不錯的~

西嘎西!!! (日語:但是)
「需求要調整,原定的功能也得在原定時程完成,也就是上線的時程不變」
我咧...
開發單位:不是有說好需求要排優先,那優先權較低的可以拿掉呀
需求單位:所有的需求都已經砍過了,沒有辦法法再砍了,一定要全上...

怪不得的有團隊明明開發差不多了
卻說上線前幾天才能給user測試
私底下問,才得知user就不會有時間改需求
把球丟回給user...

這叫「上有需求變更,下有裝死對策」

星期二, 3月 24, 2015

排程與apache建立共用folder


由於透過排程建立image資料夾丟圖片
而後台(人工)作業也會透過apache建立資料夾丟圖片
但權限不同(owner不同),造成無法丟入圖檔
最麻煩的是Server被禁止無法在php裡執行chmod

想了幾個做法
  1. 透過localhost/shell啟動apache/[cron-user]建立folder  (failed)
    原本想用排程透過curl呼叫"建立folder"的PHP (owner 為apache)
    但因為一樣是建立自己的帳號,反而是自己無權限丟檔  o_Q
  2. 排程執行固定執行Shell (work around)
    可以,但因為要改對方建立的folder,所以得要有root權限,不太好的解法 
  3. 透過apache執行排程 (solution)
    原本想建立apache user來寫排程,但Admin不同意
    後來看到可以sudo為apache來寫排程,這樣一來都是owner都是apache~ YA~
    sudo -u apache crontab -e

星期日, 3月 08, 2015

PHP到底有沒有DB Connection Pooling

一直沒搞懂到底PHP有沒有Connection Pooling...
看了Persistent connections,又有人說不要用
沒事就被打個槍,還是好好研究一下

先簡單的來說有什麼做法(linux下)
  1. PHP的MSSQL extension
    1. 就是常見的pconnect,不建議
  2. PHP的PDO extension
    • 做法
      • 將connection cache下來,當其他的php script request,再重覆使用
        寫法如下
        <?php
        $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
            PDO::ATTR_PERSISTENT => true
        ));
        實驗結果PDO可以的ATTR_PERSISTENT ,還可關掉ODBC的pooling
    • 討論
      • PHP官網指出,如果有ODBC做pooling的話,就用ODBC做,因為可讓同process其他的模組使用
  3. ODBC Connection Pooling(unixODBC)
    • 做法
      • 存在Web Server裡,供給Web Server Process使用
      • 前提是使用的ODBC driver及library要有支援
      • PDO_ODBC及unixODBC v2.0後都有支援Connection Pool
    • 另外利用ODBC的還有以下,但各自有沒有再實作pooling沒研究
      • Microsoft ODBC
      • Easysoft ODBC
  4. freeTDS
    • 做法:利用linux process管理connection
    • 怪可怕的,如果process掛了,那connection就GG了
    • 而且只接受TDS 4.2, 也不接受ntext

Summary

看起來利用ODBC比較做是比較建議的做法
另外就不用再用PDO做persistent,因為會被cache住,不會還給ODBC.

  • 使用Pooling注意事項
    勿改變connection 狀態,例如改default db,造成使用同組db帳密的request會讀取錯誤


Reference
Connections and Connection management
ODBC Connection pooling

星期一, 3月 02, 2015

Code Review項目

一直覺得Code Review滿重要的
高效代碼審查:來自前質疑者的9個建議有提到Code Review有助於以下

  • 抓bug
  • 保證代碼的可讀性,可維護性
  • 在團隊中散播代碼的知識
  • 讓新人適應團隊的工作方式
  • 讓大家接觸不同的思路

文章還有提到些具體的做法
我也要加入Working Agreement

  • 每次的pull request都要求所有team member做code review
  • 條列check item
    • 這項還滿不錯的,至少每個人會習慣必要的項目
      自己寫code時也會注意


Reference: 高效代碼審查:來自前質疑者的9個建議

禁止root遠端ssh登入 linux


新架了Linux Server,沒想到才幾天而已
就發現root在2小時內,就有7000多次的登入失敗記錄

太可怕了... 趕快加個限制
禁止root遠端ssh登入 linux

vi /etc/ssh/sshd_config
--
PermitRootLogin no
--
/etc/init.d/sshd restart

Reference:
Security Tip: Disable Root SSH Login on Linux

星期二, 2月 17, 2015

API Response Format

對API的response沒有設定標準格式
每次寫API就在想,網路上看到這版本還不錯
再小調整一下,符合自己需要的
統一這個版本了
{
    success: <boolean>,
    error : { /* Only included if success is false. */
        code: (customize error code)
        msg: (for message)
    },        
    response: {} /* Only included if success is true */
}


Reference
Sentiment Analysis Endpoint

星期四, 1月 08, 2015

導Agile可以,但品質要顧好

前陣子學Agile,懂了點皮毛,正在公司導Agile
最近主管回覆:「導Agile可以,但品質要顧好」
聽起來很不合agile的邏輯,想了好久

Agile是Rough, adaptive plan,不是No plan...

我在想主管應該是以為Agile是No Design, No Plan在開發
因此對Agile會有些品質的誤解
在 Henrik Kniberg 的 文章 What is Scrum? 裡有張圖還不錯


應該就能知道Agile是Rough, adaptive plan
而不是No plan的開發









品質應該更好... 顧吧

對主管的話特別有反應是因為....
Agile把feature size切小,不敢說小就簡單
但至少開發, Tester對該週期開發的feature掌握度高
即使出搥了,也能快速的找出問題修正

公司有個team
每個月上20多個features,要上線時都要搞半夜上線
一有問題,就得從這堆features找bug
我實在很佩服,問他們不會壓力很大嗎
還說不會哩... 真是神人....

每個release短一點,features少一點

如果改成每週上5個features,我想相對大家會容易應付些
雖然每週上線壓力有點大,不過總比一個月上20多個feature好一些
而且如同agile說的,也許剩餘的feature會因些feedback有所調整或消失...