wordpress

WordPress Security ง่ายๆด้วย .htaccess

สำหรับบทความนี้เราจะกล่าวถึงความปลอดภัยในตัว WordPress CMS ซึ่งก็เป็นที่นิยมใช้งานสำหรับคนทั่วโลก เรียกได้ว่าอันดับ 1 เลยก็ว่ได้ แต่ด้วยที่ว่ามันเป็นที่นิยม เพราะฉะนั้น เรื่องของความปลอดภัยก็ต้องตามมาเหมือนกัน

ด้วยตัวระบบ WordPress แบบ Original นั้นมีการอัพเดตช่องโหว่อยู่ตลอดเวลาอยู่แล้ว จะสังเกตุได้จากว่ามีการอัพเดตเวอร์ชั่นกันบ่อยมากๆ บางทีก็อัพเดตแต่ความสามารถ แต่บางทีก็จะมีการอัพเดตเรื่องของความปลอดภัยเข้ามาด้วย เพื่อให้ Source Code นั้นทันสมัยและมีความปลอดภัยอยู่เสมอๆนั่นเอง

โดยส่วนมาก เว็บไซต์ที่เป็น WordPress ที่โดนเจาะนั้น สาเหตุหลักๆจะมาจาก Template, Plugin และการไม่อัพเดต Wordpres เป็นหลักเลย วันนี้ก็เลยจะเอาโค๊ด .htaccess มาไว้ให้ไปใส่ที่เว็บไซต์ของคุณกัน เพื่อช่วยเพิ่มความปลอดภัยของระบบ WordPress และส่วนเสริมทุกๆส่วนเลย

