สรุป PHP Web Application Security

1. ต้อง Validate input หรือตรวจสอบความถูกต้องของข้อมูลทุกอย่างที่นำเข้ามา เช่น ต้องตรวจสอบว่ามีข้อมูล หรือใช่ข้อมูลที่เราต้องการจริงๆ หรือใหม่

เช่น การใช้ isset(), ?? operator, is_*() อาจเขียนเอง หรือใช้ ctype Extension หรือ ฟังก์ชัน filter_var, filter_input

ส่วนใน PHP 7 ให้ใช้ความสามารถของ Type Declarations โดยต้องประกาศคำสั่ง

declare(strict_types=1);

ไว้บนสุดของไฟล์ เพื่อ strict ชนิดของตัวแปรครับ
2. การป้องกัน Cross-site Scripting (XSS) ต้องมีการกรอง หรือ Filtering Input เสมอ เช่น

– ใช้คำสั่ง strip_tags($s) เพื่อเอาคำสั่ง HTML ออกไป
หรือจะใช้คำสั่ง filter_var($s, FILTER_SANITIZE_STRING) เพื่อเอาคำสั่ง HTML ออกก็ได้เหมือนกัน

– ใช้คำสั่ง preg_replace($, ‘/…/’, ”) เพื่อกรองและป้องกันด้วย regular expressions (เขียนเอง)

2.1 การป้องกัน Cross-site Scripting อีกอย่าง คือ การใช้ฟังก์ชัน htmlspecialchars($s) ยกตัวอย่างที่ควรทำ

เช่น

//ตัวอย่าง string
$s = ‘<p class=”c”>Let\’s go!</p>’;

//วิธีการเขียนที่ดี
echo htmlspecialchars($s);
echo htmlspecialchars($s, ENT_QUOTES);
echo htmlentities($s, ENT_QUOTES);
echo filter_var($s,FILTER_SANITIZE_FULL_SPECIAL_CHARS);

2.2 การป้องกัน Cross-site Scripting ด้วยการส่งไฟล์ชนิด JSON เข้ามา

$data = [
‘term’ => $_GET[‘q’]
];

header(‘Content-type: application/json’);

echo json_encode(
$data,
JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT |
JSON_HEX_AMP);
3. การป้องกัน SQL Injection

3.1 อย่างแรกให้ escape string ที่เข้ามา ยกตัวอย่าง เช่น

//สำหรับ MySQL/MariaDB
mysqli_real_escape_string($db, $value);
หรือ $db->real_escape_string($value);

//สำหรับ PostgreSQL
pg_escape_string($db, $value);

//สำหรับ SQLite
SQLITE3::escapeString($value);

3.2 ใช้ Prepared Statements ของ PDO (PHP Data Objects) ตัวอย่าง เช่น

$db = new PDO(…);
$sql = ‘INSERT INTO searches (term) VALUES (:term)’;
$cmd = $db->prepare($sql);
$cmd->bindParam(‘:term’, $term);
$cmd->execute();

3.3 ใช้ Prepared Statements ของ MySQLi

$db = new MySQLi(…); //mysqli_connect()
$sql = ‘INSERT INTO searches (term) VALUES (?)’;
$cmd = $db->prepare($sql); //mysqli_prepare()
$cmd->bind_param(‘s’, $term); //mysqli_stmt_bind_param()
$cmd->execute(); //mysqli_stmt_execute()

ป.ล. สำหรับคนที่ไม่ได้เขียนในแนว OOP ลองค้นเพิ่มได้ครับ วิธีการคำสั่งคล้ายกัน
4. เพิ่มความปลอดภัยให้กับ Cookies แนะนำให้ใช้ HTTPS และใช้ฟังก์ชัน setcookie ให้ถูกต้อง ด้วยการ set ค่าพารามิเตอร์ secure ให้เป็น true (กรณีใช้ https) และค่า httponly ให้เป็น true
ดูฟังก์ชัน setcokkieได้ที่นี่ http://goo.gl/4QulZg

