[Android] 使用 HttpClient post 資料到伺服器

其實 Android 有內建 HttpClient 的 library,但是實在是太舊了(4.0beta2),所以用了熱心人士重新包裝過後的 新版,雖然有點大,不過把常用的都包進去了,應該不會踩到一些陳年老 bug。

下面的 code 還有用到 Apache Commons IO,這裡 可以下載。

private void postData(String url, String filepath, String filename ) throws Exception {
        
        byte[] data;
        
        HttpPost httppost = new HttpPost(url);
        HttpClient httpclient = HttpClientBuilder.create().build();
        
        MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
        entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
        
        InputStream inputStream = new FileInputStream(filepath);
        data = IOUtils.toByteArray(inputStream);
        InputStreamBody inputStreamBody = new InputStreamBody(new ByteArrayInputStream(data), filename);
        
        //entityBuilder.addTextBody("action", "test");
        //entityBuilder.addBinaryBody("file", file);
        entityBuilder.addPart("file", inputStreamBody);

        HttpEntity entity = entityBuilder.build();
        httppost.setEntity(entity);
        HttpResponse response = httpclient.execute(httppost);
        HttpEntity httpEntity = response.getEntity();

        String result = EntityUtils.toString(httpEntity);
        Log.d("uploader", result);
        
}

DefaultHttpClient 已經過時了,不建議使用,所以用 HttpClientBuilder 代替。

[Android] 使用 HttpClient post 資料到伺服器

FreeBSD pkgng 套件管理系統

FreeBSD 套件管理分為 ports 與 pkg,其中 ports 主要是包含軟體的原始碼,如果要安裝軟體需要從原始碼編譯,優點是可以更改一些編譯選項,自訂一些平常可能不會用到的設定。pkg 則是預先編譯好的軟體,直接下載回來就可以用。使用上其實不是相當方便,舉例來說相依性的問題要自己處理,雖然有像是 portmaster 之類的工具,但是比起 pacman、aptitude 之流,還是有一段距離。

pkgng 是 FreeBSD 下一代的套件管理系統(FreeBSD 10 的預設值),由現有的 pkg 轉移到 pkgng 十分簡單,官方什麼都想好了。

如果還沒有安裝 pkg,使用以下指令安裝:
# cd /usr/ports/ports-mgmt/pkg; make install clean

然後,用 # pkg2ng 將現有的 pkg 轉移到 pkgng 格式。

轉換好了之後,為了確定以後都使用 pkgng 的格式,在 /etc/make.conf 裡面加入:

WITH_PKGNG=YES

不過,在安裝軟體之前,先設定官方的套件庫,建立以下的檔案:

FreeBSD: {
  url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",
  mirror_type: "srv",
  enabled: yes
}

之後,你就可以下 pkg install <軟體> 來安裝檔案了!
pkg 可以知道有哪些指令可以下,大致上都跟以前類似,例如 pkg_version -v 改成 pkg version -v,還可以用 # pkgng audit -F 取代以前的 # portaudit -adF 來檢查現有的套件是否有安全性問題!

我的建議:如果要安裝預先編譯的 binary 套件,就使用 pkg 安裝,如果想要自訂編譯選項,就用 portmaster,也很方便!

舊的 pkg_* 工具會在 2014/09/01 正式停止支援。

參考資料

來,跟 pkg_ 說掰掰
http://www.freebsd.org/doc/handbook/pkgng-intro.html
http://lists.freebsd.org/pipermail/freebsd-pkg/2013-October/000107.html
https://wiki.freebsd.org/pkgng

FreeBSD pkgng 套件管理系統

建置 syslog-ng server 統一收集 log

因為之前網站被打,收集 log 的時候痛苦萬分,因此希望架設一個中心的 log server 統一收集 log,如此一來寫一些分析的 script、跑一些服務可以更方便。

雖然 FreeBSD 內建的 syslogd 也有 server 的功能,但其過濾的能力不足,從遠端送過來的 log 會全部混在一起,無法照服務(例:apache)分開,而網路上大部分的教學多是採用 syslog-ng,因此決定來實驗 syslog-ng。

syslog 的標準 RFC 5424 定義了可以用的 syslog facility level,其中我們取 local1 來作為 httpd-access 的記錄檔使用。

以下的範例我要設定來自 client 主機的記錄檔,把 httpd-access 統一存在一個檔案,剩下的照 "$HOST-$FACILITY" 的規則存在 server 上。 繼續閱讀 “建置 syslog-ng server 統一收集 log”

建置 syslog-ng server 統一收集 log

設定 ntpd,避免成為 DDoS 肉雞

大部分系統 ntpd 預設配置檔案都有一個問題,當啟用之後,容易被利用參與 DDoS 放大攻擊。其中的 MONLIST 指令可以回傳該 ntp server 最近聯繫之 ntp server (通常為對時用),若是搭配偽造的 IP address,攻擊者可以創造出類似 DNS 放大攻擊的效果。

CloudFlare 前陣子被 DDoS 攻擊,經查之後發現接近 400 Gbps 的流量是來自於接近 4,500 台的 NTP server 導致的。

於此網站可以查詢有啟動 ntp,可能遭到利用的主機:http://openntpproject.org/ 輸入 IP address range (例:140.115.189.0/24) 可查詢整個網段。

建議各位停用系統中的 ntpd,改用 ntpdate (client only)。 UPDATE: 設定 ntpd 為較好的做法,ntpdate 為過時之工具,參考資料:https://lists.debian.org/debian-user/2002/12/msg04091.html

修改方法為編輯 /etc/rc.conf

ntpd_enable="YES"

編輯 /etc/ntp.conf

server time.stdtime.gov.tw
server watch.stdtime.gov.tw

#反註解,設定不讓他人查詢
restrict default ignore
restrict -6 default ignore
restrict time.stdtime.gov.tw nomodify nopeer noquery notrap
restrict watch.stdtime.gov.tw nomodify nopeer noquery notrap

同時,也可將 ntpdate 放進 crontab,每日自動對時。

參考資料:http://blog.cloudflare.com/technical-details-behind-a-400gbps-ntp-amplification-ddos-attack

設定 ntpd,避免成為 DDoS 肉雞