PHP开发不能违背的安全规则
封面图
•
2025-11-28
•
PHP
233
0
0
0
在PHP开发中,遵循安全规则至关重要,以防止常见的安全漏洞和攻击(如SQL注入、XSS、CSRF、文件包含等)。以下是一些**不能违背的安全规则**,是PHP开发中必须遵守的基本准则: --- ### 一、输入验证与过滤 #### ❌ 不要信任任何用户输入 - **错误做法**:直接使用 `$_GET`, `$_POST`, `$_COOKIE` 等数据。 - **正确做法**:对所有用户输入进行**严格的验证和过滤**。 ```php // 错误示例 $email = $_POST['email']; // 正确示例 if (filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { $email = $_POST['email']; } else { die("无效的邮箱格式"); } ``` --- ### 二、防止SQL注入 #### ❌ 直接拼接SQL语句 - **错误做法**: ```php $query = "SELECT * FROM users WHERE username = '" . $_POST['username'] . "'"; ``` #### ✅ 使用预处理语句(PDO 或 mysqli) ```php $stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?"); $stmt->execute([$_POST['username']]); ``` --- ### 三、防止跨站脚本(XSS) #### ❌ 不转义输出 - **错误做法**: ```php echo $_GET['comment']; ``` #### ✅ 对输出进行HTML实体转义 ```php echo htmlspecialchars($_GET['comment'], ENT_QUOTES, 'UTF-8'); ``` --- ### 四、防止跨站请求伪造(CSRF) #### ❌ 不使用令牌(Token) - **错误做法**:直接处理表单提交,不验证来源。 #### ✅ 使用CSRF Token ```php // 生成token $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); // 表单中加入隐藏字段 <input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>"> // 验证token if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) { die("CSRF攻击"); } ``` --- ### 五、文件上传安全 #### ❌ 允许任意文件上传 - **错误做法**:直接保存用户上传的文件。 #### ✅ 限制文件类型、大小,并存储在非Web根目录下 ```php $allowed_types = ['image/jpeg', 'image/png']; if (in_array($_FILES['file']['type'], $allowed_types)) { move_uploaded_file($_FILES['file']['tmp_name'], '/var/www/uploads/' . basename($_FILES['file']['name'])); } ``` --- ### 六、禁用危险函数 #### ❌ 不要使用 `eval()`, `system()`, `exec()` 等高危函数 - 这些函数可能被恶意利用,导致代码执行漏洞。 #### ✅ 避免使用这些函数,或严格控制其使用范围。 --- ### 七、错误信息处理 #### ❌ 显示详细错误信息 - **错误做法**:在生产环境中显示PHP错误信息,暴露系统细节。 #### ✅ 关闭显示错误,记录日志 ```php ini_set('display_errors', 0); ini_set('log_errors', 1); error_log("发生错误:" . $e->getMessage()); ``` --- ### 八、会话管理 #### ❌ 不安全地使用 session - **错误做法**:不设置 `session.cookie_secure`、`session.use_only_cookies` 等。 #### ✅ 安全配置 session ```php session_start([ 'use_cookies' => true, 'cookie_secure' => true, // HTTPS环境下启用 'cookie_httponly' => true, ]); ``` --- ### 九、使用安全的密码哈希 #### ❌ 使用 md5 / sha1 存储密码 - 这些算法已不再安全。 #### ✅ 使用 `password_hash()` 和 `password_verify()` ```php $password = password_hash($_POST['password'], PASSWORD_DEFAULT); // 验证 if (password_verify($input, $stored_hash)) { // 密码正确 } ``` --- ### 十、避免暴露敏感信息 #### ❌ 在代码中硬编码数据库密码、API密钥等 - **错误做法**:将敏感信息写在代码中。 #### ✅ 使用环境变量或配置文件(不在版本控制中) ```php // config.php define('DB_PASSWORD', getenv('DB_PASSWORD')); ``` --- ## 总结:PHP开发不能违背的安全规则 | 安全规则 | 必须遵守 | |----------|-----------| | 输入验证 | ✅ | | SQL注入防护 | ✅ | | XSS防护 | ✅ | | CSRF防护 | ✅ | | 文件上传安全 | ✅ | | 禁用危险函数 | ✅ | | 错误信息处理 | ✅ | | 会话管理 | ✅ | | 密码哈希 | ✅ | | 敏感信息保护 | ✅ | --- 如果你正在开发一个PHP项目,建议使用现代框架(如 Laravel、Symfony)来帮助你自动处理很多安全问题。它们内置了强大的安全机制,可以大大减少出错概率。 需要我帮你检查某段PHP代码是否安全吗?
上一篇:
深入理解PHP之数组(遍历顺序)
下一篇:
PHP数组函数array_change_key_case()
标题录入,一次不能超过6条
留言
评论