วันศุกร์, ตุลาคม 21, 2559

ดาวโหลด video จาก Udemy, Safari Online ง่ายๆด้วย youtube-dl

เคยเขียน blog รวมสูตรหรือรวมคำสั่งที่ ให้ youtube-dl ช่วยโหลดไฟล์จาก youtube เอาไว้เมื่อนานมาแล้ว ตอนนี้ก็ยังใช้ youtube-dl อยู่นะ เพราะใช้มันดาวโหลด clip ที่ตัวแอพมือถือไม่ได้อนุญาตให้โหลด offline เอาไว้ได้ เลือก best video quality ก็ได้

ปีนี้มา revisit youtube-dl เวอร์ชั่นปัจจุบันกัน มันเจ๋งมาก ทำให้ชีวิตการเรียน online สบายขึ้นอีกเย๊อะ (เสียงสูง)

วันอังคาร, ตุลาคม 11, 2559

วิธีทำให้ OSX 10.12 Sierra อ่าน/เขียน NTFS ได้

เมื่อ​ Apple ออก OS version ใหม่ เราก็ต้องมาหาวิธีทำให้มัน เขียนไฟล์ลงใน drive NTFS กันอีกครา

ในโพสนี้เราก็จะมาทำให้ macOS Sierra มันเขียน drive ที่ format เป็น NTFS ซึ่งใช้กับ Window OS เป็นหลัก วิธีที่เคยใช้กับ Yosimite หรือ El Capitan ใช้ไม่ได้กับ Sierra นะ

วันจันทร์, ตุลาคม 10, 2559

วิธีติดตั้ง macOS Sierra ลง Virtualbox

เมื่อสองสามสัปดาห์ก่อน Apple ออก OS version ใหม่สำหรับเครื่อง Mac, Macbook ปกติผมจะรีบตามอัพเดตตลอด แต่ตอนนี้ไม่รู้ทำไม ไม่มีแรงจูงใจมากพอที่จะอัพเดต OS ของ macbook ที่ตัวเองใช้ทำงานอยู่เลย

อืม...แต่ก็นึกถึง blog วิธีติดตั้ง NTFS ใน El Capitan เพื่อให้เครื่อง Mac อ่าน+เขียน disk ที่ใช้ใน windows ได้ เราจะต้องรีบเพิ่มเนื้อหาสำหรับ mac OS Sierra ซะหน่อย คิดๆว่าทำไงถึงจะเขียนได้โดยยังไม่ต้องอัพเดต OS ในเครื่องตัวเอง เลยได้มาเป็นโพสนี้

วันจันทร์, สิงหาคม 22, 2559

OAuth คืออะไร?

เค้าออกเสียง OAuth กันว่า [โอ-อ๊อด] บางคนบอกว่ามันเป็น flow ของการ login เหมือนเวลา login app ด้วย Google account บ้างก็บอกว่าเป็นอะไรที่เกี่ยวกับเรื่องความปลอดภัย (security) แล้วก็บอกได้แค่นั้นแหละ

OAuth คือ

OAuth มันไม่ใช่ API ไม่ใช่ service แต่เป็นมาตราฐานแบบเปิดเกี่ยวกับการยืนยันสิทธิ์ (Authentication) การจัดการสิทธิ์การใช้ระบบ (Authorization) ซึ่งนักพัฒนาเอามาใช้งานจริงได้ เป็นมาตราฐานที่แอพพลิเคชั่นจะใช้ติดต่อกับเครื่อง client ในแบบการเข้าระบบผ่านตัวแทนที่ปลอดภัย (secure delegated access) ...ห๊ะ มันอะไรกัน secure delegated access ลองอ่านต่อไปก่อนนะครับแล้วน่าจะเข้าใจ

OAuth ทำงานผ่าน HTTP และอุปกรณ์ที่ได้รับอนุญาต หรือทำงานผ่าน APIs, เซิฟเวอร์, แอพ ที่ได้รับอนุญาต โดยใช้สิ่งที่เรียกว่า access token [แอคเซส โทคเค่น] แทนรหัสผ่าน/พาสเวิร์ด OAuth มี 2 เวอร์ชั่น มี 1.0a กับ 2 ซึ่งใช้ด้วยกันไม่ได้เลย เสปคไม่เหมือนกัน -__- อ่าว

OAuth ทำอะไรได้

ว่ากันง่ายๆ OAuth เป็น protocol ที่รองรับ flow หรือเส้นทางในการยืนยันสิทธิ์ ทำให้มั่นใจได้ว่า ผู้ใช้คนใดๆมีสิทธิ์ที่จะทำอะไรๆได้บ้าง OAuth มันทำแค่นี้จริงๆ ไม่เกี่ยวกับเรื่องการ login เลย มันไม่ได้เกี่ยวกับเรื่องการตรวจสอบการ login หรืออะไรทำนองนั้นนะ

อ่านมาถึงตรงนี้อาจจะสงสัยว่า protocol ที่ทับศัพท์เนี่ยมันแปลว่าอะไร ในที่นี้จะหมายความประมาณว่า พิธีการ/วิธีการ

