API คืออะไร?
API ย่อมาจาก Application Programming Interface คือการพัฒนาโปรแกรมสำหรับเป็นส่วนติดต่อเซอร์วิสของแอพพลิเคชั่น หรือโมดูลต่างๆ เพื่อให้คนภายนอกมาเรียกใช้งาน หรือกล่าวอย่างง่ายๆ ก็คือการเขียนโปรแกรมเพื่อให้บริการสำหรับให้คนอื่นมาเรียกใช้งาน ซึ่งแนวคิดเรื่องการสร้าง API เพื่อการใช้งานก็มีมาอย่างยาวนานแล้ว ยกตัวอย่างเช่นตั้งแต่ที่มีการสร้างระบบปฎิบัติการ (OS) ก็จะมีการติดต่อ API ของไดร์เวอร์อุปกรณ์ฮาร์แวร์ต่างๆ ของเครื่องคอมพิวเตอร์เพื่อเรียกใช้งานอุปกรณ์นั้นๆ ตามคำสั่งของนักพัฒนา (more…)
Year: 2016
-
การพัฒนา API อย่างมืออาชีพ และทำไมต้อง RESTful Service
-
แก้ไข wordpress post แล้ว update ไม่ได้ แอดมินต้องแก้ไขอย่างไร
หลังจากย้าย WordPress site ไปลง ubuntu 16.04.1 ก็ได้เตรียมติดตั้งโปรแกรมต่าง ๆ แต่แล้วเมื่อลองจะแก้ไขบล็อก กลับทำไม่ได้ ขึ้นข้อความว่า
“The sysadmin.psu.ac.th page isn’t working
sysadmin.psu.ac.th is currently unable to handle this request.
HTTP ERROR 500”เกิดอะไรขึ้นหล่ะ แล้วเราจะต้องทำอย่างไร
ค้นหาเจอเว็บนี้ ที่บอกเราว่า ให้ลองเปิด DEBUG
https://wordpress.org/support/topic/http-error-500-internal-server-error-whole-blog-is-down“So to understand where the reason of 500 error is I suggest go to wp-config.php in the root of your website and add there two lines:
define(‘WP_DEBUG’, true);
@ini_set(‘display_errors’, 1);
After that you can see exactly place which linked with 500 error.
After fixing I suggest return it how it was by default (only one line)
define(‘WP_DEBUG’, false);”เมื่อใช้คำสั่งตรวจสอบ error.log ครั้งแรก ไม่เห็นอะไรเพิ่มเติม แต่พบ error 404 ของ plugin ที่ชื่อ WP Like Button ก็ลองปิด plugin นี้ดูเราจึงจะพบ error ก็เห็น error ต่าง ๆ ได้จากคำสั่งข้างล่างนี้
tail -f /var/log/apache2/error.log
Fatal error: Uncaught Error: Class ‘DomDocument’ not found in /var/www/wordpress/wp-content/plugins/google-sitemap-plugin/google-sitemap-plugin.php:144
ค้นหาต่อว่าทำไมจึงขาด DomDocument ก็เจอเว็บนี้
https://blog.namran.net/2009/03/10/php-fatal-error-class-domdocument-not-found-in-blabla/
แนะนำว่า“the solution turn out to be yum install php-xml”
ตรวจสอบดู เออนะ ไม่มี php-xml จริง ๆ ด้วย ด้วยคำสั่งนี้
dpkg -l | grep php-xml
dpkg -l | grep php7.0-xmlทีนี้เราก็ติดตั้ง php-xml ด้วยคำสั่ง
sudo apt install php-xml
จะได้
libxslt1.1 php-xml php7.0-xmlทำให้สามารถใช้งานได้ปรกติแล้ว ซึ่งในกระบวนการ post และ ppdate post นั้น ได้แก้ไข post ให้แล้ว เพียงแต่ว่ามันไปทำต่อที่ google-sitemap-plugin ไม่สำเร็จจึงแสดงเป็น error ออกมา
ขอบคุณเพื่อน ๆ ที่ช่วยกันแก้ไขเรื่องนี้ด้วยกันด้วยครับ
-
การตั้งค่า MaxRequestWorkers บน Apache ให้เหมาะสมกับจำนวนผู้ใช้
ปัญหาของ PSU Webmail ในช่วง 9-15 สิงหาคม 2559 ที่ผ่านมา คือ เมื่อเริ่มเข้าสู่เวลาราชการ ในวันทำการ พบว่า มีการตอบสนองที่ช้า บางครั้งต้องรอถึง 15-20 วินาที หรือ ผู้ใช้บางท่านแจ้งว่า Timeout ไปเลย หรือไม่ก็ใช้งานไปสักพัก ถูกดีดกลับมาหน้า Login ใหม่
แต่เมื่อพ้นเวลาราชการ พบว่าการตอบสนองก็เร็วขึ้นดังเดิม รวมถึงในช่วงวันหยุดก็เร็วอย่างที่ควรเป็น
ขอบคุณทาง NetAdmin ที่ทำระบบตรวจสอบไว้ที่หน้า Data Center เพื่อตรวจจับความเร็วในการตอบสนองบริการ PSU Webmail ด้วย SmokePing ผลที่ได้เป็นดังภาพ
จะเห็นว่า มีความหน่วงในการตอบสนอง เฉพาะในวันเวลาราชการเท่านั้น … ทำไม ???
ทำการตรวจสอบด้วยคำสั่ง
ps aux |grep apache| wc -l
เพื่อดูว่า มีจำนวน Apache อยู่กี่ Process พบว่า ในช่วงเวลาที่ระบบหน่วง มี Process เกือบคงที่ที่ 150 แต่ในช่วงที่ระบบทำงานได้เร็ว มีจำนวนประมาณ 50 process
จากการศึกษา พบว่า Apache2 ที่ใช้ MPM Prefork นั้น จะจำกัดค่า MaxRequestWorkers ไว้ โดยหากไม่กำหนดค่าใดๆจะตั้งไว้ที่ 256 แต่เมื่อตรวจสอบในไฟล์
/etc/apache2/mods-enabled/mpm_prefork.conf
พบว่า
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>ทำให้เพดานของจำนวน Process ไปจำกัดที่ 150 ดังที่ตรวจสอบเบื้องต้น เมื่อมีผู้ใช้มากขึ้นกว่าเดิม จึงทำให้ Process ไม่เพียงพอต่อความต้องการ เป็นผลให้เกิดการหน่วงขึ้น
จึงทำการแก้ไข MaxRequestWorkers เป็น 256 แล้ว Restart Apache
ผลทำให้ จำนวน Apache Process ขึ้นไปถึง 200 Process และการตอบสนองเร็วขึ้นตามที่ควรเป็นดังภาพ (หลังเวลา 14:45)
ทั้งนี้ การกำหนดจำนวน MaxRequestWorkers นั้น ต้องสัมพันธ์กับ RAM ของ Server ด้วย โดยมีสูตรคร่าวๆ คือ จำนวน RAM ในหน่วย MB หารด้วยขนาดของ Apache Process โดยเฉลี่ย
เช่น
มี RAM 4GB = 4 x 1024 = 4096
ขนาดเฉลี่ย Apache Process = 20
ดังนั้น MaxRequestWorkers = 4096/20 = 204
แต่จริงๆแล้ว ควรเผื่อ Memory ไว้ให้ OS และอื่นๆด้วย (อาจจะไม่เต็ม 4096) หากขยับค่า MaxRequestWorkers แล้วยังพบว่า จำนวน Process ยังขึ้นไปเต็มเพดานอยู่ ควรพิจารณาเพิ่ม Memory ด้วย
ประมาณนี้ครับ
UPDATE:
ผลการปรับแก้ไข ทำให้ เวลาในการตอบสนอง จากที่หน่วง 10 วินาที เหลือ เพียง 50 มิลลิวินาที ดังภาพ
-
การเชื่อมต่อ Thunderbird กับ Google Mail (ทั้ง Gmail และ Google Apps)
ในอดีต Thunderbird และ Mail Client อื่นๆสามารถติดต่อกับ Google Mail ได้โดยตั้งค่า Mail Server ให้ถูกต้อง และ username/password ก็สามารถใช้งานได้ แต่ในปัจจุบัน Google หันไปใช้ระบบ OAuth 2.0 ซึ่งการ Authentication หรือการใส่ username/password ต้องทำที่ Google เท่านั้น รวมถึงการทำ 2-Step Verification ด้วย (การใส่ One-Time Password นอกเหนือจาก username/password เป็นต้น) ทำให้ Thunderbird และ Mail Client ที่ยังไม่รองรับ OAuth 2.0 ไม่สามารถใช้งานได้
แต่ทาง Google Mail ยังเปิดให้สามารถใช้งานได้ โดยแบ่งเป็น 2 กรณีคือ ใช้หรือไม่ใช้ 2-Step Verification โดยตรวจสอบได้จาก
0. วิธีตรวจสอบว่าใช้งาน 2-Step Verification หรือไม่ โดยการไปที่ https://myaccount.google.com/security
หากไม่เปิดใช้ 2-Step Verification จะได้หน้าตาอย่างนี้
หากเปิดใช้ 2-Step Verification จะได้หน้าตาอย่างนี้
1. ผู้ใช้ที่ไม่ได้เปิดใช้งาน 2-Step Verification ให้ไปที่ https://myaccount.google.com/security#connectedapps
ภายใต้หัวข้อ Allow less secure apps ให้เปิดใช้งาน ดังภาพ
2. ผู้ใช้ที่เปิดใช้งาน 2-Step Verification ให้ไปที่ https://security.google.com/settings/security/apppasswords
แล้วเลือก Mail และ Windows Computer แล้วคลิก Generate ดังภาพ
จะได้ Password ที่ใช้ครั้งเดียวทิ้ง (ไม่ต้องไปจำ) ดังภาพ
หากวันหลังต้องการเลิกใช้ ก็กดปุ่ม Revoke ภายหลังได้จากนั้น เปิดให้ Google Account ใช้งาน IMAP ได้ โดยไปที่ https://mail.google.com/mail/u/0/#settings/fwdandpop
แล้วคลิก Enable IMAP ดังภาพ
แล้วคลิก Save Change ด้านล่างสุดท้าย ที่ Thunderbird ให้ตั้งค่า
Password: สำหรับคนที่ไม่ใช้ 2-Step Verification ให้ใส่ Password ของ Google Account เดิมลงไป ส่วนคนที่ใช้ 2-Step Verification ให้เอา Password ที่ได้มาใหม่ใส่ลงไปแทน
Incoming IMAP เป็น imap.gmail.com และ SSL เป็น SSL/TLS
Outgoing SMTP เป็น smtp.gmail.com และ SSL เป็น SSL/TLS
อย่าลืม ใส่ username ให้มี @gmail.com หรือ @psu.ac.th ในกรณีใช้ PSU GAFE ด้วย
แล้วคลิกปุ่ม Done ดังภาพเท่านี้ก็สามารถใช้งาน Google Mail จาก Thunderbird ได้แล้ว
-
เทคนิคการวัดความเร็วในการตอบอีเมลลูกค้า
ถ้ามี KPI ที่ต้องทำให้สำเร็จคือ “ร้อยละของปัญหาที่ตอบกลับลูกค้าภายใน 2 วันทำการ”
แล้ว … ช่องทางที่รับปัญหาจากลูกค้าคือ ทางอีเมล (ในที่นี้เป็นบริการอีเมลบนระบบของ Google Mail หรือ Gmail)
โดยการตอบกลับ คือ การ Reply กลับไปหาลูกค้า
เวลาที่นับคือ นับตั้งแต่เวลาที่อีเมลเข้ามาถึง จนกระทั่งมีการตอบกลับไปหาลูกค้าทางอีเมลฉบับแรกสำหรับคนที่ใช้ Google Mail หรือ Gmail อยู่ สามารถใช้ Google Sheets ทำรายงานได้ ตามขั้นตอนต่อไปนี้
1. ไปที่ drive.google.com (ให้ Login ด้วย Account ที่ต้องการด้วย)
2. สร้าง Google Sheets แล้วตั้งชื่อตามต้องการ เช่น Report
3. ไปที่เมนู Tools > Script Editor
4. ตั้งชื่อ Project ว่า report แล้ววางโค๊ดต่อไปนี้ลงไปfunction reportResponseTime() {
// ถ้าจะทำรายงานทั้ง Inbox ให้ uncomment บรรทัดต่อไปแทน
//var threads = GmailApp.getInboxThreads();// ถ้าจะทำรายงานเฉพาะ Lable ที่เตรียมไว้ ในที่นี้ใช้ Label “support-psuemail”
var threads = GmailApp.search(‘label:support-psuemail ‘);for (var i = 0; i < threads.length; i++) { // วนลูปแต่ละ Thread
if (threads[i].getMessageCount() > 1) { // สนใจเฉพาะ Thread ที่มีการตอบกลับเท่านั้น
var messages = threads[i].getMessages(); // Subject ของอีเมล
var d1= messages[0].getDate().getTime(); // เวลาที่อีเมลเข้ามา
var d2= messages[1].getDate().getTime(); // เวลาที่ตอบกลับฉบับแรก
var diff = (d2-d1)/(1000*60*60); // ระยะเวลาหน่วยเป็น ชั่วโมง// เขียนต่อท้าย Sheet ที่กำลังใช้งาน
SpreadsheetApp.getActiveSheet().appendRow([messages[0].getSubject(), messages[0].getDate(), messages[1].getDate(), diff])
}
}
}5. คลิก Run > reportResponseTime
(หากมีหน้าจอ Consense ต่างๆขึ้นมาให้ Allow ไป)
6. ผลจะปรากฏใน Sheet ที่เปิดไว้
7. จากนั้นสามารถเอาผลไปคำนวนต่อ เช่น ร้อยละของอีเมลที่ตอบสนองภายใน 48 ชั่วโมงหรือ 2 วัน เป็นต้น และสามารถตอบคำถามได้ว่า ทำไมบางฉบับใช้เวลาเกิน 48 ชั่วโมง (อาจจะเป็นเพราะติดเสาร์อาทิตย์เป็นต้น)*** กรุณาอ้างอิงด้วยนะครับ หากนำไปเผยแพร่ต่อ ***
-
Bash Bash Bash เต็มไปหมด…
ไมโครซอฟท์ปล่อยอัพเดต Windows 10 Anniversary Update แล้ว ถึงเวลาลอง bash shell บนวินโดวส์แล้วสิ…
- ติดตั้ง Windows 10 Anniversary ทำได้สองทาง
- หากใช้ Windows 10 อยู่แล้วก็ Windows update ได้เลย (รุ่น Professional อาจยังไม่มีให้ update)
- ต้องการติดตั้ง Windows 10 ใหม่ โหลดที่ https://licensing.psu.ac.th/tag/anniversary/ เลือกเอาเลยจะเอารุ่น Professional หรือ Education (สำหรับนักศึกษาต้องเป็นรุ่น Education)
- ติดตั้งไปจนเสร็จเรียบร้อย
- ต้องเชื่อมต่อ Internet ตลอดเวลาที่ติดตั้ง!!
- คลิกขวาที่ปุ่ม start เลือก Programs and Features
- คลิก Turn Windows Features on or off
- เลือก Windows Subsystem for Linux (Beta)
- เมื่อติดตั้งเสร็จแล้ว ให้เปิด developer mode คลิกที่ start menu แล้วพิมพ์ deve จะได้ดังรูป แล้วเลือก for developers settings
- ได้ดังภาพเลือก Developer mode
คลิก Yes
- อาจมีข้อความเตือนให้ restart ก็ restart ให้เรียบร้อย
- คลิกขวาที่ปุ่ม Start เลือก Command Prompt (Admin)
- พิมพ์ bash
- กด y แล้วกด enter
- จะเป็นการเริ่ม download รอจนครบ 100%
- ตั้ง username และ password
- เมื่อตั้งเสร็จเรียบร้อยก็พร้อมใช้งาน
- ทุกครั้งที่ต้องการใช้งานให้เรียก bash ได้ที่ปุ่ม start แล้วเลือก Bash on Ubuntu on Windows
- ทดสอบ ssh
- จบ… ขอให้สนุกครับ
- ติดตั้ง Windows 10 Anniversary ทำได้สองทาง
-
วิธีตรวจสอบเว็บไซต์ที่โดน Hack #18
ได้รับแจ้งจาก ThaiCERT ว่ามีเว็บไซต์ภายในโดเมนของมหาวิทยาลัย เผยแพร่ Code อันตราย ดังต่อไปนี้
จึงเข้าทำการตรวจสอบในเครื่องเว็บเซิร์ฟเวอร์ดังกล่าว พบการวางไฟล์ Backdoor ไว้ดังที่อธิบายใน วิธีตรวจสอบเว็บไซต์ที่โดน Hack #17 แล้วแต่ที่เห็นผิดปรกติ ก็เป็นใน access.log ของ Apache ซึ่งพบว่า มีการเรียกใช้ xmlrpc.php เป็นจำนวนมาก ดังภาพ
จากการตรวจสอบ พบว่า xmlrpc.php เป็นช่องทางให้สามารถเรียกใช้ Function ต่างๆผ่านทาง HTTP และเป็นช่องทางให้ App ต่างๆสามารถติดต่อกับ WordPress ได้ แต่ก็เป็นช่องทางให้เกิดการเดารหัสผ่านจำนวนมากได้เช่นกัน (Brute Force Attack) โดยสามารถทดลอง ส่ง XML ที่มีโครงสร้าตามที่ API กำหนด เช่น wp.getUsersBlogs [1][2][3] สามารถดูจำนวน Blog ที่ User คนนั้นๆเขียนขึ้นมา แต่ ต้องระบุ username/password ซึ่งตรงนี้จะเป็นส่วนที่ทำให้เกิดการ Brute Force ได้ ด้วยคำสั่งต่อไปนี้ เป็นการเดารหัสผ่านไปยัง http://localhost/blog/xmlrpc.php
echo "<methodCall><methodName>wp.getUsersBlogs</methodName><params><param><value> <string>admin</string></value></param> <param><value><string>password</string></value></param></params></methodCall>" | POST http://localhost/blog/xmlrpc.php
หากสำเร็จ จะได้คำตอบมาอย่างนี้
หากเป็น WordPress รุ่นต่ำกว่า 4.0 เปิดให้ใช้ system.multicall ซึ่งทำให้สามารถเดารหัสผ่านจำนวนมาก ใน 1 Request ทำให้ระบบตรวจจับได้ยาก ดังนั้น หากไม่จำเป็นต้องใช้ xmlrpc.php ก็สมควรปิดการใช้งานที่ระดับ Apache โดยสร้างไฟล์ /etc/apache2/conf-enabled/xmlrpc.conf มีข้อมูลเป็น
<FileMatch "xmlrpc\.php$">
Order Deny,Allow
Deny from All
</FileMatch>
จากนั้น Restart Apache ก็สามารถปิดการทำงานได้
Reference
[1] http://www.hackingsec.in/2014/08/wordpress-xml-rpc-brute-force-attack.html#
[2] http://blog.dewhurstsecurity.com/2012/12/11/introduction-to-the-wordpress-xml-rpc-api.html
[3] https://codex.wordpress.org/XML-RPC_WordPress_API -
การ upgrade PHP to new version on IIS ด้วยวิธีง่ายๆ
เคยเขียนบทความเกี่ยวกับการ upgrade PHP 5.2 to 5.3 ไปเมื่อปีที่แล้ว (Apache 2.2 + PHP 5.2 + phpMyAdmin on Windows 8.1)
วันนี้ขอนำเสนอการ upgrade เวอร์ชั่นของ PHP บน IIS (Windows Server 2012 R2) ด้วยวิธีที่แสนจะง่ายดาย
***ใครทราบวิธีการแล้วก็ผ่านไปเลยนะคับ ^^ เขียนไว้เผื่อบางท่านที่ยังไม่รู้เนอะ
ขั้นตอนการ upgrade
- check PHP เวอร์ชั่นที่เราใช้ปัจจุบันก่อนว่าเป็นเวอร์ชั่นอะไร ด้วยการสร้างไฟล์ phpinfo.php เก็บไว้ที่ web root แล้วเขียนโค้ดตามนี้
<?php
phpinfo();
?>2. เปิดเว็บ http://localhost/phpinfo.php ในภาพจะเป็น php 5.6.2.2
3. เปิด IIS manager ขึ้นมา แล้วคลิกที่ Web Platform Installer
4. พิมพ์คำค้น PHP ในช่องค้นหา ในรูปเราจะติดตั้ง PHP 7.0.7 ให้คลิกที่ปุ่ม Add จากนั้นระบบจะทำการติดตั้ง PHP 7.0.7
5. เมื่อติดตั้งเสร็จแล้ว ให้คลิก Restart IIS
6. ตรวจสอบเวอร์ชั่นของ PHP ด้วยการเปิดหน้าเว็บ http://localhost/phpinfo.php ในภาพจะเป็น php 7.0.7 เรียบร้อยแล้ว
7. เสร็จสิ้นกระบวนการ upgrade PHP to new version
-
วิธีตรวจสอบเว็บไซต์ที่โดน Hack #17
ปัจจุบันพบว่า รูปแบบของ Backdoor เปลี่ยนไป จากเดิมเป็น Base64 ซึ่งสามารถตรวจจับได้จาก Pattern ของ eval และ base64_decode ไปเป็น การใช้ eval ร่วมกับการใช้เทคนิคที่เรียกว่า Obfuscate หรือ การทำให้ PHP Code ปรกติ แปลงไปเป็นรูปแบบที่ซับซ้อนยิ่งขึ้น ทำให้การตรวจสอบด้วยเทคนิคเดิมไม่เจอ
จาก วิธีตรวจสอบเว็บไซต์ที่โดน Hack #2 แสดงให้เห็นรูปแบบเดิม ดังภาพ
จะเปลี่ยนมาเป็นแบบนี้
ดังนั้น อาจจะต้องปรับเปลี่ยนคำสั่งในการค้นหาเป็น
find /var/www -name "*.php" -user www-data -type f | xargs grep GLOBAL
แต่ก็พบว่า มีการซ่อน base64_decode ในรูปแบบนี้ก็มี
ถึงแม้จะเลี่ยงการใช้ base64_decode ตรงๆแต่ก็ยังต้องใช้ eval อยู่ดี ดังนั้น จึงต้องใช้คำสั่งต่อไปนี้ในการค้นหา
find /var/www -name "*.php" -user www-data -type f | xargs grep eval > eval.txt
ซึ่งอาจจะได้ไฟล์มาจำนวนมาก ทั้งทีใช่และไม่ใช่ Backdoor เก็บไว้ในไฟล์ eval.txt ดังภาพ
จึงต้องใช้วิธี แก้ไขไฟล์ eval.txt ดังกล่าว โดยลบบรรทัดที่ไม่ใช่ Backdoor ออก ให้เหลือแต่บรรทัดที่น่าสงสัยว่าจะเป็น Backdoor ไว้ แล้ว Save จากนั้นใช้คำสั่งต่อไปนี้เพื่อเก็บไฟล์ทั้งหมดไว้ก่อน ในไฟล์ suspect.tar.gz
cut -d: -f1 eval.txt | xargs tar -zcvf suspect.tar.gz
จากนั้น ทำ List ของไฟล์ที่ต้องเข้าตรวจสอบจริงๆ เก็บในไฟล์ชื่อ eval2.txt ด้วยคำสั่ง
cut -d: -f1 eval.txt > eval2.txt
แล้วจึงแก้ไขไฟล์ หรือ ลบทิ้งต่อไป