从一次简单的开发引申出的一些安全问题
字数 912 2025-08-27 12:33:23
Web应用安全开发与漏洞防范指南
前言
本文从实际开发案例出发,详细分析Web应用开发中常见的安全漏洞及其防范措施,涵盖SQL注入、文件上传漏洞、CSRF、XSS等安全问题,帮助开发者在编码阶段就构建安全防线。
SQL注入防护
漏洞示例
// 危险示例:直接拼接用户输入
$username = $_POST['username'];
$sql = "select * from user where username='{$username}'";
$row = mysql_query($sql);
注入类型
- 查询注入:通过SELECT语句获取敏感数据
- 插入注入:通过INSERT语句污染数据库
- 删除注入:通过DELETE语句破坏数据
防护措施
- 使用预处理语句(PDO/mysqli)
$stmt = $pdo->prepare("SELECT * FROM user WHERE username = ?"); $stmt->execute([$username]); - 严格过滤输入:使用
filter_var()或正则表达式验证 - 最小权限原则:数据库用户只赋予必要权限
- 错误处理:禁用详细错误回显
error_reporting(0)
文件上传安全
常见漏洞
- 直接上传可执行文件(如.php)
- 通过修改Content-Type绕过检测
- 利用双扩展名绕过(如test.php.jpg)
完整防护方案
前端验证
function checkFile() {
var allow_ext = ".jpg|.png|.gif";
var ext_name = file.substring(file.lastIndexOf("."));
if (allow_ext.indexOf(ext_name) == -1) {
alert("只允许上传" + allow_ext + "类型的文件");
return false;
}
}
后端验证
$whitetype = ['image/jpeg','image/png','image/gif'];
$white = ['.gif',''.png','.jpg'];
// 检查MIME类型
if(!in_array($_FILES['file']['type'], $whitetype)) {
die("非法文件类型");
}
// 检查扩展名
$ext = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));
if(!in_array('.'.$ext, $white)) {
die("非法文件扩展名");
}
// 重命名文件
$new_name = md5(uniqid()).'.'.$ext;
额外防护
- 上传目录设置为不可执行
- 单独配置上传目录的php.ini限制
- 定期扫描上传目录
后台权限控制
常见问题
- 直接访问后台URL无需认证
- 前后台session混用
- 权限校验不完整
正确实现方案
登录验证
session_start();
$sql = "SELECT * FROM user WHERE username=? AND password=? AND isadmin='1'";
$stmt = $pdo->prepare($sql);
$stmt->execute([$username, $password]);
if($row = $stmt->fetch()) {
$_SESSION['admin_username'] = $username;
$_SESSION['admin_token'] = bin2hex(random_bytes(32));
}
权限检查中间件
// admin_check.php
session_start();
if(empty($_SESSION['admin_username'])) {
header("Location: login.php");
exit();
}
// 每个后台页面包含此文件
require 'admin_check.php';
CSRF防护
- 使用一次性token
// 生成token $_SESSION['token'] = bin2hex(random_bytes(32)); // 验证token if($_POST['token'] !== $_SESSION['token']) { die("CSRF验证失败"); } - 重要操作使用POST请求
- 设置SameSite Cookie属性
用户评论与XSS防护
漏洞示例
// 直接输出用户输入
$comment = $_POST['text'];
echo $comment;
XSS类型
- 存储型XSS:恶意脚本存入数据库
- 反射型XSS:通过URL参数即时触发
- DOM型XSS:前端JS处理不当导致
防护措施
- HTML实体编码
echo htmlspecialchars($comment, ENT_QUOTES, 'UTF-8'); - 内容安全策略(CSP)
<meta http-equiv="Content-Security-Policy" content="default-src 'self'"> - 输入验证与过滤
$comment = preg_replace('/<script.*?>.*?<\/script>/is', '', $comment); - HTTP-only Cookie:防止JS窃取会话信息
开发安全最佳实践
- 白名单优于黑名单:只允许已知安全的内容
- 深度防御:多层防护而非依赖单一措施
- 安全框架:使用成熟的框架(Laravel, Symfony等)
- 持续学习:关注OWASP Top 10等安全资源
- 代码审计:定期进行安全代码审查
总结
安全不是功能完成后才考虑的附加项,而是开发过程中必须贯彻的基本要求。通过本文介绍的各种防护措施,开发者可以在编码阶段就消除大多数常见漏洞,构建更加健壮的Web应用。