ในโพสนี้จะพูดกันถึง OAuth version 2 ก่อน

วันศุกร์, กรกฎาคม 22, 2559

Tips: ลบข้อมูลที่ฝังอยู่ในภาพถ่าย ด้วยเครื่องแม็ค Remove Exif & GPS location from your photos with Mac (OSX)

    รู้กันหรือเปล่าว่าเวลาเราถ่ายภาพด้วยกล้องดิจิตอล หรือกล้องมือถือภาพของเราจะมีข้อมูลเกี่ยวกับสถานที่ และเกี่ยวกับกล้องที่เราใช้เก็บเอาไว้ ภาษาเทคนิคเค้าเรียก EXIF

    ผมอยากจะเอาภาพบางภาพไปแชร์ในที่สาธารณะ เช่น คราวนี้ ไปซื้อของจากเวบไซต์ Aliexpress มา จะนำภาพสินค้าขึ้นไปในระบบเขา เพราะเราจะได้คะแนนเวลาเราซื้อ และเวลาเราเอาภาพสินค้าขึ้นไป เหมือนเป็นการรีวิวสินค้ากลายๆ ภาพถูกแชร์แบบสาธารณะเลยเป็นห่วงเรื่องความเป็นส่วนตัว (privacy) ต้องหาวิธีลบข้อมูล EXIF ข้างต้น

วันเสาร์, กรกฎาคม 09, 2559

DIY แท่นวาง Macbook และตัวขยายพื้นที่โต๊ะทำงาน จากร้าน Daiso (Daiso hack; Not an Ikea hacks)



    เห็นฝรั่งทางยุโรปเค้ามี Ikea hack กัน คือการเอาสินค้าของ Ikea มาดัดแปลง ไม่ได้ใช้ตามแคตตาล็อก เช่น โต๊ะกาแฟก็มีคนเอามาแขวนผนังแสดงผลงานศิลปแทน เอาตู้กับข้าวมาแปลงเป็นชั้นวางทีวี เป็นต้น

เอ๊..เราก็มีนะแต่เราซื้อของร้านไดโซะ (Daiso) ราคาประหยัด เอามาประยุกต์ใช้ในที่ทำงานเหมือนกัน 

บลอคนี้ขอนำเสนอ Daiso hack 2 อย่าง 

วันศุกร์, มิถุนายน 24, 2559

[OSX] ติดตั้ง Oracle SQLPlus (Oracle instant client) ใน Mac





ดาวโหลดไฟล์ที่ใช้ได้จาก ลิ้ง นี้
ถ้าใช้ OSX OS X El Capitan, Yosemite and Mavericks โหลด 12.1.x.x นะ เก่ากว่านั้นอาจจะใช้งานไม่ได้
สมัครสมาชิก Oracle OTN ให้เรียบร้อย แล้ว กดเลือก Accept License
Accept License
เราจะใช้ sqlplus จำเป็นต้องโหลด 2 ตัวนี้
  • Instant Client Package - Basic Lite: Smaller version of the Basic, with only English error messages and Unicode, ASCII, and Western European character set support Instantclient-basiclite-macos.x64-12.1.0.2.0.zip
  • Instant Client Package - SQLPlus: Additional libraries and executable for running SQLPlus with Instant Client instantclient-sqlplus-macos.x64-12.1.0.2.0.zip
เปิด Terminal
สร้าง folder กันก่อน
$ mkdir ~/Oracle
แตก zip 2 ไฟล์นี้ที่ดาวโหลดมาได้
$ unzip instantclient-basiclite-macos.x64-12.1.0.2.0.zip -d ~/Oracle
$ unzip instantclient-sqlplus-macos.x64-12.1.0.2.0.zip -d ~/Oracle
เปลี่ยน folder ไปที่เราเพิ่งแตก zip
$ cd ~/Oracle/instantclient_12_1
เราจะสร้าง symbolic link ให้กับ library file ตามที่ Oracle กำหนดมา
$ ln -s libclntsh.dylib.12.1 libclntsh.dylib
จำเป็นต้องใช้ OCCI lib ด้วย พิมพ์ต่อ
$ ln -s libocci.dylib.12.1 libocci.dylib
ต่อไปจะต้องเพิ่ม path เพื่อให้เราสามารถเรียกคำสั่งใน folder นี้ได้
ตรวจสอบก่อนว่ามีอะไรอยู่ในตัวแปร PATH
$ echo $PATH
/usr/local/sbin:/opt/subversion/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
ต่อไป คือคำสั่งเพิ่ม path ที่จะเรียก program โดยเอา path ที่มีอยู่เดิมมาต่อท้าย path ใหม่
$ export PATH=/Users/{siritas_s}/Oracle/instantclient_12_1:$PATH
ทดสอบเรียก ... เห็นแบบข้างล่าง แสดงว่าใช้ได้แล้ว
$ sqlplus

SQL*Plus: Release 12.1.0.2.0 Production on Fri Jun 24 16:13:38 2016

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Enter user-name:
วิธีทำจาก Oracle, เป็นภาษาอังกฤษ