ก่อนอื่นทำความเข้าใจก่อนว่า WordPress จะมีระบบการใช้งาน .htaccess ให้วิ่งเข้าหาไฟล์ index.php ทั้งหมด (http://xvlnw.com/read/1921) แต่ก็จะมีบางไฟล์ที่ต้องเรียกตรงๆ เช่น wp-login.php เราก็เอาจุดนี้มาทำเป็นความปลอดภัยของระบบได้ โดยเราจะบังคับให้สามารถเรียกไฟล์หรือ Access ไฟล์ได้เฉพาะที่เรากำหนดเท่านั้น สมติว่า Hacker ทำการฝังไฟล์ชื่อ a.php ถ้าเราไม่มีโค๊ดที่ผมจะให้ต่อไปนี้ เค้าสามารถเรียกไฟล์นี้ได้ตลอดเวลา เอาหละ มาดูโค๊ดดีกว่า


<Files *.php>
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
</Files>
<Files ~ "(index.php|wp-login.php|wp-cron.php|xmlrpc.php|wp-tinymce.php|repair.php|wp-comments-post.php|admin-ajax.php)">
Order Allow,Deny
Allow from all
</Files>

จากโค๊ดด้านบน เราสามารถอธิบายได้ว่า หากไฟล์นามสกุล .php เราจะ Deny ทั้งหมด <Files *.php> และเราจะกำหนดไฟล์ที่สามารถเรียกหรือเข้าถึงได้ในส่วนของ <Files ~ “(index.php|wp-login.php|wp-cron.php|xmlrpc.php|wp-tinymce.php|repair.php|wp-comments-post.php|admin-ajax.php)”> ซึ่งไฟล์ที่ทางผมได้ List มานี้ เป็นไฟล์ที่ตัว WordPress ใช้งานอยู่ เพราะฉะนั้นแล้ว หาก Hacker สามารถฝังไฟล์ a.php ได้จริง ก็ไม่สามารถที่จะเรียกใช้งานได้เลย

สำหรับบรรทัด Allow from 127.0.0.1 ในส่วนนี้เราสามารถกำหนดได้ว่าจะให้ IP ไหนที่จะสามารถ Access ได้ทุกๆไฟล์ในระบบ WordPress สามารถกำหนดเป็นระดับ Class ได้ เช่น xxx.xxx.xxx.0/24 (แนะนำหาอ่านคู่มือการกำหนด IP Rank)

สำหรับท่านที่ใช้ Plugin บางตัว และไม่สามารถทำงานได้ ก็ต้องดูว่า Plugin ตัวนั้นๆมีการเรียกไฟล์ภายนอกหรือเปล่า ก็เอาชื่อไฟล์มาใส่ได้เลย โดยแต่ละไฟล์จะคั่นด้วย | นั่นเอง ถ้ายังไงก็ลองเอาไปใช้งานกันดูนะครับ

**การแก้ไขโค๊ด .htaccess โปรดทำการ Backup ของเดิมก่อนทุกครั้ง

IP

รายการ IP สำหรับ Spam Comment ใช้กับ WordPress

สำหรับ WordPress เราสามารถติดตั้งส่วนเสริม All in one WP Security & Firewall สำหรับเพิ่มความปลอดภัยให้กับเว็บไซต์ของเราได้ โดยใน Plugin นี้จะมีตัวสำหรับ Block IP อยู่ด้วย ก็ลองดาวน์โหลดไปเล่นๆกันก็แล้วกันนะ

สำหรับผู้ที่โดน Spam Comment ให้นำเอา IP นี้ไปใช้สำหรับ Block ได้เลย

1.93.*.*
104.237.*.*
110.89.*.*
111.253.*.*
112.111.*.*
117.169.*.*
117.26.*.*
119.233.*.*
120.33.*.*
120.43.*.*
121.204.*.*
130.211.*.*
141.134.*.*
172.246.*.*
175.44.*.*
176.31.*.*
178.62.*.*
179.189.*.*
183.252.*.*
185.38.*.*
186.95.*.*
188.165.*.*
188.68.*.*
192.99.*.*
195.13.*.*
195.2.*.*
195.211.*.*
199.91.*.*
213.119.*.*
216.244.*.*
221.178.*.*
223.86.*.*
23.95.22.*
27.150.*.*
27.153.*.*
27.159.*.*
31.41.*.*
36.248.*.*
36.250.*.*
41.63.*.*
46.161.*.*
54.88.*.*
58.23.*.*
59.56.*.*
61.190.*.*
62.210.*.*
69.12.84.*
84.105.*.*
84.192.*.*
91.200.*.*
94.102.*.*
PHP

PHP Algorithm A B .. Z, AA .. ZZ, AAA … ZZZ

สำหรับบทความนี้ก็จะเป็นการเขียน Algorithm ในภาษา PHP ที่เรียงตัวอักษรตั้งแต่ A > Z และเริ่มใหม่ด้วย AA >> ZZ ไปเรื่อยๆไม่รู้จบ ขึ้นอยู่กับว่าเราต้องการขนาดไหน ซึ่งเราก็มาดูโค๊ดกันเลย


<?php
ini_set('memory_limit', '1G');
function genLevel($lv){
$r = array();
$r[] = $thum = $start = "A";
$end = NULL;
for($i=0;$i<$lv;$i++) $end .= "Z";
while(true){
$r[] = $thum = ++$thum;;
if($thum == $end) break;
}
return $r;
}
$data = genLevel(2);
echo '<pre>';
print_r($data);
echo '</pre>';
?>

ในโค๊ดนี้หากเอาไปรันเลย ก็จะได้ผลลัพท์ A – ZZ เพราะว่ากำหนดไว้ 2 Level คือในส่วนของ


$data = genLevel(2);

โดยสามารถอธิบายการใส่ตัวเลขของ Level ได้ดังต่อไปนี้

  • Lv1 = A – Z
  • Lv2 = A – ZZ
  • Lv3 = A – ZZZ
  • Lv4 = A – ZZZZ

สำหรับท่านผู้ใช้งานที่ต้องการขนาดไหน ก็เอาตัวเลขระดับ Level ใส่ไปได้เลย แต่จากโค๊ดด้านบนยังมีส่วนที่สำคัญอีกส่วนก็คือ


ini_set('memory_limit', '1G');

ซึ่งเป็นการกำหนด Memory Limit ในภาษา PHP ซึ่งเป็นหน่วยของหน่วยความจำของระบบคอมพิวเตอร์หรือเซิฟเวอร์ 1G หมายถึง 1024MB นั่นเอง หากค่านี้น้อยเกินไป และค่าระดับ Level ที่ต้องการมากเกินไป จะทำให้เกิด Error Memory Limit นั่นเอง เพราะฉะนั้น ควรปรับให้เหมาะสม

wordpress

แก้ไขปัญหา WordPress แสดง IP ของผู้ใช้งานที่แสดงความคิดเห็นเป็น IP ของ Server

ก็ไม่ได้โพสเว็บไซต์นานมากๆ ไม่รู้จะเขียนเรื่องอะไรดี รวมกับมีเรื่องราววุ่นๆมากมายเข้ามาเรื่อยๆ ก็เลยไม่ได้อัพเดตกันเลย

สำหรับบทความวันนี้ก็จะมาโพสเกี่ยวกับการแก้ไขปัญหา WordPress ที่เปิดใช้งานการแสดงความคิดเห็นของตัวระบบ WordPress เอง หรือที่เรียกว่า WordPress Comment นั่นเอง โดยปัญหาเกิดจากการใช้งาน Nginx หรือ Proxy ตัวอื่นๆเช่น Varnish เป็นต้น ดักหน้า Apache เพื่อให้เกิดความเร็ว ความปลอดภัย และปัจจัยอื่นๆอีกมากมาย มันจะมีปัญหากับระบบ WordPress ไม่สามารถแสดง IP ที่แท้จริงของผู้ใช้งานได้นะครับ

สำหรับท่านใดที่เจอปัญหานี้อยู่ ก็เอาโค๊ดนี้ไปไว้ในไฟล์ function.php ของตรีมที่ท่านใช้งานอยู่ ปัญหาผู้ใช้งานคอมเม้นแล้วขึ้น IP ของ Hosting ก็จะหายไปครับ


add_filter( 'pre_comment_user_ip', 'auto_reverse_proxy_pre_comment_user_ip');

function auto_reverse_proxy_pre_comment_user_ip()
{
$REMOTE_ADDR = $_SERVER['REMOTE_ADDR'];
if (!empty($_SERVER['X_FORWARDED_FOR'])) {
$X_FORWARDED_FOR = explode(',', $_SERVER['X_FORWARDED_FOR']);
if (!empty($X_FORWARDED_FOR)) {
$REMOTE_ADDR = trim($X_FORWARDED_FOR[0]);
}
}
/*
* Some php environments will use the $_SERVER['HTTP_X_FORWARDED_FOR']
* variable to capture visitor address information.
*/
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$HTTP_X_FORWARDED_FOR= explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
if (!empty($HTTP_X_FORWARDED_FOR)) {
$REMOTE_ADDR = trim($HTTP_X_FORWARDED_FOR[0]);
}
}
return preg_replace('/[^0-9a-f:\., ]/si', '', $REMOTE_ADDR);
}

