ครั้งก่อนนำเสนอปลั๊กอิน CSP-ANTS&STP ซึ่งปัจจุบันได้เปลี่ยนชื่อเป็น CSP Friendly Security แต่ถึงจะมีการปรับปรุงแล้วก็อาจเกิด Header Overflow ได้ในอนาคต ดูผลลัพธ์ของ CSP ที่ได้เป็นดังภาพ

ซึ่งหลังจากคุยกับ Gemini ก็ได้รับคำแนะนำให้เปลี่ยน เนื่องจากมีโอกาสเกิด Header Overflow ได้ (ถึงแม้จะมีขนาดใหญ่มาก 8KB ถึง 16KB) ก็เลยให้เขียนใหม่ปรับปรุงจากรุ่นเดิมของ CSP Friendly Security โดยใช้ z.ai และ gemini.google.com ปรับปรุง
สิ่งที่ต้องมี
- Woody snippets
- สร้าง new php snippets ใส่โค้ดต่อไปนี้แล้วเปลี่ยนเป็น run everywhere แล้วกดบันทึกให้เรียบร้อย
add_action('template_redirect', 'csp_controller');
function csp_controller() {
// ตรวจสอบว่าเป็นหน้า Admin หรือหน้าเป้าหมายหรือไม่
$target_pages = array('cd-key');
if (is_admin() || is_page($target_pages)) {
// ส่ง Simple Header แล้วจบการทำงานทันที (ไม่เปิด Buffer)
if (!headers_sent()) {
header("Content-Security-Policy: upgrade-insecure-requests");
}
return;
}
if (function_exists('litespeed_autoload')) {
add_filter('litespeed_buffer_after', 'process_csp_buffer', 0);
} else {
ob_start('process_csp_buffer');
}
}
function process_csp_buffer($content) {
// ตรวจสอบว่าเป็นหน้า Admin หรือหน้าเป้าหมายหรือไม่
$target_pages = array('cd-key');
if (is_admin() || is_page($target_pages)) {
return $content;
}
// สร้าง Nonce
$nonce = base64_encode(random_bytes(16));
// แทรก Nonce (ใช้รหัส Hex เพื่อหลบ Editor บั๊ก)
$pattern = '#<(script|style)(?![^>]*\bnonce=)(?![^>]*\btype=[\x22\x27]application/(ld\+json|json)[\x22\x27])([^>]*)>#i';
$content = preg_replace($pattern, "<$1 nonce='" . $nonce . "'$3>", $content);
$sha256_csp = get_event_hashes($content);
$uris = get_allowed_domains($content);
$uri_string = implode(' ', $uris);
$script_src = "script-src https: 'strict-dynamic' 'nonce-" . $nonce . "'";
if (!empty($sha256_csp)) {
$script_src .= " " . $sha256_csp;
}
// สร้าง Full CSP Header
$csp_header = sprintf(
"Content-Security-Policy: base-uri 'self' %s data:; object-src 'none'; %s; frame-ancestors 'none';",
$uri_string,
$script_src
);
if (!headers_sent()) {
header($csp_header);
}
return $content;
}
// --- ฟังก์ชัน Helper (คงเดิม) ---
function get_event_hashes($output) {
$sha256 = array();
if (preg_match_all('#\s(onload|onclick)\s*=\s*([\x22\x27])(.+?)\2#is', $output, $matches)) {
foreach ($matches[3] as $event_code) {
if (!empty($event_code)) {
$sha256[] = base64_encode(hash('sha256', $event_code, true));
}
}
}
if (class_exists('autoptimizeConfig')) {
$sha256[] = base64_encode(hash('sha256', "this.onload=null;this.media='all';", true));
}
if (empty($sha256)) return '';
$unique_hashes = array_unique($sha256);
$formatted_hashes = array();
foreach ($unique_hashes as $h) {
$formatted_hashes[] = "'sha256-" . $h . "'";
}
return "'unsafe-hashes' " . implode(' ', $formatted_hashes);
}
function get_allowed_domains($string) {
$result = array();
$domains = array(
'https://secure.gravatar.com/avatar/',
'https://fonts.googleapis.com/',
'https://maxcdn.bootstrapcdn.com/',
'https://cdn.jsdelivr.net/'
);
foreach ($domains as $domain) {
if (strpos($string, $domain) !== false) {
$result[] = $domain;
}
}
return $result;
}- เมื่อไปทดสอบที่ https://securityheaders.com/
- ก็จะได้ CSP ใหม่ที่สั้นลง
| content-security-policy | base-uri ‘self’ data:; object-src ‘none’; script-src https: ‘strict-dynamic’ ‘nonce-sdfadsdfasdfadsfadsfa==’; frame-ancestors ‘none’; |
|---|
- ก็ยังมี recomendation ที่ต้องปรับปรุงอีกนิดหน่อยค่อยๆ ทำไป
- จบ… ขอให้สนุก










































