สวัสดีผู้อ่านทุกท่านนะครับ กลับมาพบกันอีกครั้งกับบทความ Android Security กันครับหลังจากที่ห่างหายกันไปนานเลยทีเดียว ซึ่งในตอนนี้ก็เป็นตอนที่ 6 กันแล้วนะครับ สำหรับท่านใดที่ยังไม่ได้อ่านบทความตอนก่อนหน้าสามารถย้อนกลับไปอ่านได้ที่เพจของทางบริษัทดาต้าฟาร์มเลยนะครับ
สำหรับในตอนนี้จะเป็นเรื่องของพื้นฐาน Android Application ครับ โดยในเรื่องนี้เนื่องจากมีเนื้อหาค่อนข้างมาก ดังนั้นผมเลยจะขอแบ่งเรื่องนี้ออกเป็น 2 ตอนย่อย ๆ แล้วกันครับ ซึ่งเนื้อหาโดยคร่าว ๆ จะประกอบไปด้วยเรื่องของ โครงสร้างของ Android Application, Intents, Deep Link, AIDL และเรื่องของ Messenger ครับ เพื่อไม่ให้เป็นการเสียเวลาเราไปเริ่มกันเลยครับ
Android Application Structure
มาเริ่มกันที่เรื่องแรกนะครับ โดยในหัวข้อนี้จะเกี่ยวข้องกับโครงสร้างพื้นฐานของ Application บน Android ครับ ซึ่งจากบทความในตอนก่อนหน้าเราสามารถแบ่งส่วนประกอบของแอปพลิเคชันแอนดรอยด์ออกเป็น 2 ส่วนหลัก ๆ คือ ส่วนของ Source Code Java และส่วนของ XML ซึ่งเป็นการกำหนดการตั้งค่าการใช้งานของแอปพลิเคชัน โดยในบทความนี้เราจะมาเจาะลึกในเรื่องนี้กันครับ
Java สำหรับแอปพลิเคชันแอนดรอยด์โดยส่วนใหญ่แล้วจะถูกพัฒนาขึ้นโดยใช้ภาษา Java เป็นหลัก แต่ในปัจจุบันก็มีภาษาอื่นอีกมากมายที่สามารถนำมาใช้ในการพัฒนาแอปพลิเคชันบนระบบปฏิบัติการแอนดรอยด์ด้วยเช่นกันที่ผู้พัฒนาสามารถเลือกนำมาใช้ได้ เช่น Kotlin, C++ เป็นต้น
AndroidManifest.xml ในส่วนของไฟล์ AndroidManifest.xml ประกอบไปด้วยการตั้งค่าต่าง ๆ ของแอปพลิเคชัน ซึ่งมีความสำคัญไม่แพ้ Source Code เลย หากไม่มีไฟล์ XML นี้จะส่งผลให้แอปพลิเคชันไม่สามารถทำงานได้บนระบบปฏิบัติการแอนดรอยด์
ใน AndroidManifest.xml จะประกอบไปด้วยข้อมูลและการตั้งค่าต่าง ๆ ของแอปพลิเคชัน เช่น ชื่อของแอปพลิเคชัน, ส่วนประกอบหลักของแอปพลิเคชัน, เวอร์ชันของระบบปฏิบัติการแอนดรอยด์ที่แอปพลิเคชันสามารถทำงานได้ โดยการตั้งค่าต่าง ๆ จะอยู่ในรูปแบบของ Attribute ของ XML Format
การตั้งค่าต่าง ๆ ในไฟล์ AndroidManifest.xml มีอยู่หลายส่วน ซึ่งส่วนที่สำคัญมากที่สุดส่วนหนึ่งก็คือ SDK Version ที่จะถูกประกาศอยู่ใน Attribute <uses-sdk> โดยสามารถแบ่งได้ดังนี้คือ minSdkVersion, targetSdkVersion, maxSdkVersion
MinSdkVersion จะบ่งบอกถึงเวอร์ชันของระบบปฏิบัติการแอนดรอยด์ในเวอร์ชันเก่าที่สุดที่สามารถติดตั้งและใช้งานแอปพลิเคชันได้ ซึ่งการที่แอปพลิเคชันมีการตั้งค่าให้รองรับการใช้งานบนระบบแอนดรอยด์ในเวอร์ชันเก่า ๆ จะมีความเสี่ยงในเรื่องของ Security จากการใช้งาน เช่นหากระบบแอนดรอยด์มีช่องโหว่ในเรื่องของ Internal Storage แอปพลิเคชันที่ติดตั้งบนแอนดรอยด์เวอร์ชันดังกล่าวนี้ย่อมมีความเสี่ยงของการถูกเข้าถึงข้อมูลภายในได้เช่นกันแม้ว่าแอปพลิเคชันนั้นจะถูกพัฒนาให้มีความปลอดภัยมากเพียงใดก็ตาม
ในมุมมองของธุรกิจแล้วผู้พัฒนาส่วนใหญ่จะตั้งค่าแอปพลิเคชันของตนเองให้สามารถทำงานบนอุปกรณ์ที่มี MinSdkVersion ต่ำ ๆ เพื่อรองรับผู้ใช้งานได้มาก ๆ ซึ่งก็จะเกิดช่องโหว่ให้ผู้ไม่ประสงค์ดีสามารถเข้าถึงข้อมูลของผู้ใช้งานได้ง่าย ดังนั้นแล้วหากมีความจำเป็นที่จะต้องรองรับการใช้งานจากผู้ใช้ที่มีเวอร์ชันของแอนดรอยด์ต่ำ ๆ ก็ควรจะพิจารณาถึงการป้องกันต่อความเสี่ยงที่อาจจะเกิดขึ้นได้ในอนาคตด้วย
ต่อมาในส่วนของ targetSdkVersion จะบ่งบอกถึงเวอร์ชันของแอนดรอยด์ที่ทางผู้พัฒนาได้พัฒนาแอปพลิเคชันนั้นขึ้นมา ซึ่งหากเราติดตั้งแอปพลิเคชันที่ตรงกับเวอร์ชันของแอนดรอยด์นี้จะทำให้เราสามารถใช้งาน Features และฟังก์ชันต่าง ๆ ได้อย่างราบรื่นมีความ Compatible กันมากที่สุด
Intents
Intents เป็นส่วนประกอบหลักของแอนดรอยด์ทำหน้าที่ในการติดต่อสื่อสารระหว่างแอปพลิเคชันและ Components หรือติดต่อระหว่างแอปพลิเคชันอื่น โดยทั่วไปแล้ว Intents จะเรียกใช้ Action ต่าง ๆ ของแอปพลิเคชันหรือเพื่อเปิดหน้า Activity และการส่งข้อมูลระหว่าง Activity ซึ่ง Intents สามารถแบ่งได้หลายประเภทคือ Implicit Intents, Explicit Intents, Broadcast Intents, Sticky Broadcast, Pending Intents
Deep Links
Deep Links เป็นการเรียกใช้งาน Intents ผ่าน URL ของเว็บไซต์ต่าง ๆ ซึ่งแอปพลิเคชันสามารถเรียกใช้งานลิงค์และส่งข้อมูลได้ตามที่ต้องการ ในการรับส่งข้อมูลผ่าน Intent ของ Deep Link นี้เราจำเป็นต้องไปตั้งค่าในไฟล์ Androidmanifest.xml ไม่ว่าจะเป็นส่วนของ Action, Category และ ข้อมูลต่าง ๆ ใน Intent-filter เช่น “android.intent.category.BROWSABLE”
เช่นเดียวกันกับข้อมูล Input จากภายนอก ข้อมูลที่มีการรับส่งผ่าน Intent จาก Deep Link ควรจะมีการตรวจสอบเป็นอย่างดีก่อนจะเรียกใช้งานภายในแอปพลิเคชัน นอกจากนี้แล้วควรจะตรวจสอบ Data ที่มีการใช้งานด้วย เช่นหากแอปพลิเคชันมีการเรียกใช้งาน WebView ก็อาจส่งผลให้แอปพลิเคชันนั้นมีช่องโหว่ในเรื่องของ XSS หรือช่องโหว่อื่น ๆ ด้วย
AIDL
AIDL ย่อมาจากคำว่า Android Interface Definition Language ซึ่งเป็น IDL เฉพาะของแอนดรอยด์ที่ใช้ในการติดต่อสื่อสารระหว่างแอปพลิเคชันและ Process อื่น ๆ โดย Service ที่มาเรียกใช้งาน AIDL จะเรียกว่า Bound Service
Bound Service คือ Server ในส่วนของ Client Server Interface โดยอนุญาตให้ Components หรือ Activity เข้าใช้งาน Service, ส่ง Requests, รับข้อมูล Response และติดต่อสื่อสารกับ Process อื่น
ในการใช้งาน AIDL ควรพิจารณาการตั้งค่า Permission หรือการกำหนดสิทธิ์ให้ถูกต้องหรือไม่ในไฟล์ AndroidManifest.xml โดยการจำกัดสิทธิ์ของแอปพลิเคชันอื่นในการเรียกใช้งาน ซึ่งหากแอปพลิเคชันไม่มีการกำหนดสิทธิ์อย่างเหมาะสมก็อาจส่งผลให้แอปพลิเคชันอื่นโดยผู้ไม่ประสงค์ดีสามารถเรียกใช้งานและเข้าถึงข้อมูลได้โดยไม่ได้รับอนุญาต
Messenger
มาถึงเรื่องสุดท้ายกันแล้วนะครับ ซึ่งก็เป็นเรื่องของ Messenger นั่นเองโดย Messenger เองก็เป็น Bound Service ประเภทหนึ่งเช่นกันและก็ยังเป็น IPC Mechanism ในส่วนประกอบของแอนดรอยด์ที่มีหน้าที่ในการ Share Service ให้กับแอปพลิเคชันอื่นโดยไม่ต้องใช้งาน AIDL โดย Client สามารถเรียกใช้งาน Messenger ในการรับข้อมูลผ่าน IBinder ซึ่งใช้ในการส่งข้อมูลต่าง ๆ ไปยัง Service หรือระหว่าง Process หรือแม้กระทั่งรับข้อมูลจากแอปพลิเคชันอื่นผ่าน Method onBind ในบทความนี้แอดจะไม่ขอลงรายละเอียดในเรื่องนี้มากนักนะครับ แต่หากผู้อ่านท่านใดอยากศึกษาเพิ่มเติมก็สามารถอ่านได้จากลิงก์อ้างอิงท้ายบทความได้เลยครับ
References
https://www.geeksforgeeks.org/top-programming-languages-for-android-app-development/
https://developer.android.com/guide/topics/manifest/manifest-intro.html
http://developer.android.com/reference/android/content/Intent.html
https://developer.android.com/guide/components/intents-filters
https://www.devahoy.com/blog/2014/06/android-open-new-activity-with-intent
http://developer.android.com/training/app-indexing/deep-linking.html
http://developer.android.com/guide/components/aidl.html
http://developer.android.com/guide/components/bound-services.html
http://developer.android.com/reference/android/os/Messenger.html
http://developer.android.com/guide/components/bound-services.html#Messenger