PHP安全编码避坑指南:90%开发者忽略的3个致命漏洞
|
PHP应用中,SQL注入仍是高频致命漏洞。许多开发者习惯用字符串拼接构造查询语句,例如直接将$_GET['id']嵌入SQL中,却未意识到攻击者可传入?id=1 OR 1=1--轻松绕过权限校验、拖库甚至删表。正确做法是全程使用PDO预处理语句:绑定参数而非拼接值。即使启用了magic_quotes_gpc(已废弃)或简单addslashes(),也无法覆盖所有编码绕过场景——Unicode多字节截断、宽字节注入等手段仍可突破。记住:过滤输入不是防御核心,参数化查询才是唯一可靠方案。 文件操作类函数常被低估风险。file_get_contents()、include()、require()若直接接收用户可控路径(如$_GET['template']),极易触发路径遍历(…/…/etc/passwd)或远程文件包含(RFI)。更隐蔽的是,当开发者用basename()截取文件名后拼接目录,却忽略URL编码绕过(如%2e%2e%2f);或未校验扩展名就调用include($_GET['page'].'.php'),导致攻击者上传恶意.php文件后通过?page=upload/shell%00绕过。安全实践是:白名单控制可访问资源、禁用allow_url_include、使用绝对路径+realpath()校验、对动态文件名做严格正则匹配(仅允许[a-z0-9_\\-])。 序列化与反序列化是PHP特有的高危链路。unserialize()若处理用户输入(如Cookie中的session数据、缓存键值),可能触发__wakeup()或__destruct()魔术方法中的危险操作。攻击者可构造恶意对象,在反序列化时执行任意代码、写入WebShell或发起SSRF。即便使用json_encode/json_decode,若后续逻辑错误地将JSON解析结果当作类实例调用方法,也可能间接引发问题。根本解法是:绝不反序列化不可信数据;改用JSON等无执行能力的格式传输结构化数据;若必须用serialize,需在反序列化前验证签名(如HMAC校验);并禁用危险的扩展(如phpggc工具所依赖的特定类)。 这些漏洞不依赖复杂框架,而是源于对PHP底层机制的误判——把“能运行”等同于“安全”。真实攻防中,90%的入侵始于一个未过滤的$_GET参数、一次未校验的文件名、一段信任了Cookie的unserialize。安全不是加一层防火墙,而是让每一行代码都默认拒绝未知输入。写完每一处用户交互,自问一句:“如果这里填的是system('rm -rf /'),我的代码会执行它吗?” (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

浙公网安备 33038102330577号