站长进阶PHP安全加固与防注入实战
|
PHP应用长期面临SQL注入、XSS、文件包含等高频攻击,站长仅靠基础语法理解难以构建真正安全的站点。安全加固不是堆砌工具,而是建立分层防御思维:从输入过滤、执行控制到输出编码,每个环节都需明确责任边界。 所有外部输入必须视为不可信数据,包括GET/POST参数、COOKIE、HTTP头、文件上传名甚至$_SERVER变量。使用filter_var()配合预定义过滤器(如FILTER_SANITIZE_STRING已弃用,应改用FILTER_SANITIZE_SPECIAL_CHARS或更精准的FILTER_VALIDATE_EMAIL)进行初步净化;对数字型参数强制类型转换((int)$id)或使用is_numeric()校验后cast,避免字符串拼接引发的隐式类型绕过。 数据库操作必须杜绝拼接SQL。PDO预处理语句是当前最可靠方案:prepare()声明模板,execute()绑定参数,数据库引擎自动隔离数据与指令。即使传入恶意字符串' OR 1=1 --,也会被当作字面值处理。切勿用mysql_real_escape_string()(已废弃)或addslashes()替代预处理——它们无法防御宽字节注入或上下文混淆场景。 输出到HTML页面前,必须对动态内容执行上下文敏感编码。echo htmlspecialchars($user_input, ENT_QUOTES | ENT_HTML5, 'UTF-8')可防御反射型XSS;若内容需保留部分HTML标签,应使用HTMLPurifier等白名单库严格过滤,而非简单strip_tags()——后者不防JavaScript伪协议和CSS表达式。 禁用危险函数是基础防线。在php.ini中设置disable_functions = exec,passthru,shell_exec,system,proc_open,popen,eval,assert,call_user_func,call_user_func_array,防止代码执行链形成。同时关闭display_errors,开启log_errors并将错误日志写入非Web可访问目录,避免泄露路径、版本等敏感信息。
AI生成结论图,仅供参考 文件操作需双重校验:上传文件时检查$_FILES['file']['type']不可信,应通过fileinfo扩展读取真实MIME类型,并限制扩展名白名单(如['jpg','png','pdf']);保存路径禁止用户可控,一律存入独立uploads目录并配置Web服务器禁止执行PHP(Nginx加location ~ \\.php$ { deny all; })。会话安全常被忽视。启用session.cookie_httponly=1和session.cookie_secure=1(HTTPS环境),设置session.cookie_samesite=Lax防止CSRF关联攻击;登录成功后务必调用session_regenerate_id(true)销毁旧ID,阻断会话固定漏洞。密码存储必须使用password_hash()生成bcrypt哈希,验证用password_verify(),绝不用md5或sha1。 定期更新PHP版本至官方支持分支(如8.1+),及时修补已知漏洞;使用Composer依赖时检查vendor目录是否存在未授权web访问路径;部署前删除install.php、phpinfo.php等调试文件。安全不是一次性配置,而是持续验证的过程——建议每月用OWASP ZAP扫描关键接口,关注CWE-79、CWE-89等高危项修复进展。 (编辑:92站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

