在日常PHP开发中,除了掌握基本语法和常用函数外,如何写出安全、健壮、易维护的代码才是进阶开发者的必修课。本文将分享一些实用的PHP开发技巧,帮助你有效防止安全隐患、提升代码质量。
- 防止SQL注入的最佳实践
SQL注入是最常见的安全漏洞之一。防止SQL注入的核心原则是永远不要直接拼接用户输入到SQL语句中,而是使用预处理语句(Prepared Statements
)。
示例:使用PDO预处理语句
$pdo = new PDO($dsn, $user, $pass);
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username');
$stmt->execute(['username' => $_POST['username']]);
这样即使用户输入恶意内容,也不会被当作SQL语句执行。
- XSS防护:输出时转义
跨站脚本攻击(XSS
)常见于未对用户输入进行输出转义的场景。原则:所有输出到HTML页面的内容都要进行转义。
示例:
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
这样可以防止用户输入的HTML
或JavaScript
代码被浏览器执行。
- CSRF防护:使用Token机制
跨站请求伪造(CSRF
)可以通过表单Token机制防护。每次表单渲染时生成唯一Token
,提交时校验。
示例:
// 生成Token
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
// 表单中加入
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
// 校验Token
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die('CSRF token mismatch');
}
- 文件上传安全
文件上传是高危操作,需严格校验文件类型、大小,并重命名保存,防止恶意脚本上传。
建议:
- 检查MIME类型和扩展名
- 限制文件大小
- 上传后重命名文件,禁止执行权限
- 存储在非Web根目录
- 密码安全存储
永远不要明文存储用户密码。应使用password_hash
和password_verify
进行加密和验证。
示例:
$hash = password_hash($password, PASSWORD_DEFAULT);
// 登录时
if (password_verify($password, $hash)) {
// 密码正确
}
- 配置文件安全
- 配置文件(如数据库账号密码)应放在Web根目录之外,防止被直接访问。
- 使用.env文件存储敏感信息,并通过getenv或第三方库(如
vlucas
/phpdotenv
)读取。
- 错误信息不暴露
生产环境下,关闭详细错误显示,防止敏感信息泄露。
ini_set('display_errors', 0);
ini_set('log_errors', 1);
- 输入验证与过滤
对所有外部输入(GET
、POST
、COOKIE
等)都要进行验证和过滤,防止恶意数据进入系统。
示例:
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
- 使用最新版本的PHP和依赖库
新版本不仅带来性能提升,还修复了已知安全漏洞。建议定期升级PHP和第三方库。 - 最小权限原则
数据库账号只授予所需的最小权限,避免使用root账号连接数据库。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容