一、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]); // 参数自动转义

防御三件套:

  1. 永远使用PDO或MySQLi预处理
  2. 最小权限原则(数据库账号只给必要权限)
  3. 定期更新框架补丁(如Laravel的Eloquent默认防注入)

二、XSS攻击:前端里的"寄生虫"

跨站脚本攻击好比让恶意代码寄生在网页里。比如这个评论系统漏洞:

// 危险代码:直接输出未过滤内容
echo "<div>用户评论:" . $_GET['comment'] . "</div>";
// 攻击者输入: <script>stealCookie()</script>

// 防御方案:输出编码
echo "<div>用户评论:" . htmlspecialchars($_GET['comment'], ENT_QUOTES) . "</div>";
// 转义后输出: &lt;script&gt;stealCookie()&lt;/script&gt;

进阶防护:

  • 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 "系统繁忙,请稍后再试";
}

四、容易被忽视的边角漏洞

  1. 文件上传漏洞
// 错误示范:仅检查$_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);
}
  1. 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"
    

六、安全开发心法

  1. 零信任原则:所有输入都是恶意的
  2. 纵深防御:至少设置三层防护(WAF+代码层+数据库层)
  3. 定期审计:使用工具扫描依赖项(如composer audit
  4. 应急响应:建立漏洞上报通道和安全更新机制

记住:没有绝对安全的系统,但良好的编码习惯能让攻击成本大幅提高。就像锁门不一定能防专业小偷,但至少能让大多数人望而却步。