สรุป 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