ตัวอย่างการเขียน
//ปลอดภัย
setcookie(‘Cookie1’, rand(100, 999), 0, ‘/’, ”, true, true);

//ไม่ปลอดภัย
setcookie(‘Cookie2’, rand(100, 999), 0, ‘/’, ”, false, false);
5. การป้องกัน Cross-site Request Forgery (CSRF)

5.1 สร้างและเก็บค่า token โดยการสุ่มขึ้นมา
$name = ‘token-‘ . mt_rand();
$token = random_bytes(32);

$_SESSION[$name] = $token;

5.2 นำค่าตัวแปร token ไปใส่ไว้ในทุกๆฟอร์ม เช่น

<input type=”hidden” name=”_csrfname” value=”token-123456″>
<input type=”hidden” name=”_csrfvalue” name=”a1b2c3d4e5f6″>

5.3 จากฟอร์มข้อ 5.2 เมื่อผู้ใช้คลิก Submit ฟอร์มแล้วก็อย่าลืม isset เช็คตัวแปร และค่าด้วยนะครับว่าตรงกันกับที่ส่งมามั้ย

ป.ล. จากข้อ 5.2 นี้ถ้าใครเคยเขียน Framework จะเห็นว่าเกือบทุก Framework จะมีมาให้แล้ว
6. เข้ารหัส Password ด้วยวิธีที่ถูกต้อง

6.1 Hash passwords ทุกครั้ง

6.2 อย่าใช้ algorithms เช่น MD5 หรือ SHA1 (มันเก่าแล้ว และไม่ปลอดภัย)

6.3 ให้ใช้ Password Hashing API ของ PHP เช่น
password_hash(), password_get_info(), password_needs_rehash(), password_verify()

อยากเป็น Full-Stack Web Developer เริ่มต้นเรียนที่นี่ครับ

1. คอร์สเรียนพื้นฐาน และภาพรวมสำหรับการเป็น Web Developer
http://goo.gl/oDFrIW

2. คอร์สเรียน PHP AJAX เรียนรู้การเขียน jQuery โดยใช้เทคนิค AJAX ร่วมกับ PHP
http://goo.gl/Xyci6q

3. คอร์สเรียน การเขียนโปรแกรมเชิงวัตถุด้วย PHP (PHP OOP)
http://goo.gl/AoKllp

4. คอร์สเรียน Yii Framework 2 พื้นฐาน
http://goo.gl/4BY8fA

5. คอร์สเรียน Yii Framework 2 ฐานข้อมูล และการทำรายงาน
http://goo.gl/tAw1mk

6. e-Book “Yii 2: Database and Report” ฉบับภาษาไทย
http://goo.gl/WKgtJw

———-
7. คอร์สเรียน Laravel 5.2
http://goo.gl/jkkcGS

8. e-Book Laravel 5.2 ฉบับภาษาไทย
http://goo.gl/DbGSpf

———-
9. พื้นฐาน JavaScript ES6/ES2015 เพื่อต่อยอด Node.js, Angular 2 หรือ Ionic 2
http://goo.gl/0Qp4VB

10. สร้าง Mobile App ด้วย Ionic Framework 2
http://goo.gl/aA4Bk2

11. e-Book สร้าง Mobile App ด้วย Ionic Framework 2 (ฉบับภาษาไทย)
http://goo.gl/Bm1kJ3

———-

คอร์สพิเศษ Visual Basic.NET Programming
http://goo.gl/zXKOja

สำหรับคนที่สนใจสามารถดูรายละเอียด ลงทะเบียนได้ในลิงก์ของแต่ละคอร์สได้เลยครับ อย่าลืมเรียนเรียงตามลำดับด้วยนะครับ เพราะพื้นฐานสำคัญมันสำคัญสุดๆ 🙂

คอร์สเรียนฟรี เราก็มี ดูได้ที่นี่
https://goo.gl/fFlmaE

แนะนำ Guzzle สำหรับทำ RESTful APIs (PHP)

สำหรับคนที่เขียน PHP อยากเขียนต่อกับ RESTful APIs หรือ Web Services แนะนำตัวนี้ครับ “Guzzle”

 

 

