Friday, September 30, 2011

cPanel Newbie Guide – cPanel Server Only

เป็นข้อมูลที่เก็บตกมาจาก RackShack Forums
บทความนี้จะเขียนเป็นบันทึกหลังจากการออก Server จาก ev1servers.net ครับ
หลังจากที่ได้ Server มาแล้ว สิ่งแรกที่ควรทำคือ
Request IP Address เพราะ RS จะมี IP ให้เครื่องละ 1 IP เป็นพื้นฐาน และแถมฟรีอีก 7 IPs ซึ่งควรรีบขอมาทันที เพื่อทำ NameServer
หลังจากที่ได้ IP มาแล้ว ก็จัดการชี้ NameServer มาที่เครื่องเราได้เลย
Login – WHM

  • Secure SSL https://sitename.com:2087

  • Regular http://sitename.com:2086 and http://yourdomain.com/whm Login – Cpanel

  • Secure SSL https://sitename.com:2083

  • Regular http://sitename.com:2082 and http://yourdomain.com/cpanel Login – Webmail

  • Secure SSL https://domain.com:2096

  • Regular http://domain.com:2095 and http://yourdomain.com/webmail เราสามารถแก้ไข บังคับให้ User เรียก /whm, /cpanel, /webmail แล้ววิ่งเข้าทาง Secure port ได้เลย โดยตั้งใน WHM
    First off is updates with Cpanel:
    ไม่ควรใช้งาน cPanel แบบ Edge ถ้ายังไม่เซียน ค่าเริ่มต้นของ cPanel ที่มาจาก RS จะเป็น Release จะใช้ไปเลยก็ได้ หรือจะ Update ไปใช้ Stable จะดีที่สุด
    ทั้งนี้ หลังจากได้มา ควร Setup NameServer หรือค่าต่างๆ ให้เรียบร้อยก่อน โดยทำได้ที่
    Server Setup/Change Update Preferences:
    และเลือกใช้งาน cPanel ได้ที่
    Cpanel/WHM Updates: Manual Updates Only (STABLE tree)
    แนะนำให้เลือกเป็น Manual Update เพราะเราจะได้เห็นทุกอย่างที่เกิดขึ้นตอน Update ถ้ามี Error หรืออื่นๆ เกิดขึ้น จะได้แก้ไขได้ทันการ
    สามารถดู Last Update ได้ที่ http://layer2.cpanel.net/
    หลังจาก Setup Server เสร็จแล้ว ควร Update cPanel ทันที เพราะจะมี Software หลายๆ ตัวที่ถูก Update ด้วย จะช่วยแก้ปัญหาเรื่อง Security ได้พอสมควร
    Cpanel and the kernel – use up2date
    cPanel สามารถ Update Software ต่างๆ ให้เราได้ แต่จะไม่ Update Kernel ให้เรา เราต้องจัดการ Up Kernel เอง
    มีคำเตือนจากคนที่เคยพบปัญหาว่า อย่า Upgrade Perl ด้วย cPanel เพราะจะทำให้ cPanel มีปัญหาได้
    กรุณาตรวจสอบข้อมูลการใช้งาน Up2date ที่ RS Forums
    ต้องทำ rhn_register ก่อน up2date จึงจะสามารถใช้งานได้
    สามารถ register กับ Red Hat Network ได้ฟรี สั่ง rhn_register ได้ที่ /usr/sbin/rhn_register แล้วจึงทำ up2date
    Tweak Settings:
    จัดการเปิด/ปิดบริการหลายๆ จุดได้ที่นี่
    อะไรที่ควรเปิดบ้าง

  • Webalizer Stats

  • Awstats Stats (Very nice stats program – recommended. (แต่เราไม่ได้ใช้)

  • Spamassassin

  • Disk Space Usage Warnings

  • The number of times users are allowed to check their mail using pop3 per hour: (60)

  • The maximum each domain can send out per hour (0 is unlimited): (250) – This is SMTP only!

  • Email users when they have reached 80% of their bandwidth <="" b="">
    <="" b="">

  • <="" b=""> ควรเปิด phpSUEXEC เพื่อไม่ให้มีการ Run Scripts ที่เป็น nobody จะสามารถช่วยเรื่อง Security ได้พอสมควรทีเดียว สามารถเปิดได้ในเมนู Enable/Disable SuExec แล้ว Recompile Apache อีกครั้ง

  • <="" b="">
  • ปิด formmail ใน Tweak Settings ด้วย เพราะเป็นจุดที่ถูก Spam บ่อยสุด แล้วยังใช้วิธี chmod 000 ผ่าน ssh ก็ได้

  • Keep log files at the end of the month ค่าตั้งต้นจะเป็น Off ให้ On Backups
    กรณีที่มี HD สองตัว ควรสั่ง Backup ด้วย โดยทำการ Format & mount HD ตัวที่สอง ให้ใช้ชื่อ partition ว่า Backup แล้วจึง Set Backup อีกที
    ตั้งค่าตามนี้ได้เลย

  • Backup Status: Enabled

  • Backup Interval (Note: Selecting Daily Backup with give you monthly and weekly as well, Selecting Weekly backup will give you monthly as well.) Daily or weekly – up to you

  • Days to run backup (explanitory)

  • Remount/Unmount backup drive (requires a seperate drive/coda/nfs mount) – Disabled

  • Bail out if the backup drive cannot be mounted (recommended if you have selected the above option) – Enabled

  • Incremental backup (only backup what has changed. (**No Compression**) – Disabled

  • Backup Accounts – Enabled

  • Backup Config Files (not needed to restore specific accounts) – Enabled

  • Sql Databases (at least per accounts is needed to use the restore feature) – Per account

  • Backup Raw Access Logs – Enabled

  • Backup Destination (this should be a dir/nfs/coda mount with at least twice the space of all your /home* partitions. Setting this to /home is a VERY BAD IDEA.): – /backup
    (Note: you need a second hard drive and should have it set to /backup in your fstab file)[/list] Service Status
    บอกสถานะของระบบและ Service ต่างๆ ลูกค้าสามารถมองเห็นได้ ผ่าน cPanel
    Green = Good | Yellow = Warning | Red = Trouble
    Firewall
    ผมใช้ APF อยู่ กรุณาอ่านเรื่องวิธีการติดตั้ง APF Firewall ในบทต่อไป
    Logs
    ควรตรวจสอบ log files ต่างๆ เป็นประจำ ถึงแม้จะใช้ logwatch ทำหน้าที่ตรวจสอบ/ส่งเมล์ให้ผู้ดูแลระบบทุกวันก็ตาม สามารถตรวจสอบ logs ได้ตามนี้ครับ

  • Exim: – /var/log/exim_mainlog -/var/log/maillog -/var/log/exim_paniclog

  • Apache: -Error Log: /usr/local/apache/logs/error_log (404 not found errors, etc)

  • Access Log: /usr/local/apache/logs/access_log

  • Site Logs: /usr/local/apache/domlogs/sitename.com

  • Logins: /var/log/secure /var/log/logins_log

  • Messages: /var/log/messages

  • Cpanel: /usr/local/cpanel/logs/access_log นอกจากนี้ก็จะมี logs ของแต่ละ Users ด้วย อยู่ใน home ของเค้าเอง
    Cpanel Manual Backup & Update
    กรณีที่ไม่สามารถทำ Backup หรือ Update ผ่าน WHM ได้ จะมี Scripts คำสั่งอยู่ที่ /scripts
    โดยใช้คำสั่ง
    $ /scripts/cpbackup
    $ /scripts/upcp

    Apache Config Test in SSH สั่งทดสอบ Apache
    /usr/local/apache/bin/apachectl configtest
    ไฟล์ httpd.conf ของ Apache อยู่ที่
    /usr/local/apache/conf/httpd.conf
    Manual Stop – Start of services in SSH: (start | stop | restart)

  • service httpd

  • service exim

  • service proftpd

  • service named

  • service mysql

  • /etc/rc.d/init.d/cpanel

  • /etc/init.d/apf

  • /etc/init.d/xinetd

  • /etc/xinetd.d/sshd[/list]

  • การลงโปรแกรม หรือ ติดตั้ง Webmin

    เมื่อเราได้ VPS มาแล้ว ถ้าผู้ให้บริการยังไม่มี Control Panel อะไรให้เราเลย ขั้นตอนต่อไปก็คือการลงโปรแกรมต่างๆรวมทั้ง Control Panel ครับ ซึ่งก่อนที่จะลงโปรแกรมได้นั้น เราต้องเข้า SSH (Secure Shell) ของ VPS ให้ได้ก่อนครับ เนื่องจากเมื่อเราเข้า SSH เรียบร้อยแล้ว คุณจะสามารถจัดการ VPS ของคุณได้ทุกอย่างจากตรงนั้นเลย
    สำหรับ Webmin นั้น ถือว่าเป็น Control Panel ที่ตัวเล็ก ลงง่าย ไม่กระทบกับระบบอื่นๆ ถ้าไม่พอใจก็สามารถเอาออกได้โดยเว็บเรายังคงทำงานต่อได้เหมือนเดิม ดังนั้น ณ เวลานี้ ผมจึงแนะนำให้ใช้ Webmin เป็น Control Panel สำหรับ VPS ของคุณ จะเหมาะสมที่สุดครับ สำหรับขั้นตอนต่อไปนี้ จะเป็นขั้นตอนสำหรับ VPS ที่ใช้ CentOS เท่านั้นนะครับ ซึ่งผมเคยบอกไว้แล้วว่าเป็น OS ที่เหมาะสำหรับ VPS ที่สุดครับ
    ดาวน์โหลดโปรแกรม Putty
    กรณีที่คุณใช้ Windows คุณควรจะไปหาโหลดโปรแกรม Putty มาครับ เนื่องจากเป็นโปรแกรมที่ใช้เข้า SSH ไปยัง Server ได้ง่ายที่สุดโดยที่ไม่ต้องติดตั้งโปรแกรม คลิกที่นี่เพื่อดาวน์โหลดได้เลย
    เริ่มโปรแกรม Putty
    เมื่อโหลดมาแล้ว ให้ดับเบิ้ลคลิกที่ไฟล์ putty.exe เพื่อเริ่มโปรแกรม คุณจะพบกับหน้าจอดังนี้ครับ
    หน้าจอโปรแกรม Putty
    ในช่อง Host Name (or IP Address) ให้กรอกหมายเลข IP ของเครื่อง VPS ของคุณลงไป แล้วกดปุ่ม Enter บนคีย์บอร์ด รอสักครู่ ถ้าคุณกรอกถูกต้อง จะปรากฎหน้าจอดังนี้ครับ
    หน้าจอล็อกอิน
    หน้าจอนี้ เป็นหน้าจอสำหรับล็อกอินเข้าระบบครับ ให้กรอกชื่อผู้ใช้ของคุณ ซึ่งปกติจะเป็น root แล้วก็กดปุ่ม Enter บนคีย์บอร์ดครับ
    ใส่รหัสผ่าน
    เมื่อใส่ชื่อผู้ใช้แล้ว มันก็จะถามรหัสผ่านต่อ ให้พิมพ์รหัสผ่านแล้วก็กดปุ่ม Enter บนคีย์บอร์ดอีกครั้ง ถ้าพิมพ์ถูกจะขึ้นพรอมพ์ดังรูปครับ
    เข้าระบบเรียบร้อย
    ข้อความที่เห็นอาจจะไม่เหมือนกันนะครับ เนื่องจากขึ้นอยู่กับชื่อเครื่อง เวลา และที่อยู่ที่เราใช้คอมพิวเตอร์ แต่โดยรวมคือ จะมีเครื่องหมาย # ตามด้วยเคอร์เซอร์ คล้ายกับหน้าจอที่เราเห็นในหนังเก่าๆเวลาที่เขาเจาะระบบกันน่ะครับ
    ณ ที่นี่ คุณสามารถจัดการ VPS ของคุณได้ทุกอย่าง จะลงโปรแกรมอะไรก็ทำได้ผ่านตรงนี้ครับ แต่เนื่องจากว่ามันใช้งานยาก ดังนั้นเราจึงควรจะลง Control Panel ดีกว่าที่จะมาจัดการ VPS ผ่านตรงนี้ครับ
    เริ่มติดตั้ง Webmin
    เมื่อเข้า SSH ได้แล้ว เราจะมาติดตั้ง Webmin กันครับ ให้คุณ copy ข้อความสีเขียวด้านล่างนี้เอาไว้ให้ครบนะครับ
    # กำหนด name server ไปยัง opendns
    echo "nameserver 208.67.222.222" > /etc/resolv.conf
    echo "nameserver 208.67.220.220" >> /etc/resolv.conf

    # ปิด selinux
    setenforce 0
    sed 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config > /etc/selinux/config-new
    /bin/cp -f /etc/selinux/config-new /etc/selinux/config

    # สร้างไฟล์ webmin.repo สำหรับ install webmin
    echo "[Webmin]" > /etc/yum.repos.d/webmin.repo
    echo "name=Webmin Distribution Neutral" >> /etc/yum.repos.d/webmin.repo
    echo "baseurl=http://download.webmin.com/download/yum" >> /etc/yum.repos.d/webmin.repo
    echo "enabled=1" >> /etc/yum.repos.d/webmin.repo

    # import key สำหรับ webmin
    rpm --import http://www.webmin.com/jcameron-key.asc

    # install โปรแกรมต่างๆ รวมทั้ง webmin
    yum -y install bind ntp httpd mysql mysql-devel mysql-server iptables sendmail php php-bcmath php-cli php-common php-devel php-gd php-imap php-mbstring php-mcrypt php-mhash php-mysql php-odbc php-pdo php-pear php-snmp php-soap php-tidy php-xml php-xmlrpc webmin perl-libwww-perl perl-Net-SSLeay libxml2 libxml2-devel perl

    เมื่อ copy เสร็จแล้ว ก็ให้สลับไปที่หน้าโปรแกรม Putty แล้วคลิกขวาเพื่อ Paste ข้อความลงไปเลยครับ แล้วก็กด Enter ที่คีย์บอร์ดอีกหนึ่งครั้ง VPS ของคุณจะทำงานอยู่สักพัก ระหว่างนี้มันจะเช็คเวอร์ชั่นของโปรแกรมทั้งหลายที่จะลง แล้วก็ทำการดาวน์โหลดมาลง ดังนั้นอาจจะนานนิดนึง รอจนมันทำงานเสร็จ มันจะขึ้นพรอมท์ที่มีเครื่องหมาย # อีกครั้ง ดังรูปครับ
    ลงเสร็จแล้ว
    ถ้าเห็นข้อความว่า Complete! ก็แสดงว่าลงสำเร็จครับ
    หมายเหตุ ถ้าเห็นข้อความอย่างอื่น เช่น Error Downloading Packages ก็แสดงว่าไม่สำเร็จ ให้ลงโปรแกรมใหม่โดย Copy ข้อความแล้วมา Paste ลงไปอีกครั้งครับ (อย่าลืมกด Enter ทิ้งท้ายนะครับ เดี๋ยวมันไม่ทำงาน)
    ตั้งค่าโปรแกรมต่างๆให้เรียบร้อย
    เนื่องจากโปรแกรมต่างๆ เราต้องจัดการให้มันทำงานอัตโนมัติทุกครั้งที่มีการ restart เครื่อง ดังนั้นเราจึงต้อง copy ข้อความสีเขียวด้านล่าง (อีกแล้ว)
    # ตั้งเวลาเครื่องให้ถูกต้อง
    ntpdate time.nist.gov

    # ปิด service ที่ไม่จำเป็น
    service iptables stop
    service ip6tables stop
    service bluetooth stop
    chkconfig iptables off
    chkconfig ip6tables off
    chkconfig bluetooth off

    # เปิด service ที่จำเป็น
    service mysqld restart
    service httpd restart
    service named restart
    service ntpd restart
    service sendmail restart
    chkconfig mysqld on
    chkconfig httpd on
    chkconfig named on
    chkconfig ntpd on
    chkconfig sendmail on

    เสร็จแล้วก็สลับหน้าจอมาที่ Putty แล้วก็คลิกขวา เพื่อวางคำสั่งเหล่านี้ แล้วกดปุ่ม Enter บนคีย์บอร์ดอีกที รอแป๊บเดียวก็จะขึ้นพรอมต์ดังรูป
    ตั้งค่าเรียบร้อย
    เท่านี้ก็เสร็จสิ้นการตั้งค่าโปรแกรมต่างๆแล้วครับ
    ลองเข้า Webmin
    เมื่อทุกอย่างพร้อม ก็ให้เปิด Browser เช่น Internet Explorer หรือ Firefox ของคุณขึ้นมา แล้วพิมพ์ address ว่า https://หมายเลข IP ของเครื่องคุณ:10000 แล้วก็กด Enter ครับ เช่นเครื่องคุณมี IP เป็น 192.168.1.102 ก็ให้เข้าไปที่ https://192.168.1.102:10000
    ถ้าพบว่า Browser มีการเตือนเรื่อง Certificate ดังรูป ก็ให้เลือก Continue to this website นะครับ
    หน้าจอเตือน Certificate
    เมื่อกดข้ามเรื่องการเช็ค Certificate แล้ว จะพบกับหน้าจอโปรแกรม Webmin ดังรูปครับ
    หน้าจอโปรแกรม Webmin
    เรียบร้อยแล้ว
    ถ้าเห็นอย่างนี้ก็ดีใจด้วยครับ เพราะคุณได้ผ่านขั้นตอนที่น่ากลัวสำหรับคนทั่วๆไปได้แล้ว นั่นคือการลง Control Panel หลังจากนี้ก็ไม่มีอะไรยากแล้วครับ เนื่องจากสามารถทำผ่านหน้าเว็บได้หมด ซึ่งผมจะมาแนะนำในตอนต่อๆไปครับ

    ใช้ได้เลยไม่ต้องคอนฟิกไรสักอย่างอ่ะคับ

    ลง แล้วมันเป็นแบบนี้ครับทำไงดี ใช้ Centos 5.2 ครับ ลังเล
    [root@localhost tmp]# rpm -ivh webmin-1.480-1.noarch.rpm
    warning: webmin-1.480-1.noarch.rpm: Header V3 DSA signature: NOKEY, key ID 11f63c51
    Preparing...                ########################################### [100%]
    Operating system is CentOS Linux
    Port 10000 is already in use
    error: %pre(webmin-1.480-1.noarch) scriptlet failed, exit status 2
    error:   install: %pre scriptlet failed (2), skipping webmin-1.480-1


    Step by Step Install Webmin CentOS-5.3 using yum localinstall

    [root@centos53 ~]# wget http://prdownloads.sourceforge.net/webadmin/webmin-1.480-1.noarch.rpm

    --09:27:38--  http://prdownloads.sourceforge.net/webadmin/webmin-1.480-1.noarch.rpm
    Resolving prdownloads.sourceforge.net... 216.34.181.59
    Connecting to prdownloads.sourceforge.net|216.34.181.59|:80... connected.
    HTTP request sent, awaiting response... 302 Found
    Location: http://biznetnetworks.dl.sourceforge.net/project/webadmin/webmin/1.480/webmin-1.480-1.noarch.rpm [following]
    --09:27:39--  http://biznetnetworks.dl.sourceforge.net/project/webadmin/webmin/1.480/webmin-1.480-1.noarch.rpm
    Resolving biznetnetworks.dl.sourceforge.net... 203.142.84.220
    Connecting to biznetnetworks.dl.sourceforge.net|203.142.84.220|:80... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 15544781 (15M) [application/octet-stream]
    Saving to: `webmin-1.480-1.noarch.rpm'

    100%[=======================================>] 15,544,781   346K/s   in 49s

    09:28:29 (308 KB/s) - `webmin-1.480-1.noarch.rpm.1' saved [15544781/15544781]

    [root@centos53 ~]#
    [root@centos53 ~]# rpm --import http://www.webmin.com/jcameron-key.asc
    [root@centos53 ~]# yum -y localinstall webmin-1.480-1.noarch.rpm
    Loaded plugins: fastestmirror
    Setting up Local Package Process
    Examining webmin-1.480-1.noarch.rpm: webmin-1.480-1.noarch
    Marking webmin-1.480-1.noarch.rpm to be installed
    Loading mirror speeds from cached hostfile
    Resolving Dependencies
    --> Running transaction check
    ---> Package webmin.noarch 0:1.480-1 set to be updated
    --> Finished Dependency Resolution

    Dependencies Resolved

    ================================================================================
     Package      Arch         Version        Repository                       Size
    ================================================================================
    Installing:
     webmin       noarch       1.480-1        webmin-1.480-1.noarch.rpm        15 M

    Transaction Summary
    ================================================================================
    Install      1 Package(s)
    Update       0 Package(s)
    Remove       0 Package(s)

    Total download size: 15 M
    Downloading Packages:
    Running rpm_check_debug
    Running Transaction Test
    Finished Transaction Test
    Transaction Test Succeeded
    Running Transaction
    Operating system is CentOS Linux
      Installing     : webmin                                            [1/1]
    Webmin install complete. You can now login to https://centos53.talsumhosp.net:10000/
    as root with your root password.

    Installed: webmin.noarch 0:1.480-1
    Complete!
    [root@centos53 ~]#
    อันนี้ของผมแบบลวก ๆคับ

    ใช้ได้เลยไม่ต้องคอนฟิกไรสักอย่างอ่ะคับ

    มาติดตั้ง webmin ใน centos 5.xx กัน

    มาเริ่มติดตั้งกันก่อนเลย

    #yum -y install perl-Net-SSLeay  ติดตั้ง ส่วนประกอบที่ webmin ต้องการกันก่อนเลย

    ต่อไปก็ cd เข้าไปยัง src (ตรงไหนก็ได้)
    #cd /usr/src

    โหลดไฟล์มาเลยจากเวป เราจาติดตั้งมันเองด้วยมือ
    #wget http://ftp://ftp.pbone.net/mirror/ftp.sourceforge.net/pub/sourceforge/w/we/webadmin/webmin-1.380-1.noarch.rpm

    เสร็จแล้วสั่งให้ กินสตอ

    #rpm -ivh webmin-1.380-1.noarch.rpm

    แล้วนอนเล่นพุงแปปนึงมันก็จะแจ้งว่า
    #rpm -i webmin-1.380-1.noarch.rpm
    Operating system is CentOS Linux
    Webmin install complete. You can now login to https://youdomain:10000/
    as root with your root password.

    เสร็จแว้วครับเข้าไปใช้งานได้เลย
    https://ip:10000
    user : root  pass : passของ root
    -------------------------------------------------------

    แต่... ใครลง chilli อย่าลืมไป อนุญาติใน firewall ด้วยนะครับ ไม่งั้นเปิดไม่ผ่าน...

    ไปเพิ่ม พอร์ต 1000 2 ที่นะครับที่แรก

    ##### chalee edit
    #Allow releated, established and ssh on $EXTIF. Reject everything else.
    $IPTABLES -A INPUT -i $EXTIF -p tcp -m tcp --dport 22 --syn -j ACCEPT
    $IPTABLES -A INPUT -i $EXTIF -p tcp -m tcp --dport 80 --syn -j ACCEPT
    $IPTABLES -A INPUT -i $EXTIF -p tcp -m tcp --dport 10000 --syn -j ACCEPT

    ที่ 2

    #Allow 3990 on other interfaces (input).
    $IPTABLES -A INPUT -p tcp -m tcp --dport 3990 --syn -j ACCEPT
    $IPTABLES -A INPUT -p tcp -m tcp --dport 3128 --syn -j ACCEPT
    $IPTABLES -A INPUT -p tcp -m tcp --dport 3306 --syn -j ACCEPT
    $IPTABLES -A INPUT -p tcp -m tcp --dport 22 --syn -j ACCEPT
    $IPTABLES -A INPUT -p tcp -m tcp --dport 10000 --syn -j ACCEPT

    เท่านี้ก็เข้าหน้า webmin ได้แว้ว.... หนา้ตาสวยงามทีเดียว พอดีว่างๆ ผมเลยลองค้นหาการติดตั้งดู...




    Thursday, February 17, 2011

    PHP Multiple files upload

    Overview
    In this tutorial create 2 files
    1. multiple_upload.php
    2. multiple_upload_ac.php


    Step
    1. Create file multiple_upload.php
    2. Create file multiple_upload_ac.php
    3. Create folder "upload" for store uploaded files.
    .4. CHMOD your upload folder to "777" by using your ftp software(change permission).

    Create file multiple_upload.php
    View in browser

    ############### Code

    <table width="500" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC">
    <tr>
    <form action="multiple_upload_ac.php" method="post" enctype="multipart/form-data" name="form1" id="form1">
    <td>
    <table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF">
    <tr>
    <td><strong>multiple Files Upload </strong></td>
    </tr>
    <tr>
    <td>Select file
    <input name="ufile[]" type="file" id="ufile[]" size="50" /></td>
    </tr>
    <tr>
    <td>Select file
    <input name="ufile[]" type="file" id="ufile[]" size="50" /></td>
    </tr>
    <tr>
    <td>Select file
    <input name="ufile[]" type="file" id="ufile[]" size="50" /></td>
    </tr>
    <tr>
    <td align="center"><input type="submit" name="Submit" value="Upload" /></td>
    </tr>
    </table>
    </td>
    </form>
    </tr>
    </table>


    Create file multiple_upload_ac.php
    ############### Code
    <?php
    //set where you want to store files
    //in this example we keep file in folder upload
    //$HTTP_POST_FILES['ufile']['name']; = upload file name
    //for example upload file name cartoon.gif . $path will be upload/cartoon.gif

    $path1= "upload/".$HTTP_POST_FILES['ufile']['name'][0];
    $path2= "upload/".$HTTP_POST_FILES['ufile']['name'][1];
    $path3= "upload/".$HTTP_POST_FILES['ufile']['name'][2];
    //copy file to where you want to store file
    copy($HTTP_POST_FILES['ufile']['tmp_name'][0], $path1);
    copy($HTTP_POST_FILES['ufile']['tmp_name'][1], $path2);
    copy($HTTP_POST_FILES['ufile']['tmp_name'][2], $path3);
    //$HTTP_POST_FILES['ufile']['name'] = file name
    //$HTTP_POST_FILES['ufile']['size'] = file size
    //$HTTP_POST_FILES['ufile']['type'] = type of file

    echo "File Name :".$HTTP_POST_FILES['ufile']['name'][0]."<BR/>";
    echo "File Size :".$HTTP_POST_FILES['ufile']['size'][0]."<BR/>";
    echo "File Type :".$HTTP_POST_FILES['ufile']['type'][0]."<BR/>";
    echo "<img src=\"$path1\" width=\"150\" height=\"150\">";
    echo "<P>";
    echo "File Name :".$HTTP_POST_FILES['ufile']['name'][1]."<BR/>";
    echo "File Size :".$HTTP_POST_FILES['ufile']['size'][1]."<BR/>";
    echo "File Type :".$HTTP_POST_FILES['ufile']['type'][1]."<BR/>";
    echo "<img src=\"$path2\" width=\"150\" height=\"150\">";
    echo "<P>";
    echo "File Name :".$HTTP_POST_FILES['ufile']['name'][2]."<BR/>";
    echo "File Size :".$HTTP_POST_FILES['ufile']['size'][2]."<BR/>";
    echo "File Type :".$HTTP_POST_FILES['ufile']['type'][2]."<BR/>";
    echo "<img src=\"$path3\" width=\"150\" height=\"150\">";
    ///////////////////////////////////////////////////////
    // Use this code to display the error or success.
    $filesize1=$HTTP_POST_FILES['ufile']['size'][0];
    $filesize2=$HTTP_POST_FILES['ufile']['size'][1];
    $filesize3=$HTTP_POST_FILES['ufile']['size'][2];
    if($filesize1 && $filesize2 && $filesize3 != 0)
    {
    echo "We have recieved your files";
    }
    else {
    echo "ERROR.....";
    }
    //////////////////////////////////////////////
    // What files that have a problem? (if found)
    if($filesize1==0) {
    echo "There're something error in your first file";
    echo "<BR />";
    }
    if($filesize2==0) {
    echo "There're something error in your second file";
    echo "<BR />";
    }
    if($filesize3==0) {
    echo "There're something error in your third file";
    echo "<BR />";
    }
    ?>


    CHMOD upload folder to 777 (change permission)
    This step, do it when you upload to real server.
    This example, I use WS-FTP, right click at upload folder > FTP Commands > CHMOD(Unix)


    Upload File อย่างปลอดภัย เช็คจากประเภทของไฟล์ หรือนามสกุลของไฟล์ดี

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

    ในช่วงแรกๆ ที่ผมหัดเขียนโปรแกรมเพื่อทำการ upload file ขึ้นมาที่ server ผมจะใช้วิธีการตรวจสอบ ว่าเป็น file ชนิดอะไรจาก
    นาม สกุลของ file แต่หลังจากนั้นผมก็เริ่มเขียนโปรแกรมโดยการตรวจสอบชนิดของ file จาก file type ซึ้งผมคิดว่ามันน่าจะดีกว่าแบบแรก แต่ผมก็พบว่ามันไม่ได้ดีอย่างที่ผมคิด มาดูกันแต่ละแบบแล้วกันว่ามีความแตกต่างและจุดบกพร้องอย่างไรบ้าง
    ในการตรวจสอบชนิดของ file จากการตรวจสอบจากนามสกุลของ file ที่ upload ขึ้นมานั้นสามารถที่จะเขียน code ได้ง่ายๆ ดังนี้
    # copy แล้ว save เป็นupload1.php เพื่อใช้ในการทดสอบ
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
     
    // รับเฉพาะ .gif กับ .jpg นะครับ
     
    print $file_name;
     
    if(strtoupper(substr($file_name, -4)) == ".JPG" || strtoupper(substr($file_name, -4)) == ".GIF"){
           copy($file,"/www/upload/".$file_name);
    }
     
    ?>
    <form action="upload1.php" method="POST" enctype="multipart/form-data">
    <input type="file" name="file"><input type="submit">
    </form>
    โดยที่ ช่อง input ที่ใช้ select file มี name = file แบบนี้นะ <input type="file" name="file">
    และตัวแปร $file_name จะแทนชื่อของ file ที่ upload ขึ้นมา หรืออาจจะใช้ $_FILES['file']['name'] ก็ได้
    ซึ่ง จากตัวอย่างจะเห็นว่ามี การ copy ข้อมูลไปไว้ที่ folder /www/upload/ โดยวิธีนี้จะดีตรงที่สามารถทำการ ตรวจสอบได้ง่าย แต่หากว่า file ที่ upload ขึ้นมาไม่ใช้ file รูปภาพ ก็ไม่สามารถที่จะตรวจสอบได้แล้ว อย่างเช่น ถ้า user ทำการเปลี่ยน นามสกุลของ file เป็น .gif ก่อนที่จะทำการ upload ขึ้นมาเราก็ตรวจสอบโดยวิธีนี้ไม่ได้ แต่ก็ดีตรงที่ file ที่ save ไปนั้นไม่ว่าจะเป็น file อะไร ก็จะมีนามสกุล เป็น .jpg กับ gif เสมอ
    วิธีการตรวจสอบชนิดของ file โดยการ ตรวจสอบ จาก file type คือการตรวจสอบชนิดของ file จริงๆว่าเป็น file ชนิดอะไร ไม่ว่าจะทำการเปลี่ยน นามสกุลของ file ไปเป็นอะไร ก็ตามเจ้า file type ก็ยังเหมือนเดิม มาดู code กันเลย
    # copy แล้ว save เป็น upload2.php เพื่อใช้ในการทดสอบ
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
     
    print $file_type;
     
    if($file_type == "image/jpeg" || $file_type == "image/gif"){
          copy($file,"/www/upload/".$file_name);
    }
     
    ?>
    <form action="upload2.php" method="POST" enctype="multipart/form-data">
    <input type="file" name="file"><input type="submit">
    </form>
    จาก code ที่ผ่านมาคุณคงจะคิดว่า แหม่ ตรวจสอบจากเจ้า file type นี้มันดีกว่านะ เพราะว่าไม่ว่าจะทำการเปลี่ยน นามสกุลของ file อย่างไร เราก็สามารถที่จะตรวจได้หมด เลยว่ามันเป็น อะไร กันแน่
    อันที่จริง จะคิด แบบนี้ ก็จริงอยู่ครับว่ามันสามารถที่จะตรวจสอบได้ว่า เป็น file อะไรกันแน่ถ้าหากว่า user ทำการเปลี่ยน นามสกุล ของ file ก่อนที่จะทำการ upload ขึ้นมา
    แต่ลองมาคิดดูอีกที่ หากว่าข้อมูลที่เขาส่งขึ้นมามันไม่ได้ มาจาก form ที่เราเขียนขึ้นละ มันกลับมาจากโปรแกรมที่สามารถทำการเปลี่ยน header ได้ละ จะเป็นยังไง ผลนะเหรอครับ ระวังให้ดีเราอาจจะโดน hack ง่ายๆ แน่ๆๆ
    ตัวอย่างเช่นผมสร้าง file ชื่อ xx.php จากนั้นผมก็เขียน code php ตามปกติ อาจจะเขียน phpinfo(); ดูก็ได้ จากนั้นผมก็ทำการ upload file นี้เข้ามาโดยผ่านทาง โปรแกรม upload file ที่เราสร้างกันตะกี่นี้ อะอะ แต่ว่าผมไม่ได้ ทำการ upload ผ่านทาง form ที่คุณสร้าง นะ แต่ว่าผมจะเขียนโปรแกรม เพื่อทำการ upload มาที่ upload2.php ของคุณเอง โดยที่โปรแกรมของ ผมจะทำการหลอก header ด้วยว่าเป็น file .gif แค่นี้ ผมก็สามารถที่จะทำการ upload xxx.php มาที่ server ของคุณได้แล้ว ลองคิดดูเอง นะถ้าใน file xx.php ไม่ได้มีแค่ phpinfo() ละจะเป็นยังไง
    คุณอาจจะคิดว่า จะหลอกมันได้ยังไง ในเมื่อขนาดว่าเราเปลี่ยน นามสกุลมาเป็น .gif มันยังรู้เลยว่า file type ที่แท้จริง คืออะไร
    ซึ่งในการ เขียนโปรแกรมเพื่อหลอก header ตรงนี้ผมจะนำมาบอก อีกครั้งหนึ่ง วันนี้ดึกแล้ว ง่วงมากๆๆ นอนก่อน…ครับ

    การ Upload File มาที่ Web Server โดยใช้ php ทำยังไง

    สวัสดีครับ วันนี้จะขอเขียนตัวอย่างง่ายๆ ในการ Upload ไฟล์จากเครื่องผู้ใช้ มาที่ web server โดยใช้ php ซึ่งท่านสามารถเอาไปดัดแปลงเพื่อให้ใช้งานได้ตามความต้องการครับ

    ในตัวอย่างนี้จะมีไฟล์ด้วยกัน 2 ไฟล์ครับ ไฟล์แรก จะเป็นฟอร์มในการ ใส่ชื่อไฟล์ที่จะ Upload ครับ ชื่อว่า main.htm code เป็นดังนี้ครับ

    <HTML>
    <FORM ENCTYPE="multipart/form-data" ACTION="add_file.php" METHOD="post">
    Upload ไฟล์นี้มาที่ Server: <INPUT TYPE="file" NAME="userfile"><BR>
    <INPUT TYPE="submit" VALUE="Upload"><BR>
    </FORM>
    </HTML>


    ซึ่งก็จะเห็นว่าไม่มีอะไรยาก มีเพียงแค่ ENCTYPE="multipart/form-data" ที่จะบอกว่า ข้อมูลใน form นี้เป็น mime format เท่านั้นเอง

    คราวนี้ลองมาดูอีกไฟล์ที่เป็นส่วนในการจัดการ upload มาที่ server ชื่อ add_file.php ครับ หน้าตาเป็นดังนี้
    <?php
    $Upload_Dir = "d:"; //กำหนดว่าจะให้ copy ไฟล์ที่มาจากเครื่องผู้ใช้ไปที่ใด ระบุที่นี่ได้ครับ
    $Max_File_Size = 100000; //กำหนดขนาดไฟล์ที่ใหญ่ที่สุดที่อนุญาตให้ upload มาที่ Server มีหน่วยเป็น byte
    $File_Type_Allow = array("application/x-zip-compressed" /*.zip*/,
                        "text/plain" /*.txt*/,
                        "image/bmp" /* .bmp, .ico*/,
                        "image/gif" /* .gif*/,
                        "image/pjpeg" /*.jpg, .jpeg*/,
                        "image/jpeg" /* .jpg, .jpeg*/); //กำหนดประเภทของไฟล์ว่าไฟล์ประเภทใดบ้างที่อนุญาตให้ upload มาที่ Server

    function validate_form($file_input,$file_size,$file_type) { //เป็น function ที่เอาไว้ตรวจสอบว่าไฟล์ที่ผู้ใช้ upload ตรงตามเงื่อนไขหรือเปล่า
       global $Max_File_Size,$File_Type_Allow;
       if ($file_input == "none") {
          $error = "ไม่มี file ให้ Upload";
       } elseif ($file_size > $Max_File_Size) {
          $error = "ขนาดไฟล์ใหญ่กว่า $Max_File_Size ไบต์";
       } elseif (!check_type($file_type,$File_Type_Allow)) {
          $error = "ไฟล์ประเภทนี้ ไม่อนุญาตให้ Upload";
       } else {
          $error = false;
       }

       return $error;
    }

    function check_type($type_check) { //เป็นฟังก์ชัน ที่ตรวจสอบว่า ไฟล์ที่ upload อยู่ในประเภทที่อนุญาตหรือเปล่า
       global $File_Type_Allow;
       for ($i=0;$i<count($File_Type_Allow);$i++) {
          if ($File_Type_Allow[$i] == $type_check) {
             return true;
          }
       }
       return false;
    }

    $error_msg = validate_form($userfile,$userfile_size,$userfile_type); // ตรวจดูว่า ไฟล์ที่ upload ตรงตามเงื่อนไขหรือเปล่า
    if ($error_msg) {
       echo $error_msg;
    } else {
       if (copy($userfile,$Upload_Dir."/$userfile_name")) { //ทำการ copy ไฟล์มาที่ Server
          echo "ไฟล์ Upload เรียบร้อย";
       } else {
          echo "ไฟล์ Upload มีปัญหา";
       }
    }
    ?>

    ครับสำหรับตัวอย่างนี้ก็คงไม่ยากอะไรในการที่จะ upload ไฟล์มาที่ Server นะครับ แต่มีข้อระวังอยู่นิดหน่อยก็คือ ในตัวอย่างจะเป็น code ที่ ทดสอบที่เครื่องของผู้เขียนเอง โดยใช้ Apache และ php บน Win98 หากจะเปลี่ยนมาใช้บน Unix Server ก็ให้แก้ตัวแปร $Upload_Dir เป็น ของ unix และที่สำคัญท่านอาจพบปัญหาเกี่ยวกับ permission ท่านต้องแน่ใจว่า directory ที่ท่านระบุเปิดสิทธิ์ให้ทุกคนมีสิทธิ์เขียนไปที่ Directory นั้นด้วย หากพบปัญหาอะไรก็ถามมาได้ครับ

     
    Design by sutoday | Bloggerized by storesu - suvachai | laikeng