PHP 安全攻防:防 SQL 注入、XSS、CSRF 的终极方案

分类:后端开发 时间:2026-02-24 浏览:1
1

一、SQL 注入:最常见的攻击方式

1. 攻击原理

攻击者通过构造恶意 SQL 语句,篡改数据库操作,例如:

// 危险代码:直接拼接用户输入
$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id = $id";
// 攻击者传入id=1 OR 1=1,SQL变为:SELECT * FROM users WHERE id = 1 OR 1=1 → 查询所有用户
2. 解决方案:预处理语句

无论使用 mysqli 还是 PDO,都必须用预处理语句绑定参数:

// PDO方式(推荐)
$id = $_GET['id'];
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->bindParam(":id", $id, PDO::PARAM_INT);
$stmt->execute();

二、XSS 攻击:跨站脚本攻击

1. 攻击原理

攻击者在输入框中输入<script>alert('窃取cookie')</script>,若后端未过滤,前端渲染时会执行该脚本,窃取用户 Cookie、伪造操作等。

2. 解决方案
方案 1:输出时过滤
// 过滤HTML标签和特殊字符
$content = $_POST['content'];
$safeContent = htmlspecialchars($content, ENT_QUOTES, 'UTF-8');
echo $safeContent; // 输出:&lt;script&gt;alert('窃取cookie')&lt;/script&gt;
方案 2:配置 CSP 头部

在 Nginx 或 PHP 中添加 CSP(内容安全策略),限制脚本执行:

// PHP添加头部
header("Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.jsdelivr.net; style-src 'self'");

CSP 规则:仅允许加载本站资源,脚本仅允许本站和指定 CDN,禁止内联脚本。

三、CSRF 攻击:跨站请求伪造

1. 攻击原理

攻击者诱导用户点击恶意链接,利用用户已登录的身份,伪造请求执行操作(如转账、改密码)。

2. 解决方案:CSRF Token 验证
<?php
// 1. 生成Token并存储到Session
session_start();
if (!isset($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); // 生成32位随机字符串
}

// 2. 前端表单嵌入Token
echo '<form action="submit.php" method="post">';
echo '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">';
echo '<input type="text" name="content">';
echo '<button type="submit">提交</button>';
echo '</form>';

// 3. 后端验证Token
function checkCsrfToken() {
    session_start();
    if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
        die("CSRF验证失败");
    }
    // 验证通过,销毁旧Token(防止复用)
    unset($_SESSION['csrf_token']);
}

// submit.php中调用
checkCsrfToken();
// 处理表单逻辑
?>

四、其他安全防护措施

1. 密码加密:使用 password_hash ()
// 加密密码
$password = '123456';
$hash = password_hash($password, PASSWORD_DEFAULT); // 自动生成盐值

// 验证密码
$inputPassword = '123456';
if (password_verify($inputPassword, $hash)) {
    echo "密码正确";
} else {
    echo "密码错误";
}

禁止使用 md5 ($password . $salt),安全性低;password_hash () 会自动更新加密算法,更安全。

2. RBAC 权限控制
<?php
// RBAC(基于角色的访问控制)核心逻辑
class RBAC
{
    // 检查用户是否有某个权限
    public static function checkPermission($userId, $permission)
    {
        $pdo = new PDO("mysql:host=localhost;dbname=php_demo;charset=utf8", "root", "");
        // 用户→角色→权限关联查询
        $sql = "SELECT p.permission FROM permissions p
                JOIN role_permission rp ON p.id = rp.permission_id
                JOIN user_role ur ON rp.role_id = ur.role_id
                WHERE ur.user_id = ? AND p.permission = ?";
        $stmt = $pdo->prepare($sql);
        $stmt->execute([$userId, $permission]);
        return $stmt->fetch() !== false;
    }
}

// 使用示例
$userId = 1;
if (RBAC::checkPermission($userId, 'order:create')) {
    echo "有权限创建订单";
} else {
    echo "无权限";
}
?>
 
文章链接:http://www.qwkf.cn//houduan/25.html
文章标题:PHP 安全攻防:防 SQL 注入、XSS、CSRF 的终极方案

相关阅读