รายละเอียด
http://goo.gl/BKjZXv

– Guzzle เป็น PHP HTTP client ที่ใช้สำหรับส่ง HTTP requests และเชื่อมต่อกับ web services ครับ

– สามารถดึงข้อมูล เพิ่ม แก้ไข ลบ หรืออัพโหลดไฟล์ไปที่ web services ได้ง่ายมากเพียงใช้โค้ดไม่กี่บรรทัด

– สามารถเขียนเชื่อมกับ APIs เจ้าดังๆ ได้ไม่ว่าจะเป็น Twitter, Facebook, GitHub ได้สบายๆ

แน่นอนมันติดตั้งผ่าน Composer เราสามารถใช้ได้ทั้ง เขียน PHP แบบปกติ หรือใช้ PHP framework ก็ได้

 

ถ้าง่ายหน่อยสำหรับคนใช้ Yii Framework 2 ดูที่นี่
https://goo.gl/PLq6gg

สำหรับคนใช้ Laravel 5 ดูที่นี่
https://goo.gl/4kq0PT

ลองใช้ดูกันได้ครับ

รวมลิงก์แหล่งศึกษา PHP 7 ที่ควรอ่านครับ

php7

1. PHP Manual: Migrating from PHP 5.6.x to PHP 7.0.x
https://secure.php.net/manual/en/migration70.php

2. PHP 7 UPGRADING doc
https://github.com/php/php-src/blob/PHP-7.0.0/UPGRADING

3. PHP 7 Requests for Comments
https://wiki.php.net/rfc#php_70

4. PHPNG (next generation)
https://wiki.php.net/phpng

5. Getting Ready for PHP 7
https://www.digitalocean.com/…/blog/getting-ready-for-php-7/

6. What to Expect When You’re Expecting: PHP 7, Part 1
https://blog.engineyard.com/2015/what-to-expect-php-7

7. What to Expect When You’re Expecting: PHP 7, Part 2
https://blog.engineyard.com/2015/what-to-expect-php-7-2

8. Zend: 5 Things You Must Know About PHP 7
http://www.zend.com/en/resources/php-7

9. The PHP 7 Revolution: Return Types and Removed Artifacts
http://www.sitepoint.com/php-7-revolution-return-types-rem…/

10. PHP 7: 10 Things You Need to Know
http://www.hongkiat.com/blog/php7/

11. ‪#‎php7‬ on Twitter
https://twitter.com/hashtag/php7

12. GoPHP7 Extensions Project
http://gophp7.org/gophp7-ext/

13. Laracasts – PHP 7 Up and Running
https://laracasts.com/series/php7-up-and-running

.
แถม ใครใช้ Ubuntu 14.04, 15.04, และ 15.10 สามารถติดตั้ง PHP 7 เพียงได้ 3 คำสั่ง ดังนี้

sudo add-apt-repository ppa:ondrej/php-7.0
sudo apt-get update
sudo apt-get install php7.0

——————————
ขอให้สนุกกับการเรียนรู้ครับ

9 ฟังก์ชัน PHP สำหรับจัดการข้อความ ที่มือใหม่ควรใช้ให้เป็น

1. rawurlencode เปลี่ยนเครื่องหมาย & และช่องว่าง ให้อยู่ในรูปแบบ url ที่ถูกต้อง
2. htmlentities ช่วยแปลง string ให้อยู่ในรูปแบบของ html entities
3. nl2br แทรกคำสั่ง <br> ถ้าต้องการขึ้นบรรทัดใหม่
4. strip_tags การเอาคำสั่ง html ออกจาก string
5. wordwrap ตัดคำ หรือขึ้นบรรทัดใหม่ โดยกำหนดได้ว่าจะแทรกที่ตัวอักษรที่เท่าไหร่
6. trim ลบช่องว่างออกจาก string ทั้งซ้ายและขวา
7. substr ตัดเอา string บางส่วนตามตำแหน่งที่เรากำหนด
8. number_format จัดรูปแบบของตัวเลข เช่น ให้มีคอมม่าคั่นหลักพัน เป็นต้น
9. strcmp เปรียบเทียบ string แบบแน่นอนในระดับ binary