วันศุกร์, มิถุนายน 10, 2559

รวมบทความเด่น จาวาสคริปต์โพรมิส และการรับมือกับ Error : Promises & Error handling Best Practices

ช่วง 2-3 เดือนนี้ได้เขียนจาวาสคริปต์จริงจังหน่อย (ทุกค่ำวันทำงานเลย) ลองเขียนแอพด้วย ionic framework 2 ซึ่งเป็น Angular 2 ด้วย พอใส่ความสามารถของแอพมากๆเข้า ก็ใช้ Promises เยอะขึ้นเรื่อยๆ เริ่มเกิด Promises hell คือโค้ดมันดูไม่ได้เลย -_-" ไม่รู้จะจัดการความยุ่งเหยิงนี้อย่างไร จึงไปค้นคว้าๆ

เหล่าเซียนจาวาสคริปต์ได้บันทึก Best practices, Promises Pattern เอาไว้พอสมควร รวบรวมไว้ดังนี้

วันพุธ, มิถุนายน 01, 2559

เล่นเลโก้จีน: Nexo Knights: King's Mech Reviewed


สุดสัปดาห์ที่ผ่านมา อยู่บ้านกับลูกชายเพียงแค่ 2 คน หาอะไรเล่นกับเขาดี ที่เสริมสร้างสมาธิซักหน่อย
คำตอบก็มาลงที่ เลโก้นี่แหละ :) คราวนี้ advance เลย หน้ากล่องเขียนว่าสำหรับ 8ขวบขึ้นไป แต่ลูกชายเรา 5ขวบ ทำได้น่า พ่อมันอยากเล่นละ :D 

กล่องที่เอามาเล่นคราวนี้คือ LEPIN no.14001 390 ชิ้น
แกะกล่องมีซองทั้งหมด 7 ซอง ก็อปปี้ของเลโก้เค้าก็ไม่ก็อปให้หมด ควรจะมีหมายเลขมาให้ด้วยนะ 

ลองเปิดๆคู่มือให้ดูสีจะเพี้ยนๆหน่อย ชุดนี้มีสีกรมท่า กับสีดำดูแทบไม่ออก 
พ่อมันชอบขั้นตอนนี้แหละ ทำ knolling 
เสร็จแล้วก็เปิดไปทีละหน้าให้ลูกชายดู พ่อก็จัดชิ้นรอเอาไว้ 
ไม่นานก็ได้ module เล็กๆมาก่อน
กล่องที่ได้มานี้เจอ defect 2 ชิ้น คือที่เสียบดาบหลังหุ่นยักษ์ มันควรจะเป็นแนวตั้ง ไม่ใช่แบบเน้..
ใกล้เสร็จละ
อ่ะแฮ่ม ...

วันจันทร์, พฤษภาคม 30, 2559

Fixed cannot access Tomcat port 8080 on AWS

Just a quick blog notes after try to deploy a demo spring-boot project on Tomcat 8 on EC2 instance (AWS)


Tomcat homepage inaccessible 


i.e. Host not found ... http://ec2-xx-yy-218-150.ap-southeast-1.compute.amazonaws.com:8080/

After execute Tomcat you might found that it cannot access via the browser; This is might because of your networks did not support IPv6 yet. So, We will do force the Tomcat to operate with IPv4 only.

Solution

- Shutdown the Tomcat

- Edit catalina.sh

Add java options JAVA_OPTS. See the code below:

...
#
#   LOGGING_MANAGER (Optional) Override Tomcat's logging manager
#                   Example (all one line)
#                   LOGGING_MANAGER="-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"
# --------------------------------------------------------------------

JAVA_OPTS=" -Djava.net.preferIPv4Stack=true "

# OS specific support.  $var _must_ be set to either true or false.
cygwin=false

darwin=false
...

- Startup Tomcat; It should be accessible now ;)


Command to check if Tomcat running(binding) with IPv6 

$ netstat -ant
...
tcp6       0      0 :::8080                   :::*                    LISTEN
...

After catalina.sh modification 

$ netstat -ant
...
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN
...





วันอังคาร, พฤษภาคม 24, 2559

เล่นเลโก้จีน ชุด mini street Mobile Shop & Coffee Shop | Playing Chinese's bricks "mini street"

สุดสัปดาห์หาอะไรทำกับลูกชาย ตัวต่อเลโก้ก็เป็นความฝันในวัยเด็กของพ่อมันด้วย :) เลยซื้อมาเล่นกับลูก

เราเล่นต่อเจ้าสองร้านนี้กัน
ภาพกล่องลืมถ่าย หายืมเอาจาก google search

เรารู้จัก knolling กันแล้ว ในบลอกก่อนหน้านี้ ต้องจับมาเรียงๆซะก่อน 

เสร็จแล้ว กล่องนี้ไม่ได้ sticker มา :( ว่างๆค่อยพิมพ์ใส่ sticker มาแปะเอง

ชุดต่อมา 
มี design ร้านที่แปลกไป ผมว่าสวยกว่า HSANHE นะ

knolling กันก่อน

   
เสร็จแล้ว :) 

