PHP进阶:交互安全与防注入实战
|
PHP应用中,用户输入是安全风险的主要来源。未经验证和过滤的输入可能被恶意构造,用于SQL注入、XSS跨站脚本、命令执行等攻击。真正的交互安全不是依赖“事后补救”,而是从数据入口开始建立多层防御机制。 SQL注入仍是高发威胁。错误做法是拼接字符串构建查询,例如使用mysql_query("SELECT FROM users WHERE id = " . $_GET['id'])——攻击者传入1 OR 1=1即可绕过条件。正确解法是统一使用PDO或MySQLi的预处理语句:绑定参数后,数据库将输入视为纯数据而非可执行代码,彻底隔离逻辑与内容。
AI辅助生成图,仅供参考 但预处理并非万能护身符。它仅防护SQL上下文,对动态表名、列名或ORDER BY子句无效——这些必须硬编码或严格白名单校验。例如排序字段只允许'score'、'created_at'、'name'三者之一,通过in_array()确认后才拼入SQL,绝不直接使用用户传参。输出时的XSS风险同样严峻。即使输入已过滤,若渲染时不转义,恶意脚本仍会触发。echo $_GET['keyword']可能执行。解决方案是:HTML输出用htmlspecialchars($str, ENT_QUOTES, 'UTF-8');JSON输出用json_encode()并设置header('Content-Type: application/json; charset=utf-8');JS内联场景则必须双重编码或使用DOM API动态创建元素,避免innerHTML直接写入不可信数据。 文件操作需特别谨慎。上传文件名若直接拼入路径,攻击者可通过../../etc/passwd遍历敏感目录。应抛弃原始文件名,生成唯一随机名(如sha256_file(time().rand()).jpg),并限制MIME类型(通过finfo_file校验,不依赖$_FILES['type'])、大小和扩展名(白名单['jpg','png','pdf'])。保存路径也须在Web根目录外,或通过rewrite规则禁止直接访问上传目录。 密码处理必须遵循现代规范。绝不用md5或sha1,也不自行拼salt。使用password_hash($pwd, PASSWORD_ARGON2ID)生成密钥,该函数自动管理盐值与算法迭代;验证时用password_verify($input, $hash)——它内置恒定时间比较,防止时序攻击泄露哈希是否匹配。 配置与环境本身也是防线。php.ini中关闭display_errors(改为log_errors),避免泄露路径或数据库结构;启用open_basedir限制脚本可访问目录;关键系统调用如exec、system应在生产环境禁用(disable_functions = exec,passthru,shell_exec);所有外部API通信启用TLS并校验证书。安全不是某个函数的调用,而是贯穿开发、部署、运维的思维习惯——把每个用户输入当作潜在的敌意输入,每行输出视为需要消毒的变量,才是真正的进阶起点。 (编辑:51站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