สรุปแบบย่อๆนะครับ วิธีใช้แบบเต็มๆดูเพิ่มเติมได้ที่:
http://php.net/manual/en/ref.strings.php

6 เทคนิคการเขียนคำสั่ง PHP ให้ทำงานเร็วขึ้น

1. ใช้เครื่องหมายคอมม่า (,) แทนเครื่องหมายจุด (.) ในการเชื่อมต่อ string เช่น

2. เมื่อต้องการแสดงตัวแปรให้ใช้เครื่องหมาย Double Quotes ครอบไว้เร็วกว่า เช่น

3. ถ้าแสดงผลเฉพาะ string อย่างเดียวไม่มีตัวแปรข้างใน ใช้ single quotes ( ‘ ‘ ) เร็วกว่า double quotes(“”) นะ เช่น

4. ถ้ามี array เยอะๆ การวนลูปแนะนำให้ใช้ foreach (เร็วที่สุด) ตามด้วย while และ for ตามลำดับ

5. การอ่านหรือเปิดไฟล์ ฟังก์ชัน file_get_contents() เร็วกว่า fread() ทั้งไฟล์เล็กและไฟล์ขนาดใหญ่<br />

6. เลิกใส่เครื่องหมาย @ ไว้หน้าคำสั่ง เพื่อหยุด Error มันทำให้การทำงานช้าลงนะ<br />

อันนี้เน้นเฉพาะการเขียนโค้ดนะ จริงๆต้องปรับส่วนอื่นๆด้วยนะครับ เช่น Web Server, Database เป็นต้น 🙂

3 แนวทางง่ายๆ เขียน PHP ให้ปลอดภัย แค่ใส่ใจกับอินพุต

อย่าเชื่อ!! ว่าข้อมูลที่รับมาจากแหล่งที่เราควบคุมไม่ได้ ไม่ว่าจะเป็น $_GET,$_POST,$_REQUEST,$_COOKIE,$argv,file_get_contents(),Remote databases,Remote APIs และ ข้อมูลทุกอย่างที่มาจาก Client ว่าจะปลอดภัยครับ เราควรต้องกรอง และคอยตรวจสอบความถูกต้องของข้อมูลเสมอ ดังนี้

  1. ควรกรองข้อมูลอักขระพิเศษต่างๆ จาก HTML ด้วย เช่น การใช้ฟังก์ชัน htmlentities() ตัวอย่าง

    ฟังก์ชัน htmlentities() จะช่วยให้เรากรองและแปลง HTML ให้กลายเป็น string ที่ปลอดภัยครับ หรือใครอยากลองเล่น Html Purifier Libray ตามไปได้ที่ http://htmlpurifier.org

     

  2. ถ้ารับข้อมูล input จาก user และมีการกรอกข้อมูล เช่น อีเมล์,โทรศัพท์,Urls ต่างๆ ก็ควรใช้ฟังก์ชัน filter_var() สำหรับกรองข้อมูลครับ ฟังก์ชันนี้จะช่วยกรองข้อมูล เช่น email,integers,floats,URLs และอื่นๆ ตัวอย่าง เช่น

    การกรองข้อมูลอีเมล์ตามตัวอย่างนี้ จะเอาอักขระต่างๆออกให้ทั้งหมด ยกเว้น ตัวอักษร,ตัวเลข และ !#$%&’*+-/=?^_`{|}~@.[] นอกจากอีเมล์ ก็มี Sanitize filters อีกหลายตัว เช่น FILTER_SANITIZE_NUMBER_INT,FILTER_SANITIZE_URL,FILTER_SANITIZE_NUMBER_FLOAT เป็นต้น

  3. การตรวจสอบความถูกต้องข้อมูลเราสามาถใช้ฟังก์ชัน filter_var() เช่นเดียวกัน โดยสามารถตรวจสอบได้หลายอย่างเช่น Booleans, emails, floats, integers, IP addresses ฯลฯ ตัวอย่าง เช่น

    นอกจากนี้ก็มี Validate filters อีกหลายตัวเช่น FILTER_VALIDATE_FLOAT,FILTER_VALIDATE_IP,FILTER_VALIDATE_REGEXP เป็นต้น

    ใส่ใจกับความปลอดภัยด้วยนะครับ 🙂