ชักชอบใจ ราคาไม่แพงเหมือน lego (แบบร้านก็ไม่เหมือนนะ แต่ได้แรงบันดาลใจจาก city collection เป็นแน่แท้) จะตามเก็บให้ครบ สร้างเมืองจำลอง bricks ที่บ้านดีกว่า ^^ 





วันเสาร์, พฤษภาคม 14, 2559

มารู้จัก โนวลิ่ง (Knolling) ศิลปการจัดวางข้าวของอันน่าทึ่ง

มารู้จัก โนวลิ่ง (Knolling) ศิลปการจัดวางข้าวของอันน่าทึ่ง

poster

มันเนื่องมาจากเมื่อคืนก่อนเปิดไปเจอ รายการของ Adams Savage อดีตพิธีกรรายการชื่อดัง Myth Buster ทาง Discovery Channel เค้ามาต่อ LEGO custom made ชุดนึงซึ่งต้องใช้ชิ้นส่วนทั้งหมด 1300 กว่าชิ้น ซึ่งมันเยอะมาก

พิธีกรทั้งสองคนจึงพูดกันว่าขั้นตอนแรกจะต้องทำ”โนวลิ่ง”ก่อน !? คุณอดัมเค้าก็อธิบายคร่าวๆอยู่ เหมือนกัน แต่มันยังสงสัยอยู่ เลยต้องไปค้นต่อ...

tested screenshot

วันศุกร์, พฤษภาคม 06, 2559

วิธีใช้ Meterial Design icon ในโปรเจค Ionic framework 2| Howto use Material Design icons in Ionic framework 2 project

poster

วิธีที่นำเสนอนี้เป็นแค่วิธีหนึ่ง จากหลายๆวิธี ที่จะทำให้แอพ ionic2 ของเราแสดงหรือใช้ icon ของ material design ได้

โดยเทคนิคแล้วคือการเลือกประกาศ CSS selector ให้ถูก,ให้โดนนั่นเอง

วันศุกร์, เมษายน 22, 2559

Ubuntu: วิธีปลอดภัย ในการเปลี่ยน subversion เป็น version 1.7 ขึ้นไป ในอูบุนตู 12.04 LST | Upgrade subversion (to 1.7+) on Ubuntu 12.04 the safe way

ถ้าเรา google หาวิธีอัพเกรด version ของ subversion จะเจอเยอะแยะ ส่วนนึงก็จะให้ไปเพิ่ม ppa ของ subversion เลย บ้างก็ให้ เพิ่ม repository โดยชี้ไปที่ URL ของตนเอง แต่วิธีที่จะนำเสนอนี้ดูแล้วว่ามันปลอดภัยระดับนึง ผมเลือกใช้ repository ของ Wandisco ซึ่งเค้าทำธุรกิจที่ต้องใช้ subeversion ทำมาหากิน เชื่อใจได้ระดับนึงว่า ของเค้าต้อง stable และมีการ maintenance ด้วย

วันพุธ, เมษายน 20, 2559

รู้มั้ย? เมื่อไหร่แบตเตอรี่ Macbook จะหมดอายุ | How do you know when your macbook battery is dying

poster

เมื่อไม่นานนี้เอง มีโอกาสได้เปิดฝาเครื่อง macbook 2 เครื่อง เพื่อถอด SSD drive จากเครื่องนึง ไปยังอีกเครื่องนึง แล้วเลยไปสังเกตเห็นว่าแบตเตอรี่มันปูดแล้ว เป็นภาพที่น่ากลัว..แต่ไม่ได้ถ่ายภาพไว้

วันพุธ, มีนาคม 23, 2559

ป้องกัน SSH server จากการโจมตี Brute Force | HOWTO Hardening SSH server

ทาง network admin อีเมลมาว่า firewall ของบริษัทตรวจจับการโจมตีแบบ brute force มายัง SSH server ที่เปิดให้ login ผ่าน internet ได้
โชคดี firewall ตรวจจับ เอาไว้ได้ ให้ทางผมทำอะไรหน่อยเพื่อให้มันเจาะไม่ได้ เช่น เปลี่ยน password
แต่ โชคร้าย server ตัวนึงโดนยึดไปได้ (มันเปลี่ยน root password ...ไอ่ฉิบ~) ดีว่าไม่ใช่ตัวสำคัญ และเป็น VM เลย shutdown แล้วใช้ single mode เข้าไป reset จากนั้นค้นหาทันทีว่าจะป้องกัน SSH จากการโจมตีแบบ Brute force ได้อย่างไรบ้าง

วันพุธ, มีนาคม 16, 2559

สรุปวิธี สร้างและเพิ่ม SSH key ไปใส่ใน git hosting Github, Gitlab, Bitbucket

ตอนนี้มี Git hosting มาให้เลือกใช้มากมาย ที่งานใช้งานบ่อยๆ ช่วงนี้ก็มี