SQL

SSH คำสั่งสำหรับทำการ Optimize MySQL Database ใน DirectAdmin ทั้งระบบ

สำหรับผู้ดูแลระบบ หรือผู้ดูแล Hosting ควรจะทำการ Optimize ฐานข้อมูลเป็นประจำ อย่างน้อยเดือนละ 1 ครั้งก็ยังดี เพื่อเพิ่มประสิทธิภาพให้กับความเร็วในการอ่านเขียนข้อมูลของ MySQL ซึ่งสำหรับผู้ที่มีสิทธิ์ Root ของ SSH สามารถใช้คำสั่งด้านล่างนี้ทำการปรับปรุง ซ่อมแซม ในส่วนของฐานข้อมูลทั้งระบบได้เลยครับ


mysqlcheck -uda_admin -p`grep "^passwd=" /usr/local/directadmin/conf/mysql.conf | cut -d= -f2` --auto-repair --optimize --all-databases

คำสั่งนี้สำหรับผู้ที่ใช้งาน Web Control Panel ที่เป็น DirectAdmin เท่านั้นนะครับ

wordpress

วิธีป้องกัน WordPress โดนยิง wp-admin/admin-ajax.php

หลังจากเขียนบทความเรื่องเกี่ยวกับความปลอดภัยในการเขียนโค๊ด PHP ในหัวข้อ “PHP เพิ่ม Security ให้เว็บไซต์ด้วย .Htaccess” ก็มีลูกค้า Hosting โทรมาแจ้งว่าเว็บไซต์เข้าอืดมากๆ ผมก็เลยเข้าไปตรวจสอบ พบว่ามีการ POST เข้ามายัง URL: wp-admin/admin-ajax.php จำนวนมาก ก็ไม่รู้ว่า POST อะไรเข้ามา หรือว่าต้องการค่าอะไรซักอย่าง

