PHP安全加固:站长进阶防注入实战
|
SQL注入仍是PHP网站最常见的安全威胁之一。攻击者通过构造恶意输入,绕过身份验证或直接读取、篡改数据库。防范核心在于“绝不信任用户输入”,所有外部数据——无论来自GET、POST、COOKIE还是HTTP头——都必须视为潜在危险源。 参数化查询是抵御SQL注入的黄金标准。使用PDO或MySQLi的预处理语句,将SQL逻辑与数据严格分离。例如:$stmt = $pdo->prepare("SELECT FROM users WHERE id = ?"); $stmt->execute([$id]); 即使$id被篡改为'1 OR 1=1',也不会触发语法执行,而仅作为字符串值匹配。 过滤与转义需分场景精准使用。htmlspecialchars()用于输出到HTML页面,防止XSS;而mysql_real_escape_string()已废弃,不应再用。若必须拼接SQL(如动态排序字段),应白名单校验:$valid_sort = ['name', 'created_at', 'status']; if (in_array($_GET['sort'], $valid_sort)) { $sql .= " ORDER BY " . $_GET['sort']; }。 错误信息暴露是典型“安全失能”。开发阶段开启display_errors便于调试,但上线后必须关闭:error_reporting(0); ini_set('display_errors', 'Off'); 并启用日志记录:ini_set('log_errors', 'On'); ini_set('error_log', '/var/log/php_errors.log')。避免向用户显示MySQL错误、路径或函数调用栈。 会话安全不容忽视。启动session前务必调用session_start(); 配置php.ini中session.cookie_httponly=1、session.cookie_secure=1(仅HTTPS传输)、session.use_strict_mode=1(拒绝空会话ID)。登录成功后强制regenerate_id(true),切断旧会话关联。
插画AI辅助完成,仅供参考 文件上传是高危操作入口。禁止直接执行上传目录(通过Web服务器配置Deny from all);校验文件MIME类型与扩展名双重白名单(如仅允许.jpg/.png,且用finfo_file验证真实类型);重命名文件为随机字符串+固定后缀,杜绝解析漏洞。临时文件上传后立即移动,不保留原始名称。最小权限原则贯穿始终。数据库连接账号仅授予必要表的CRUD权限,禁用DROP、CREATE等高危指令;Web进程运行用户(如www-data)不应拥有root或写入系统目录权限;第三方库及时更新,删除未使用的组件(如旧版phpMyAdmin、备份文件.php.bak)。 (编辑:草根网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


浙公网安备 33038102330470号