2 ตัวหลังนี่ใช้บ่อยมาก เพราะให้เราสร้าง private project ได้ ไม่จำกัด (ไปจำกัดเรื่องอื่นแทน เช่น จำนวน user/repo, ขนาดของ repo)

สำหรับการใช้งาน git repository ทุกที่ข้างต้น เราจะต้องมี ssh key แลกกับ server เค้า บันทึกนี้จะเป็นขั้นตอนที่ผมทำเวลาสร้าง ssh key ซึ่งปกติเค้าก็จะทำกันครั้งเดียวแหละ เว้นเสียแต่ว่าเราจะทำ ssh key หาย ซึ่งจะทำให้เรา push source code ขึ้นไปไม่ได้

วันพุธ, มีนาคม 09, 2559

Android: ขั้นตอนการใช้ Google Drive API กับ Android app

มีเพื่อนมาขอคำแนะนำ เค้าเขียนแอพขึ้นมา มี feature หนึ่งจะเอาไฟล์ไปใส่ใน Drive ติดที่ว่าพอขึ้นหน้าจอเลือก account แล้วมันก็หมุนวนไปวนมาอยู่อย่างนั้น หลังจากทดลองทำสำเร็จแล้ว เลยมาบันทึกไว้หน่อย

วันศุกร์, กุมภาพันธ์ 12, 2559

แชร์เนื้อหา blogger ให้สวยงามใน timeline ด้วย Twitter card และ Facebook Open Graph

poster

ปีนี้อยากจะเขียน blog ให้เยอะๆ พอเริ่มเขียนเยอะเข้าก็เจอเรื่องขัดใจที่ว่า เวลา share เนื้อหาใน twitter หรือ facebook แล้ว ทำไม URL เรามันไม่แสดงสวยๆเหมือนที่คนอื่นเค้าทำกัน ค้นไปค้นมา อ๋อ มันมี keyword เราต้องใช้ Twitter Card และ Facebook Open Graph

ใน Blogger มันมี widget ให้ใช้แต่มันก็เหมือนว่าจะไม่สมบูรณ์ ไม่เหมือน plugin ที่ Wordpress เค้ามีฝังมาให้ใน theme จริงๆแล้วเราต้องเพิ่ม meta information พวกนี้เอง เรามาดูกันว่าทำยังไง ใน blogger platform

ข้อแนะนำ การแปลง java project ไปใช้ maven (ทำ pom คลีนๆ)

poster

หลังจากผ่านสมรภูมิการแปลง java project ซึ่งเป็น library ที่ที่ทำงานใช้กันมากว่า 5 ปี ของเดิมใช้ ant script ตอนนี้อยากจะใช้มันแบบ maven ถึงจะช้าแต่ก็ดีกว่าไม่ทำนะ ;) เลยมาบันทึกเอาไว้หน่อยว่า สิ่งที่ทำบ่อยๆ ตอนนั้นมีอะไรบ้าง

วันศุกร์, กุมภาพันธ์ 05, 2559

Development: พื้นฐานความปลอดภัยของ web application ตอนที่ 1 (แปล)

poster

เว็บแอพสมัยใหม่มีความท้าทายหลายอย่าง เรื่องความปลอดภัย (security) ก็เป็นเรื่องนึง และมันก็มักไม่ค่อยได้รับความใส่ใจนัก หรือไม่ก็ประเมินความสำคัญเอาไว้ต่ำเกินไป การทำ threat analysis หรือการวิเคราะห์ภัยคุกคามเป็นที่รู้จักกันมากขึ้นเนื่องจากเป็นสิ่งจำเป็นหากจะพัฒนาแอพจริงๆจังๆ และก็ยังมีพื้นฐานบางอย่างที่ไม่ว่ายังไงก็ตามนักพัฒนาควรจะรู้และทำได้

การจะเป็นนักพัฒนาในยุคนี้คุณจะต้องเป็นเหมือนมีดพกทหารสวิส (swiss army knife) นอกจากจะเขียนโปรแกรมได้ตาม requirement แล้ว ต้องทำให้เสร็จไว, ซอร์สโค้ดก็ต้องแก้ไขได้ง่าย มี test, มีความยืดหยุ่นแก้ไขเพิ่มเติมได้สำหรับความต้องการในอนาคต, จะต้องใส่ user interface (UI) ได้เอง, ทำ optimize database, เซตอัพ หรือทำ workflow การ deploy โปรแกรม

ทั้งหมดที่กล่าวมา เมื่อไหร่ก็ตามที่โปรแกรมถูกเอามาใช้งานจริง ถูกใครสักคน hack หรือเจาะระบบเมื่อนั้นแหละเรื่อง security ของระบบก็จะได้รับความสนใจขึ้นมา จริงๆแล้วมันก็เป็นเรื่องที่แอบอยู่กับโปรแกรมของเราตั้งแต่เริ่มพัฒนาแล้ว เรื่อง security นี่แหละ เป็นเรื่องที่สำคัญที่สุด