ผมก็เลยเขียน .htaccess เพื่อป้องกันด้วยโค๊ดดังนี้


RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REMOTE_ADDR} !127.0.0.1
RewriteCond %{REMOTE_ADDR} !xxx.xxx.xxx.xxx # IP Server
RewriteCond %{REMOTE_ADDR} !xxx.xxx.xxx.xxx # IP Me.
RewriteRule ^ / [F]

โดยวางไฟล์ .htaccess ไว้ในโฟเดอร์ wp-admin เพื่อไม่ให้มันไปกระทบกับตัว wp-content เผื่อว่าจะมีการ POST เข้าไปยังไฟล์ Plugin ต่างๆ ด้วย

หมายเหตุ: เปลี่ยนจาก xxx.xxx.xxx.xxx เป็น IP ของท่านและ IP ของเซิฟเวอร์นะครับ

ก็ลองเอาไปใช้งานกันดูนะครับ ป้องกันได้ดีเลิศเลยจริงๆ ขอบอกๆ 😉

Security

PHP เพิ่ม Security ให้เว็บไซต์ด้วย .Htaccess

สำหรับบทความนี้เราจะมาดูกันในเรื่องของ Security สำหรับเว็บไซต์ของเรากันนะครับ ซึ่งบางเว็บไซต์ที่ไม่ได้ใช้การ POST หรือตัวแปร $_POST ในระบบเลย แล้วต้องการที่จะป้องกันไม่ให้ User ทำการ POST ค่าต่างๆเข้ามา เพื่อที่จะเจาะระบบ หรือว่ากระณีอื่นๆ มีวิธีแก้ไขด้วยการเขียนโค๊ด .htaccess ดังต่อไปนี้คับ

วิธีที่ 1:


<Limit POST>
order deny,allow
deny from all
allow from 127.0.0.1
</Limit>

วิธีที่ 2:


RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REMOTE_ADDR} !127.0.0.1
RewriteRule ^ / [F]

 

หรือถ้าใครที่เขียน .htacccess แบบครอบจักวาล คือการเรียกเข้า index.php ทั้งหมดตามที่ผมเคยได้เขียนไว้บน http://xvlnw.com/read/1921 ก็สามารถใช้คำสั่งนี้ได้เลยครับ


<Files *.php>
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
</Files>

<Files index.php>
Order Allow,Deny
Allow from all
</Files>

เป็นการอนุญาติให้เข้าถึงไฟล์ PHP ได้เฉพาะไฟล์ index.php เท่านั้น ยกเว้นถ้า ip เป็น 127.0.0.1 ก็จะสามารถเข้าถึงได้ทั้งหมดครับ ถ้าแบบนี้ก็หมายความว่าจะเรียกไฟล์อื่นๆที่ไม่ใช่ไฟล์ index.php จากภายนอกไม่ได้ หากต้องการไฟล์อื่นๆเช่น rss.php ผมยกตัวอย่างเฉยๆนะครับ ก็จะได้โค๊ดประมาณนี้


<Files rss.php>
Order Allow,Deny
Allow from all
</Files>

ก็แค่เพิ่มคำสั่ง .htaccess เข้าไปนั่นเองครับ

หมายเหตุ: ตัว WordPress CMS ก็สามารถใช้คำสั่งด้านบนนี้ได้นะครับ เพิ่มความปลอดภัยให้กับเว็บไซต์ของท่านได้ดีเลยครับ

โปรดอย่าลืม… ตรวจสอบความปลอดภัยของเว็บไซต์ท่านอยู่เสมอๆนะครับ

CentOS

CURL กำหนดค่า User Agent และตรวจสอบ HTTP STATUS

สำหรับวันนี้ก็มากับอีกบทความ อาจจะไม่ได้มีความรู้อะไรมากมายนะครับ จดไว้กันลืมๆ เพราะว่าเวลาจะใช้งานทีไรผมก็ลืมทุกทีนั่นแหละ การที่เราใช้งาน Hosting แล้วบางครั้งเราไม่สามารถใช้งานคำสั่ง curl เพื่อดึงข้อมูลจากเว็บไซต์ได้ เพราะว่าไม่ได้กำหนด Uset Agent หรือกำหนดว่าเราใช้งานเบราเซอร์อะไรอยู่ หรือเราชื่ออะไร ก็ประมาณนั้น

