XSS-跨腳本防護 php 篇

php.ini 設定

  • play_errors=Off
  • display_startup_errors=off
  • allow_url_fopen=Off
  • allow_url_include=Off
  • register_global = off (全域變數)
  • magic_quotes_gpc = off (‘ => \’ , ” => \” , %00 => \ 0) (建議 magic_quotes_gpc = off 自己處理)
  • display_error = off (在網頁上顯示錯誤訊息)
  • log_error = on (紀錄錯誤訊息)
  • allow_url_fopen = off (可開啟遠端網頁)
  • expose_php = off (顯示PHP 版本資訊)
  • open_basedir = (允許開啟的目錄)
  • safe_mode = on (安全模式)
  • disable_function = (禁止使用的函數)
  • safe_mode_include_dir = (允許include的目錄)
  • 禁用危险函数:
disable_functions = 
phpinfo,eval,passthru,assert,exec,system,ini_set,ini_get,get_included_files,
get_defined_functions,get_defined_constants,get_defined_vars,
glob,``,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,
ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,
symlink,popepassthru,stream_socket_server,fsocket,fsockopen

Header 設定篇

  • httponly 防止 XSS 擷取cookie
    • 建立 cookies 設定相關參數,setcookie函數和setrawcookie函數專門添加了第7個參數來做為HttpOnly的選項,開啟方法為:
 setcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE);
 setrawcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE);

Header 綜合設定

// 環境設定
 ini_set("session.cookie_httponly", 1);  // 開啟全局的Cookie的HttpOnly屬性,需5.2 以上版本
 ini_set("memory_limit","300M");  // 記憶體使用限制
 ini_set("post_max_size","200M");  // POST 資料最大上限
 ini_set('upload_max_filesize', '200M'); // 上傳檔案最大上限
 ini_set('max_execution_time', 600);  // 最長執行時間(單位:秒)
 ini_set('display_errors', '0');      // 關閉錯誤訊息顯示
 ini_set('error_reporting', E_ERROR | E_WARNING | E_PARSE);


header("Access-Control-Allow-Origin: http://domain-from.com");  // 設定特定網域
header('X-Frame-Options: DENY');  // 防止網頁被崁入他人網頁
header('Expect-CT: max-age=604800, report-uri="https://{subdomain}.report-uri.com/r/d/ct/enforce"')

Session 安全性設定

session_start([
    'cookie_httponly' => true,
    'cookie_secure' => true
]);
session 參考資料

web 輸出/入檢查

// 阻止 UTF-8 編碼的 web 頁面的 XSS 攻擊,不允许任何 HTML 標籤內容输出。
echo htmlentities($string, ENT_QUOTES | ENT_HTML5, 'UTF-8');
參考資料及工具

PHP 於寫入 DB 階段:(SQL Injection)

  • mysql_escape_string
  • mysql_real_escape_string
  • prepare + execute(PDO)
安全SQL寫法
/* 不安全代码: */
$query = $pdo->query("SELECT * FROM users WHERE username = '" . $_GET['username'] . "'");

/* 防止SQL注入: */
$results = $easydb->row("SELECT * FROM users WHERE username = ?", $_GET['username']);
SQL XSS 參考資料

PHP 於 HTML 頁面的呈現

  • 不允許 User 使用 HTML
    • htmlspecialchars
    • htmlentities ex: htmlentities($str, ENT_QUOTES, ‘UTF-8’);
  • 讓 User 使用 HTML 情況)
    • HTML Purifier: HTML Purifier is a standards-compliant HTML filter library written in PHP.
    • PHP HTML Sanitizer: Remove unsafe tags and attributes from HTML code
    • htmLawed: PHP code to purify & filter HTML
    • Secure PHP HTML parser and filter
開啟新視窗的安全寫法
// 不安全寫法
<a href="http://example.com" target="_blank">Click here</a>

// 安全寫法
<a href="https://example.com" target="_blank" rel="noopener noreferrer">Click here</a>

檔案上傳

不可將上傳目錄置於web目錄下。

file upload 參考資料

參考資料

安全檢查工具