站长学院:PHP安全防注入实战精讲
|
PHP应用常因直接拼接用户输入而遭遇SQL注入、XSS、命令执行等安全风险。理解漏洞原理比套用框架更重要——真正的防御始于对数据流向的清醒认知。 SQL注入本质是用户输入被当作SQL代码执行。避免拼接字符串查询,统一使用PDO或MySQLi的预处理语句。例如:$stmt = $pdo->prepare("SELECT FROM users WHERE id = ?"); $stmt->execute([$id]); 占位符?自动隔离数据与逻辑,彻底切断注入路径。
AI绘图结果,仅供参考 变量输出到HTML时务必防范XSS。echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8'); 是基础防线——它将、"、'等字符转义为HTML实体。切忌依赖前端JS过滤或仅做长度/正则限制,浏览器端可被绕过,服务端净化不可省略。谨慎对待任何执行外部命令的操作。如需调用shell,优先选用PHP内置函数替代(例如用file_get_contents代替curl_exec);若必须system()或exec(),严格白名单校验参数,并用escapeshellarg()包裹单个参数,禁用动态拼接命令字符串。 文件操作是高危区。上传文件时,绝不信任$_FILES['file']['name'],应重命名生成唯一随机名(如uniqid().bin),并明确指定存储路径;读取文件时禁用用户可控的路径拼接,改用白名单映射(如$file_map = ['a'=>'report.pdf', 'b'=>'log.txt']; $path = __DIR__.'/files/'.$file_map[$key] ?? '')。 开启PHP安全配置:在php.ini中设置display_errors=Off(生产环境关闭错误显示),log_errors=On(错误记录至日志),disable_functions=exec,passthru,shell_exec,system,proc_open,popen(禁用危险函数)。配合open_basedir限制脚本可访问目录范围。 会话与认证需额外加固。session_start()后立即调用session_regenerate_id(true)防止会话固定;密码哈希必须用password_hash($pwd, PASSWORD_ARGON2ID)(或至少PASSWORD_DEFAULT),验证时用password_verify();登录失败3次后启用短时IP锁定,避免暴力遍历。 不要幻想“万能过滤函数”。filter_var()可用于基础类型校验(如FILTER_VALIDATE_EMAIL),但无法替代上下文防护。数字ID用intval()或type casting (int)$id;URL用filter_var($url, FILTER_VALIDATE_URL);但这些只是辅助,不能替代预处理、转义、白名单等纵深防御措施。 安全不是功能模块,而是开发习惯。每次接收$_GET、$_POST、$_COOKIE、$_SERVER时,都默念三问:它是否被正确过滤?是否被正确转义?是否被正确授权?代码上线前执行最小权限原则检查——数据库账户只授SELECT/INSERT必要权限,Web目录禁止写入代码文件,日志目录禁止执行。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