ผมก็เลยทดสอบด้วย CentOS ตามแบบของผมเช่นเคย วันนี้ก็จะเป็นคำสั่ง CRUL on CentOS กันนะครับ เอาไปปรับใช้กับ PHP CURL ก็ได้เช่นกัน เรามาดูคำสั่งกันเลย


#curl [URL]

curl http://xvlnw.com/

จากนั้นมันก็จะเหมือนเรา View Source เว็บไซต์ของเรานั่นแหละ แต่ถ้าหากเราอยากจะให้มัน Return ค่า HTTP STATUS กลับมาให้เรา เพื่อที่ว่าจะเช็คว่ามันเข้าได้หรือไม่ ก็จะใช้คำสั่ง -I เพิ่มเข้าไป


#curl -I [URL]

curl -I http://xvlnw.com/

สิ่งที่ Server ทำการ Response กลับมาก็คือค่าต่างๆที่เป็นส่วนของ Header ล้วนๆ ลองมาดูเว็บไซต์ของผมกัน


[[email protected] ~]# curl -I http://xvlnw.com/
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 13 Jan 2014 09:43:30 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/5.3.27
Vary: Accept-Encoding,Cookie,User-Agent
Cache-Control: max-age=3, must-revalidate
WP-Super-Cache: Served supercache file from PHP

ค่านี้บอกอะไรเราบ้าง? ก็ลองดูกันเอานะครับ คล้ายๆการเขียน PHP ดึง Header นั่นแหละ แล้วถ้าไม่ได้จะทำยังไง หมายถึงว่าไม่ได้ HTTP STATUS: 200 บางครั้งมันก็มีการเขียน Rule เช็คที่เซิฟเวอร์นะครับ ถ้าไม่มี User Agent มันก็จะ Return 403 กลับมา วิธีการก็คือการกำหนด User Agent เข้าไป

ผมจะยกตัวอย่างการกำหนด User Agent ว่าเป็น Firefox นะครับ


curl --user-agent "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0" -i http://xvlnw.com/

จากตัวอย่างผมบอกเซิฟเวอร์ว่า

  • ใช้ Firefox เวอร์ชั่น 26.0
  • ใช้ Windows 64bit

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

PHP

PHP เรียงข้อมูลใน Array

สำหรับวันนี้ก็มีบทความดีๆมาฝาก ส่งท้ายปี 2013 (2556) กันนะครับ เป็นบทความที่จะกล่าวถึงการเรียงข้อมูลในภาษา PHP เกี่ยวกับตัวแปร Array ตัวแปลที่มีข้อมูลเป็นโครงสร้างโดยเฉพาะ สำหรับใครที่ยังไม่รู้เรื่องเกี่ยวกับตัวแปร Array เลย ก็แนะนำให้ดูวีดิโอการสอนของผมที่ทำไว้นะครับ เริ่มตั้งแต่ http://xvlnw.com/read/2619 แล้วก็ต่อไปเรื่อยๆ มีอยู่ 4 ตอนนะครับ (บทที่ 11 – 14)

เอาหละ.. เรามาดูเรื่องการเรียงข้อมูลในตัวแปร Array กันเลยครับ

Array Sort

 

หมายเหตุ: อ่านไม่รู้เรื่อง คลิกที่รูปภาพเพื่อดูขนาดเต็มนะครับ

วิธีการใช้งานก็คือ เราจะต้องเข้าใจแต่ละความหมายของคำสั่งก่อน โดยผมจะอธิบายดังนี้ครับ

Sorts by : เรียงข้อมูลจากอะไร? ในตัวแปร Array จะสามารถเรียงข้อมูลได้ 2 อย่างก็คือ

  1. Array Key –  เรียงจาก Key ของ Array ได้ทั้งตัวเลขและตัวอักษรนะครับ หากเป็นตัวอักษรมันก็จะเรียงตามรหัสของ ASCII นะครับ
  2. Array Value – เรียงจาก Value ของ Array เหมือนกันกับ Array Key เลยครับ เพียงแต่เรียงจาก Value เท่านั้นเอง

ผมอธิบายให้เพิ่มเติมนะครับ สำหรับ Key และ Value


