PHP安全防注入实战:风控全解析
|
PHP应用常因用户输入未经校验而成为SQL注入、XSS、命令执行等攻击的入口。防御的核心逻辑不是“堵漏洞”,而是“隔离不可信数据”——所有来自客户端(GET/POST/COOKIE/HTTP头)、文件上传、外部API返回的内容,一律视为潜在恶意输入,绝不直接拼接进查询语句或系统命令中。
AI生成的示意图,仅供参考 SQL注入最常见于字符串拼接式查询。例如使用mysqli_query($conn, "SELECT FROM user WHERE id = '$id'")极易被构造?id=1%27 OR 1=1--绕过。正确做法是全程使用预处理语句:用mysqli_prepare()绑定参数,让MySQL引擎自动区分代码与数据;PDO则通过prepare()->execute()配合占位符(?或:name),彻底切断SQL结构被篡改的可能。即使输入含单引号、分号或注释符,也不会影响语义解析。 HTML输出环节必须防范XSS。直接echo $_GET['name']会执行JavaScript脚本。应统一调用htmlspecialchars($str, ENT_QUOTES | ENT_HTML5, 'UTF-8')转义特殊字符;若需富文本,须引入专业库(如HTMLPurifier)进行白名单过滤,仅允许safe标签(如、)及指定属性,禁止、onerror等危险元素与事件。 系统命令执行风险集中在exec()、shell_exec()、system()等函数。绝不可将$_POST['filename']直接传入shell_exec("cat $file")。必须双重控制:先用basename()提取文件名基础部分,再结合白名单验证(如in_array($ext, ['txt', 'log'])),最后使用escapeshellarg()包裹参数——该函数确保字符串在shell中被安全引用,即使输入包含空格、$、反引号也无法逃逸。 文件上传需设三道防线:一是检查$_FILES['file']['type']不可信,应以finfo_open()检测真实MIME类型;二是重命名文件,抛弃原始名,生成唯一哈希+白名单扩展名(如md5(uniqid()).'.png');三是将上传目录置于Web根目录之外,或通过rewrite规则禁止直接访问.php/.htaccess等敏感后缀。 业务层风控同样关键。单一IP短时高频请求需限流(如Redis记录请求频次);登录失败5次后锁定账户15分钟;敏感操作(删账号、改密码)强制二次验证(短信/邮箱/Token);所有日志记录必须脱敏,不落明文密码、身份证、银行卡号。安全不是功能补丁,而是每个输入点、每条输出流、每次外部交互都嵌入的默认行为。 PHP配置本身亦是防线。关闭display_errors(生产环境设为Off),避免泄露路径与代码细节;设置open_basedir限制脚本可访问目录;禁用危险函数(disable_functions = exec,system,passthru,proc_open);启用OPcache提升性能同时减少解析漏洞暴露面。防御体系始于编码规范,成于配置加固,久于持续审计——没有银弹,只有纵深。 (编辑:百客网 - 域百科网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