เค้าเปรียบเทียบ requirement ในด้าน security กับ performance เอาไว้ทำนองที่ว่า security เหมือน performance ตรงที่ เจ้าของโปรแกรมรู้ว่าต้องมี security แต่ไม่แน่ใจว่าจะวัดปริมาณมันยังไง มันไม่เหมือนกันตรงที่ถึงจะเห็นว่าโปรแกรมมี security แล้วแต่ก็ไม่แน่ใจอยู่ดีว่ามีมากพอรึยัง

นักพัฒนาสมัยใหม่อย่างเราต้องอัพเดตความรู้เหล่านี้กันบ้าง โปรแกรมของเราต้องมีภูมิคุ้มกัน ถ้ามีเวลามากหน่อยก็ควรจะไปหาตำรามาศึกษาให้ลึกๆ เลย ส่วน บทความ series นี้จะนำเสนอดังนี้

  • ชี้ให้นักพัฒนารเห็นข้อผิดพลาดที่ผิดกันบ่อย ให้รู้ถึงความเสียงนั้นๆ
  • แนะนำว่าจะจัดการ หรือหลีกเลี่ยงความเสี่ยงดังกล่าวได้อย่างไรบ้าง

(บทความต้นฉบับเป็น Evolving Publication คือเขียนตอนต่อๆไปที่ URL เดิม ตอนใหม่มาก็เพิ่มลงไปด้านล่างเรื่อยๆ)

เรื่องความปลอดภัยของ web application มีเนื้อหากว้างมาก ถึงแม้ว่าเราจะกำหนดขอบเขตว่าเป็นการใช้งานผ่าน browser เท่านั้นแล้วก็ตาม บทความนี้เหมาะกับคำว่า "ที่สุด" มากกว่าที่จะมารวบรวมทุกอย่างที่คุณควรจะรู้ แต่เรื่องที่เป็นที่สุดนี้ก็หวังว่าจะทำให้นักพัฒนาที่สนใจเรื่อง security เหมือนได้ก้าวใหญ่ๆ เข้ามาในเรื่องนี้

ความเชื่อใจ

ความเชื่อใจจัดว่าเป็นรากฐานของเรื่องความปลอดภัยเลย ลองนึกตามดูว่าเราจะเชื่อใจข้อมูลจากสถานการณ์เหล่านี้ได้หรือไม่

  • เราเชื่อ request ที่ส่งมาจาก browser ของผู้ใช้ได้หรือไม่ (ตอบ ไม่ได้)
  • เราเชื่อว่า service ที่จัดการกับ database ให้เรา จะทำข้อมูลไม่เสียหายและไม่สกปรกเลยใช่มั้ย (ตอบ ไม่เชื่อ)
  • เชื่อใจได้มั้ยว่า connection ระหว่าง browser ของผู้ใช้มายังระบบของเราไม่โดนเจาะหรือแอบฟัง (ไม่)
  • เราเชื่อใจใน service และฐานข้อมูลที่เราใช้ในระบบได้หรือเปล่า (ควรจะ)

เรื่อง security มันไม่ตรงไปตรงมาเราจะต้องหาทางรับมือกับมัน ให้มีความเสี่ยงน้อยที่สุด web application ที่อยากจะให้ปลอดภัยเสี่ยงต่ำ ควรจะต้องใช้ Threat Risk modeling แต่จะเอาไว้ตอนหน้า เรื่องมันค่อนข้างซับซ้อน

ตอนนี้จะมาดูกันว่าความเสี่ยงฯต่อระบบเรามีอะไรบ้าง

ปฎิเสธการรับ input ที่ผิดจาก form

อย่าคิดว่าการที่เราเลือกใช้ form input type ต่างๆในหน้าจอจะทำให้เราได้รับข้อมูลแบบที่เราต้องการได้อย่างถูกต้อง ถึงแม้ว่าจะมี javascript มาตรวจสอบก่อน submit ก็เถอะ การปลอมแปลงข้อมูลที่ส่งออกจาก browser ทำได้ไม่ยาก

input ที่เชื่อไม่ได้

หากจะวัดระดับความน่าเชื่อถือของข้อมูลที่ถูกส่งผ่าน html form จาก browser มายัง server และถึงแม้ว่าจะตรวจสอบด้วย javascript ก่อนส่งอีกด้วย ระดับความน่าเชื่อถือเป็น 0 การตรวจสอบความถูกต้องของข้อมูลต้องทำที่ server

ทำไมข้อมูลที่ผิดปกติหรือผิดธรรมดาของมันจึงเป็นเรื่องที่ต้องคิดถึงในแง่ความปลอดภัย จริงๆมันขึ้นอยู่กับ logic ของโปรแกรมเราด้วย แต่ข้อมูลที่ผิดธรรมดานั้นสามารถทำให้ผู้ประสงค์ร้ายโจมตีระบบเราได้ อาจจะทำให้ระบบทำงานผิดพลาด โดนล้วงเอาข้อมูล หรือรันโปรแกรมอะไรก็ได้ สิ่งที่นักพัฒนาจะทำได้ในข้อนี้คือการตรวจสอบข้อมูลเข้า (input validation)