$data[0] = 1; // o = key | 1 = value

Maintains key association : แปลจาก Google Translate มา มันหมายความว่า “รักษาความสำพันธ์ที่สำคัญ” อันนี้เป็นความเข้าใจของผมจากการทดลองนะครับ

yes – หากมีการเรียงข้อมูลใน Key หรือ Value อย่างใดอย่างหนึ่ง (แน่นอนว่ามันจะต้องเรียงได้แค่อย่างเดียว) มันจะเอาค่าตรงข้ามตามไปด้วย เช่น


$data[0] = 1;

$data[1] = 0;

หากเรียงคีย์ เราก็จะได้ว่า


$data[1] = 0;

$data[0] = 1;

อธิบายอีกอย่างก็คือ: ไม่ว่า Key จะย้ายไปอยู่ตรงไหนก็ตาม Value จะตามคีย์ไปด้วยเสมอ หมายถึงความสำพันธ์ของข้อมูลนั่นเอง

no – มันก็คือตรงกันข้ามกับ yes ก็คือไม่สนใจค่าความสัมพันธ์ของข้อมูลแต่ก่อนเดิม หากยกตัวอย่างต่อจากข้างบน เราก็จะได้ว่า


$data[0] = 0;

$data[1] = 1;

ซึ่งมันจะย้ายแค่ key เท่านั้น แต่ value ไม่ได้ย้ายตามคีย์นั่นเองนะครับ เพราะฉะนั้น เราจะต้องดูเรื่องของ Maintains key association เป็นหลักเสมอๆ ไม่เช่นนั้นข้อมูลของท่านอาจจะเกิดความผิดพลาดได้นะครับ

Order of sort : ลักษณะของการเรียงข้อมูล สามารถแยกออกได้เป็น

  • low to high – จากน้อยไปมาก
  • high to low – จากมากไปน้อย
  • random – สุ่ม
  • natural, case insensitive – อันนี้ผมเข้าใจว่าน่าจะเรียงตามตัวอักษรนะครับ
  • user defined – อันนี้ผมเข้าใจว่าน่าจะถูกกำหนดโดย User เองได้นะครับ ลักษณะก็คือการใช้ callback function

Related functions : แสดงถึงรายการ Function ที่คล้ายๆกัน เพื่อให้ง่ายต่อการจดจำในการใช้งานครับ

สำหรับเบื้องต้น ให้ดูว่าเราต้องการใช้งาน Function แบบไหนจาก Function โดยรวม จากนั้นพอเรารู้แล้วว่าต้องใช้ Function ตัวไหนก็แนะนำให้ค้นหาข้อมูลเฉพาะของ Function นั้นๆ ท่านจะได้ตัวอย่างการเขียนโปรแกรมใน Function นั้นๆอย่างละเอียดครับ

Security

.htaccess Security for Website

วันนี้ผมโดน Attack จากผู้ไม่หวังดีด้วยการหวังว่าจะเจาะระบบเข้ามาทำอะไรซักอย่าง ซึ่งผมก็ไม่รู้ว่าเค้าจะเข้ามาทำอะไรนะครับ เป็นการเจาะระบบผ่านทาง URL หน้าเว็บไซต์ ส่วนตัวผมใช้งาน WordPress อยู่แล้ว แต่มีบางเว็บไซต์ที่ไม่ได้ใช้ WordPress หรือเว็บไซต์ที่เขียนขึ้นมาเอง ก็จะไม่มีเรื่องของความปลอดภัยของระบบซักเท่าไร นอกจากจะเขียนดีจริงๆ อัพเดตความปลอดภัยอยู่บ่อยๆ

ผมก็เลยเอาโค๊ด .htaccess ที่เกี่ยวกับ Security ของเว็บไซต์ที่เขียนเองมาฝากกันนะครับ ซึ่งผมได้มาจาก All in one WP Security ซึ่งเป็น Plugin หนึ่งของตัว WordPress ลองเอาไปใช้กับเว็บไซต์ที่เขียนเองดูครับ ช่วยได้เยอะเลยจริงๆ


# BEGIN All In One WP Security
#AIOWPS_BASIC_HTACCESS_RULES_START
<files .htaccess>
order allow,deny
deny from all
</files>
ServerSignature Off
LimitRequestBody 10240000
#AIOWPS_BASIC_HTACCESS_RULES_END