10 ข้อควรรู้ เขียน PHP ให้ถูกต้องและตรงตามมาตรฐาน

หลายคนที่เขียน PHP อยู่ตอนนี้ รวมถึงตัวผมด้วย อาจยังเขียน php ไม่ถูกต้องตามมาตรฐานนัก อาจติดมาจากภาษาอื่นๆ หรือเขียนเองคนเดียว ถึงแม้ไม่ errors ทำงานได้ปกติ แต่เมื่อไหร่ที่เราต้องทำงานร่วมกับคนอื่น ผมว่ามีปัญหาแน่นอน ว่าแล้วก็มาฝึกเขียน PHP ให้ตรงตามมาตรฐานกันดีกว่าครับ

1. ไฟล์ PHP ต้องเปิดด้วยคำสั่ง <?php และ <?= เท่านั้น

2. ไฟล์ต้องมีการเข้ารหัสภาษาเป็น UTF-8 without BOM

3. การตั้งชื่อ Class และ Namespace ควรกำหนดให้เป็น StudlyCaps เช่น ConnectDatabase

4. การตั้งชื่อ Methods ควรกำหนดเป็นรูปแบบเป็น camelCase เช่น goDB()

5. เมื่อมีการเยื้องโค้ดต้องไม่ใช้ tabs แต่ให้เคาะช่องว่าง 4 เคาะ

6. โค้ดต่อ 1 บรรทัดควรไม่เกิน 80 ตัวอักษรหรือน้อยกว่านั้น อย่างมากไม่ควรเกิน 120 ตัวอักษร

7. เวลากำหนด namespace ให้เคาะเว้นบรรทัดเปล่าๆ 1 บรรทัดเสมอ และแน่นอนเมื่อใช้คำสั่ง use ก็เคาะเว้นบรรทัดเปล่า 1 บรรทัดเช่นเดียวกัน

8. เมื่อเขียน methods หรือ functions ต่างๆ เครื่องหมายปีกกาต้องเขียนอยู่ในบรรทัดถัดลงมา และปิดเครื่องหมายปีกกาในบรรทัดต่อไปของตัวเมธอด หรือฟังก์ชันด้วย เช่น

9. Visibility จะต้องถูกกำหนดให้กับทั้งหมดของ properties และ methods และ คีย์เวิร์ด abstract และ final จะต้องถูกกำหนดก่อน visibility ส่วน static นั้น จะต้องถูกกำหนดหลัง visibility ป.ล. visibility คือการกำหนดการเข้าถึงข้อมูลของ class ในส่วนของ properties และ methods ประกอบไปด้วย private , public, protected

10. คำสั่งในกลุ่มของ Control Structures เช่น if,switch,while,do while มีข้อกำหนดดังนี้

10.1 จะต้องเว้นวรรค 1 เคาะ หลังจากเขียนคำสั่งเหล่านี้

10.2 จะต้องไม่มีช่องว่างข้างในเล็บเปิด-ปิด

10.3 จะต้องมีช่องว่างอย่างละ 1 เคาะ ทั้งก่อนและหลังวงเล็บเปิด-ปิด

10.4 ในส่วนโครงสร้างของตัวคำสั่งให้เยื้อง 1 เคาะ

10.5 วงเล็บปีกกาตอนเปิดนั้นจะต้องอยู่บรรทัดเดียวกัน ยกเว้นตอนปิดอยู่คนละบรรทัด เช่น

ใครสนใจศึกษาเพิ่มเติม ศึกษาต่อได้ที่ http://www.php-fig.org/psr/psr-1/

ขอให้สนุกกับการเขียนโปรแกรมทุกวันครับ