การตรวจสอบข้อมูลเข้า

ทำเพื่อให้แน่ใจว่าเราได้ข้อมูลที่เป็นปกติ เป็นไปตามที่ระบบต้องการ การตรวจสอบนี้จะเป็นปราการด่านแรก การ check null หรือค่าว่างไม่เพียงพอ

positive validation หรือ whitlisting จำกัดรับแต่ข้อมูลที่ยอมรับได้เท่านั้น ให้นึกถึงว่า input นี้รับค่าอะไรได้บ้าง ถ้าเป็นตัวเลขอยู่ช่วงมากน้อยแค่ไหน ค่าบวก ค่าลบได้หรือไม่ การใส่ของลงตะกร้า e-commerce ก็ไม่น่าจะเป็น 1000 ชิ้น เป็นต้น

แล้วเมื่อตรวจพบความผิดปกติของข้อมูลจะทำอย่างได้บ้าง มีสองทางคือ แจ้ง error แล้วไม่บอกอะไรเลย กับบอกผู้ใช้ว่าข้อมูลส่วนไหนผิด แต่การบอกส่วนที่ผิดก็ต้องระมัดระวัง บอกแล้วทำให้รู้ถึงชื่อตัวแปรระบบก็ไม่ได้นะ ให้ใช้ประโยคกลางๆ บอกแค่ว่าข้อมูล field ไหนที่ยังไม่ถูก

เราอาจจะพยายามดักหรือหาข้อความที่เป็นอันตรายที่มากับข้อมูลที่รับเข้า แบบนี้เรียกกันว่า nagative validation หรือ blacklisting ปัญหาที่ตามมาหากใช้วิธีนี้ เราจะต้องเตรียมตรวจจับ bad input ให้ครบซึ่งมันจะเสียเวลาตรงนี้มาก เวลาผ่านไปอาจจะมีเทคนิคใหม่ๆ มาอีก

การพยายามกำจัดคำอันตรายออกจากข้อมูลนำเข้า เช่นหากเจอคำว่า <script> ในข้อมูล ก็จะลบออกก่อนจะนำไปประมวลผลต่อ วิธีแบบนี้เรียก "sanitization" คนโจมตีอาจจะหาวิธีเลี่ยงเทคนิค sanitization ของเราได้ เช่น ใส่ <scr<script>ipt> เมื่อลบคำว่า script ออกก็ยังมี tag script ติดมาอยู่ดี กลายเป็นว่าเราทำให้เกิดช่องโหว่ขึ้นจนได้

ถ้าต้องใช้เทคนิค blacklisting นี้ก็ต้องศึกษาให้ละเอียด เขียน test ดีๆ ศึกษาเอกสารนี้ให้เข้าใจ OWASP’s XSS Filter Evasion Cheat Sheet

web framework สมัยใหม่ส่วนใหญ่จะมี function ที่ทำหน้าที่ validation มาด้วยอยู่แล้ว หรือหากไม่มีเราก็สามารถไปหามาใช้ในรูปแบบ library เสริมก็ได้ การใช้ validation ที่มีให้เหล่านี้ทำให้เราเหมือนมีปราการป้องกัน ก่อนข้อมูลผิดปกติจะเข้าไปชั้นในระบบของเราได้

modern web framework's validation table

สรุป

  • เลือกทำ Whitelist ถ้าทำได้
  • ทำ Blacklist หากทำ Whitelist ไม่ได้
  • ใส่ข้อจำกัดใน form input ให้ได้เยอะที่สุด
  • เลี่ยงการตีข้อมูลใน input กลับมาให้ผู้ใช้เห็น
  • ปฎิเสธเนื้อหาจาก web ก่อนที่มันจะเข้าไปในส่วน logic ของระบบได้ โดยใช้ whitelist ที่มากับ web framework ที่เราใช้

    แม้ว่าเนื้อหาข้างต้นจะพูดถึงแต่การตรวจสอบข้อมูลที่มาจาก form input หากเป็นเนื้อหาในรูปแบบอื่นเช่น json, xml codes ในส่วนที่ใช้ตรวจสอบ form input ก็สามารถใช้ตรวจสอบข้อมูลในรูปแบบอื่นดังกล่าวได้เช่นกัน

จำไว้ว่า

if you don't control it, you can't trust it. If it violates the contract, reject it!

~ ถ้าคุณไม่ได้ควบคุมมัน คุณเชื่อมันไม่ได้ ถ้ามันผิดไปจากข้อกำหนด โยนมันทิ้งไป

เรียบเรียงจาก Martin Fowler's The Basics of Web Application Security

โปรดติดตาม ตอนหน้าจะเป็นเรื่อง Encode HTML Output

วันอังคาร, มกราคม 26, 2559

แบ็คอัพงานแบบมีหลักการ ด้วย 3-2-1 Backup plan

backup-your-work poster

คุณทำงานกับคอมพิวเตอร์แล้วสำรองข้อมูลกันบ้างหรือเปล่า?