#AIOWPS_USER_AGENT_BLACKLIST_START
<IfModule mod_rewrite.c>
RewriteEngine On

RewriteCond %{HTTP_USER_AGENT} ^SquigglebotBot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^SurveyBot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^VoidEYE [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^YottaShopping_Bot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^webcrawl\.net [NC]
RewriteRule ^(.*)$ - [F,L]

</IfModule>
#AIOWPS_USER_AGENT_BLACKLIST_END
#AIOWPS_DENY_BAD_QUERY_STRINGS_START
RewriteCond %{QUERY_STRING} tag= [NC,OR]
RewriteCond %{QUERY_STRING} ftp: [NC,OR]
RewriteCond %{QUERY_STRING} http: [NC,OR]
RewriteCond %{QUERY_STRING} https: [NC,OR]
RewriteCond %{QUERY_STRING} mosConfig [NC,OR]
RewriteCond %{QUERY_STRING} ^.*(globals|encode|localhost|loopback).* [NC,OR]
RewriteCond %{QUERY_STRING} (\;|'|\"|%22).*(request|insert|union|declare|drop) [NC]
RewriteRule ^(.*)$ - [F,L]
#AIOWPS_DENY_BAD_QUERY_STRINGS_END

#AIOWPS_ADVANCED_CHAR_STRING_FILTER_START
<IfModule mod_alias.c>
RedirectMatch 403 \,
RedirectMatch 403 \:
RedirectMatch 403 \;
RedirectMatch 403 \=
RedirectMatch 403 \@
RedirectMatch 403 \[
RedirectMatch 403 \]
RedirectMatch 403 \^
RedirectMatch 403 \`
RedirectMatch 403 \{
RedirectMatch 403 \}
RedirectMatch 403 \~
RedirectMatch 403 \"
RedirectMatch 403 \$
RedirectMatch 403 \<
RedirectMatch 403 \>
RedirectMatch 403 \|
RedirectMatch 403 \.\.
RedirectMatch 403 \%0
RedirectMatch 403 \%A
RedirectMatch 403 \%B
RedirectMatch 403 \%C
RedirectMatch 403 \%D
RedirectMatch 403 \%E
RedirectMatch 403 \%F
RedirectMatch 403 \%22
RedirectMatch 403 \%27
RedirectMatch 403 \%28
RedirectMatch 403 \%29
RedirectMatch 403 \%3C
RedirectMatch 403 \%3E
RedirectMatch 403 \%3F
RedirectMatch 403 \%5B
RedirectMatch 403 \%5C
RedirectMatch 403 \%5D
RedirectMatch 403 \%7B
RedirectMatch 403 \%7C
RedirectMatch 403 \%7D
# COMMON PATTERNS
Redirectmatch 403 \_vpi
RedirectMatch 403 \.inc
Redirectmatch 403 xAou6
Redirectmatch 403 db\_name
Redirectmatch 403 select\(
Redirectmatch 403 convert\(
Redirectmatch 403 \/query\/
RedirectMatch 403 ImpEvData
Redirectmatch 403 \.XMLHTTP
Redirectmatch 403 proxydeny
RedirectMatch 403 function\.
Redirectmatch 403 remoteFile
Redirectmatch 403 servername
Redirectmatch 403 \&rptmode\=
Redirectmatch 403 sys\_cpanel
RedirectMatch 403 db\_connect
RedirectMatch 403 doeditconfig
RedirectMatch 403 check\_proxy
Redirectmatch 403 system\_user
Redirectmatch 403 \/\(null\)\/
Redirectmatch 403 clientrequest
Redirectmatch 403 option\_value
RedirectMatch 403 ref\.outcontrol
# SPECIFIC EXPLOITS
RedirectMatch 403 errors\.
RedirectMatch 403 config\.
RedirectMatch 403 include\.
RedirectMatch 403 display\.
RedirectMatch 403 register\.
Redirectmatch 403 password\.
RedirectMatch 403 maincore\.
RedirectMatch 403 authorize\.
Redirectmatch 403 macromates\.
RedirectMatch 403 head\_auth\.
RedirectMatch 403 submit\_links\.
RedirectMatch 403 change\_action\.
Redirectmatch 403 com\_facileforms\/
RedirectMatch 403 admin\_db\_utilities\.
RedirectMatch 403 admin\.webring\.docs\.
Redirectmatch 403 Table\/Latest\/index\.
</IfModule>
#AIOWPS_ADVANCED_CHAR_STRING_FILTER_END
#AIOWPS_FIVE_G_BLACKLIST_START
# 5G BLACKLIST/FIREWALL (2013)
# @ http://perishablepress.com/5g-blacklist-2013/

# 5G:[QUERY STRINGS]
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} (\"|%22).*(<|>|%3) [NC,OR]
RewriteCond %{QUERY_STRING} (javascript:).*(\;) [NC,OR]
RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3) [NC,OR]
RewriteCond %{QUERY_STRING} (\\|\.\./|`|='$|=%27$) [NC,OR]
RewriteCond %{QUERY_STRING} (\;|'|\"|%22).*(union|select|insert|drop|update|md5|benchmark|or|and|if) [NC,OR]
RewriteCond %{QUERY_STRING} (base64_encode|localhost|mosconfig) [NC,OR]
RewriteCond %{QUERY_STRING} (boot\.ini|echo.*kae|etc/passwd) [NC,OR]
RewriteCond %{QUERY_STRING} (GLOBALS|REQUEST)(=|\[|%) [NC]
RewriteRule .* - [F]
</IfModule>

# 5G:[USER AGENTS]
<IfModule mod_setenvif.c>
# SetEnvIfNoCase User-Agent ^$ keep_out
SetEnvIfNoCase User-Agent (binlar|casper|cmsworldmap|comodo|diavol|dotbot|feedfinder|flicky|ia_archiver|jakarta|kmccrew|nutch|planetwork|purebot|pycurl|skygrid|sucker|turnit|vikspider|zmeu) keep_out
<limit GET POST PUT>
Order Allow,Deny
Allow from all
Deny from env=keep_out
</limit>
</IfModule>

# 5G:[REQUEST STRINGS]
<IfModule mod_alias.c>
RedirectMatch 403 (https?|ftp|php)\://
RedirectMatch 403 /(https?|ima|ucp)/
RedirectMatch 403 /(Permanent|Better)$
RedirectMatch 403 (\=\\\'|\=\\%27|/\\\'/?|\)\.css\()$
RedirectMatch 403 (\,|\)\+|/\,/|\{0\}|\(/\(|\.\.\.|\+\+\+|\||\\\"\\\")
RedirectMatch 403 \.(cgi|asp|aspx|cfg|dll|exe|jsp|mdb|sql|ini|rar)$
RedirectMatch 403 /(contac|fpw|install|pingserver|register)\.php$
RedirectMatch 403 (base64|crossdomain|localhost|wwwroot|e107\_)
RedirectMatch 403 (eval\(|\_vti\_|\(null\)|echo.*kae|config\.xml)
RedirectMatch 403 \.well\-known/host\-meta
RedirectMatch 403 /function\.array\-rand
RedirectMatch 403 \)\;\$\(this\)\.html\(
RedirectMatch 403 proc/self/environ
RedirectMatch 403 msnbot\.htm\)\.\_
RedirectMatch 403 /ref\.outcontrol
RedirectMatch 403 com\_cropimage
RedirectMatch 403 indonesia\.htm
RedirectMatch 403 \{\$itemURL\}
RedirectMatch 403 function\(\)
RedirectMatch 403 labels\.rdf
RedirectMatch 403 /playing.php
RedirectMatch 403 muieblackcat
</IfModule>

# 5G:[REQUEST METHOD]
<ifModule mod_rewrite.c>
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]
</IfModule>

# 5G:[BAD IPS]
<limit GET POST PUT>
Order Allow,Deny
Allow from all
# uncomment/edit/repeat next line to block IPs
# Deny from 123.456.789
</limit>

หมายเหตุ: โปรดททำการสำรองข้อมูลไฟล์ .htaccess ของท่านก่อนใช้งานนะครับ ทางผมไม่รับผิดชอบหากเกิด Error จากการทดสอบใช้งานของผมจริงก่อนนำมาโพสให้เอาไปใช้งานกัน ทดสอบแล้วว่าใช้งานได้จริงๆนะครับ 🙂