Advertisement
mayankjoin3

security-harden.php

May 4th, 2025 (edited)
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 2.72 KB | None | 0 0
  1. <?php
  2. // Prevent direct access
  3. if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)) {
  4.     http_response_code(403);
  5.     exit("Forbidden");
  6. }
  7.  
  8. // Security Headers
  9. header('X-Frame-Options: SAMEORIGIN');
  10. header('X-XSS-Protection: 1; mode=block'); // Deprecated in modern browsers, consider removing
  11. header('X-Content-Type-Options: nosniff');
  12. header("Referrer-Policy: no-referrer");
  13. header("Permissions-Policy: geolocation=(), microphone=(), camera=()");
  14. header("Strict-Transport-Security: max-age=63072000; includeSubDomains; preload"); // if HTTPS
  15. header("Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none'; frame-ancestors 'self';");
  16. header_remove("X-Powered-By");
  17.  
  18. // Error handling
  19. error_reporting(0); // Use E_ALL in development
  20. ini_set('display_errors', 0);
  21. ini_set('log_errors', 1);
  22. ini_set('error_log', __DIR__ . '/logs/security.log');
  23.  
  24. // Secure sessions
  25. ini_set('session.cookie_httponly', 1);
  26. ini_set('session.cookie_secure', (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off'));
  27. ini_set('session.use_only_cookies', 1);
  28. ini_set('session.cookie_samesite', 'Strict');
  29. session_name('SECURESESSIONID');
  30. session_start();
  31.  
  32. // Session fixation & binding
  33. if (!isset($_SESSION['initiated'])) {
  34.     session_regenerate_id(true);
  35.     $_SESSION['initiated'] = true;
  36.     $_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'] ?? '';
  37.     $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'] ?? '';
  38. } else {
  39.     if (
  40.         ($_SESSION['user_agent'] !== ($_SERVER['HTTP_USER_AGENT'] ?? '')) ||
  41.         ($_SESSION['ip'] !== ($_SERVER['REMOTE_ADDR'] ?? ''))
  42.     ) {
  43.         session_unset();
  44.         session_destroy();
  45.         error_log("Session hijack attempt blocked.");
  46.         exit("Session Error");
  47.     }
  48. }
  49.  
  50. // Input sanitization
  51. function clean_input($data) {
  52.     return is_array($data)
  53.         ? array_map('clean_input', $data)
  54.         : htmlspecialchars(trim($data), ENT_QUOTES, 'UTF-8');
  55. }
  56. $_GET = clean_input($_GET);
  57. $_POST = clean_input($_POST);
  58. $_COOKIE = clean_input($_COOKIE);
  59.  
  60. // Safe include
  61. function safe_include($file) {
  62.     $realpath = realpath($file);
  63.     if ($realpath && strpos($realpath, __DIR__) === 0 && pathinfo($realpath, PATHINFO_EXTENSION) === 'php') {
  64.         include $realpath;
  65.     } else {
  66.         error_log("Blocked unsafe include attempt: $file");
  67.         http_response_code(403);
  68.         exit("Invalid include");
  69.     }
  70. }
  71.  
  72. // CSRF protection
  73. function generate_csrf_token() {
  74.     if (empty($_SESSION['csrf_token'])) {
  75.         $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
  76.     }
  77.     return $_SESSION['csrf_token'];
  78. }
  79. function verify_csrf_token($token) {
  80.     return isset($_SESSION['csrf_token']) && hash_equals($_SESSION['csrf_token'], $token);
  81. }
  82. ?>
  83.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement