一、SQL注入:Web应用的隐形杀手
SQL注入就像给黑客留了后门钥匙。攻击者通过构造恶意SQL语句,就能直接操作你的数据库。比如下面这个典型的PHP登录漏洞(技术栈:PHP+MySQL):
// 危险写法:直接拼接用户输入
$username = $_POST['username']; // 用户输入: admin' --
$password = $_POST['password'];
$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";
// 实际执行: SELECT * FROM users WHERE username='admin' --' AND password=''
// -- 注释掉了后续条件,轻松绕过密码验证
// 安全写法:使用预处理语句
$stmt = $pdo->prepare("SELECT * FROM users WHERE username=? AND password=?");
$stmt->execute([$username, $password]); // 参数自动转义
防御三件套:
- 永远使用PDO或MySQLi预处理
- 最小权限原则(数据库账号只给必要权限)
- 定期更新框架补丁(如Laravel的Eloquent默认防注入)
二、XSS攻击:前端里的"寄生虫"
跨站脚本攻击好比让恶意代码寄生在网页里。比如这个评论系统漏洞:
// 危险代码:直接输出未过滤内容
echo "<div>用户评论:" . $_GET['comment'] . "</div>";
// 攻击者输入: <script>stealCookie()</script>
// 防御方案:输出编码
echo "<div>用户评论:" . htmlspecialchars($_GET['comment'], ENT_QUOTES) . "</div>";
// 转义后输出: <script>stealCookie()</script>
进阶防护:
- CSP策略(Content-Security-Policy头)
- 富文本使用HTML Purifier库
- 设置HttpOnly Cookie标志
三、实战中的组合拳防御
真实项目往往需要多层防护。比如电商系统的商品搜索:
// 安全示例:预处理+输出编码+速率限制
try {
// 1. 预处理防SQL注入
$stmt = $pdo->prepare("SELECT * FROM products WHERE name LIKE ?");
$stmt->execute(["%" . $_GET['q'] . "%"]);
// 2. XSS防护
foreach ($stmt->fetchAll() as $product) {
echo "<li>" . htmlspecialchars($product['name']) . "</li>";
}
// 3. 关联Redis实现API限流
$redis->incr("search:".$_SERVER['REMOTE_ADDR']);
if ($redis->get("search:".$_SERVER['REMOTE_ADDR']) > 30) {
throw new Exception("请求过于频繁");
}
} catch (Exception $e) {
// 4. 统一错误处理(避免泄露系统信息)
error_log($e->getMessage());
echo "系统繁忙,请稍后再试";
}
四、容易被忽视的边角漏洞
- 文件上传漏洞
// 错误示范:仅检查$_FILES['file']['type']
if ($_FILES['file']['type'] == 'image/jpeg') {
move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/'.$_FILES['file']['name']);
}
// 正确做法:
$finfo = new finfo(FILEINFO_MIME_TYPE);
if (in_array($finfo->file($_FILES['file']['tmp_name']), ['image/jpeg', 'image/png'])) {
$newName = bin2hex(random_bytes(16)) . '.jpg';
move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/'.$newName);
}
- CSRF防护
// 生成令牌
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
// 表单验证
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die('非法请求');
}
五、现代PHP的安全生态
- 框架自带防护:Laravel的CSRF中间件、Symfony的Security组件
- 专用工具:
- RIPS(静态代码分析工具)
- PHP-IDS(入侵检测系统)
- 服务器配置:
# 禁用危险函数 php_admin_value disable_functions "exec,passthru,shell_exec"
六、安全开发心法
- 零信任原则:所有输入都是恶意的
- 纵深防御:至少设置三层防护(WAF+代码层+数据库层)
- 定期审计:使用工具扫描依赖项(如
composer audit) - 应急响应:建立漏洞上报通道和安全更新机制
记住:没有绝对安全的系统,但良好的编码习惯能让攻击成本大幅提高。就像锁门不一定能防专业小偷,但至少能让大多数人望而却步。
评论