ถ้าไม่ backup เลย เหมือนกับเราเล่นกระโดดร่มแล้วไม่มีร่มชูชีพ แต่หากทำ backup แต่ทำเพียงชุดเดียวมันก็อันตรายและเป็นการทำ backup ที่ไม่มีประสิทธิภาพอีกด้วย หาก hard disk ลูกนั้นมันเกิดเสียขึ้นมา โดนขโมย หรือทำหาย ทำหล่นจากที่สูง ฯลฯ สิ่งที่คุณ backup ไว้ก็จะสูญ! ตลอดกาล การสร้าง backup เอาไว้มากๆ ก็เปลืองเวลาเปลืองค่าใช้จ่าย เราเดินทางสายกลางทำแต่พอดีและมีประสิทธิภาพดีกว่า

วันจันทร์, มกราคม 18, 2559

สร้าง https ใน localhost พร้อมกุญแจเขียว บน OS X

เรื่องมันเริ่มจากว่าเห็น post นี้ของ certsimple What web developers should know about SSL but probably don't และ กำลังจะเล่น features HTML5 ที่ต้องใช้ https อยู่พอดี ได้เรื่องมาเขียน blog ละ ฮ่าๆ

วิธีต่อไปนี้ทำสำเร็จใน OS X Yosimite ถ้าจะทำใน Linux เช่น ubuntu, centos หรีอ Window platform ไม่แน่ใจนะครับยังไม่ได้ลองหาวิธี ถ้าจะเอาไปใช้ได้ก็จะเป็นส่วนการสร้าง cert แบบ self signed

https-with-green-padlock-on-localhost-poster

วันอังคาร, มกราคม 12, 2559

Let's Encrypt แก้ obsolete cipher suite ให้เป็น modern cipher suite

poster

ผมลองกดกุญแจเขียว แล้วเห็นคำว่า obsolete cipher suite มันทำให้ข้องใจ ทำ SSL website ของเราได้แล้วแต่เหมือนทำไม่เสร็จ มันเป็นเพราะ configuration ของ http server ของเรา

วันศุกร์, มกราคม 08, 2559

Let's Encrypt สร้างใบรับรอง SSL แบบไม่ต้องไปรันใน server จริง (manual certonly)

Imgur

การขอใบรับรองดิจิตอล (CA; Certification Authority) เพื่อเข้ารหัส website ให้เป็น HTTPS แสดงเป็นกุญแจเขียวตรง address bar ซึ่งหมายถึงว่า ผู้อ่านเวบไซต์ปลอดภัยจากการโจมตีความเป็นส่วนตัวระดับหนึ่ง ข้อมูลที่รับส่งระหว่างเวบไซต์กับผู้เปิดดูได้รับการเข้ารหัส

การเข้ารหัสเวบมีความสำคัญขึ้นอย่างมากดังจะเห็นได้จากข่าวนี้ New York Times ชวนสำนักข่าวทุกสำนัก เปิด HTTPS ภายในปี 2015; blognone เป็นต้น

Eitan Konigsburg วิศวกรซอฟต์แวร์ของ New York Times ออกมาเขียนบล็อกถึงประเด็นความเป็นส่วนตัวของผู้อ่านว่ามีความสำคัญมากขึ้นเรื่อยๆ จากการโจมตีรูปแบบต่างๆ ตั้งแต่การติดตามผู้ใช้ทำให้เสียความเป็นส่วนตัว ไปจนถึงการเปลี่ยนข้อมูลบนเว็บข่าว

แต่ก่อนจนถึงตอนนี้ถ้าอยากได้ใบรับรองจากตัวแทนจะมีค่าใช้จ่าย เช่นหากจะไปขอใบรับรองจาก VeriSign ขอใบรับรองแบบ domain varification (แบบที่ LE ให้) 1 ปี เราจะต้องจ่าย 39 USD แต่ถ้าใช้ LetsEncrypt เราสามารถขอใบรับรองได้ฟรี

ทำไมฟรี?

Let’s Encrypt ให้บริการฟรีได้ ส่วนหนึ่งเพราะมันทำให้กระบวนการต่างๆ ทำได้ด้วยตัวเองได้โดยผู้ใช้ (มีสคริปต์มาให้รันเองได้ และในอนาคตจะเป็นระบบอัตโนมัติมากขึ้น) ค่าใช้จ่ายก็เลยถูกลง และอีกส่วนหนึ่งเพราะมีองค์กรหลายแห่งสนับสนุนเงินทุน รวมๆ คือคนเหล่านี้อยากเห็นอินเทอร์เน็ตที่มันปลอดภัยขึ้น

จาก bact.cc ครับ

ตอนแรก google หาวิธีทำ เช่น มาเล่น Let’s Encrypt กัน และของชาวต่างๆชาติ ล้วนแต่รันใน server ที่ต้องการ HTTPS แค่ติดตั้ง client รัน script มันจะทำทุกอย่างให้อัตโนมัติ กว่าจะได้วิธีและเนื้อหานี้มาก็มึนไปอาทิตย์กว่า