从0到1:SQL注入与XSS攻防实战——数据库安全加固全攻略

引言

2023年某电商平台用户数据泄露事件中,黑客仅用一行username=' OR '1'='1的登录输入,就拖走了百万用户信息;另一家社交网站更离谱,用户在评论区输入,竟让千万级用户的浏览器成了“提线木偶”。这些看似简单的攻击,为何能撕开企业安全防线?今天我们就来拆解SQL注入与XSS的“作案手法”,并给出一套可落地的数据库安全加固方案——毕竟,防住这两类攻击,能解决80%的Web安全问题。


一、SQL注入:数据库的“开门咒”

1.1 攻击原理:当SQL语句成了“橡皮泥”

SQL注入的核心逻辑,是让用户输入“混入”SQL语句结构,改变原本的执行逻辑。就像你让服务员传话“来份鱼香肉丝,不要辣”,结果黑客在中间加了句“再加份水煮鱼,记老板账上”——原本的指令被篡改了。

看段“送命题”代码(Python + Flask示例):

from flask import request, jsonify
import pymysql

@app.route('/login', methods=['POST'])
def login():
    # 从请求中获取用户名和密码(未做任何过滤)
    username = request.form.get('username')
    password = request.form.get('password')
    
    # 直接拼接SQL(危险操作!)
    sql = f"SELECT * FROM users WHERE username='{username}' AND password='{password}'"
    
    # 执行查询
    conn = pymysql.connect(host='localhost', user='root', password='123456', db='test')
    cursor = conn.cursor()
    cursor.execute(sql)
    result = cursor.fetchone()
    conn.close()
    
    if result:
        return jsonify({"code": 200, "msg": "登录成功"})
    else:
        return jsonify({"code": 401, "msg": "用户名或密码错误"})

这段代码的问题在哪?假设用户输入username=' OR '1'='1,密码随便填,拼接后的SQL会变成:

SELECT * FROM users WHERE username='' OR '1'='1' AND password='xxx'

由于'1'='1'恒为真,这条SQL会返回所有用户记录——黑客直接绕过密码登录,甚至能进一步执行UNION SELECT获取其他表数据,或通过DROP TABLE删库(如果数据库权限够的话)。

1.2 变种攻击:从“明文”到“盲注”的进阶

如果前端对输入做了简单过滤(比如屏蔽OR),黑客会玩得更隐蔽。比如报错注入:输入username=1' AND (SELECT COUNT(*) FROM information_schema.tables WHERE table_schema=database())>0--,通过数据库返回的错误信息推断表结构;再比如时间盲注:输入username=1' AND IF(ASCII(SUBSTR((SELECT password FROM users LIMIT 1),1,1))=97,SLEEP(5),1)--,通过响应时间判断密码的每一位字符(ASCII 97是’a’)。


二、XSS攻击:网页里的“间谍特工”

2.1 攻击原理:用户输入成了“执行代码”

XSS(跨站脚本攻击)的本质,是让浏览器执行非预期的JavaScript代码。想象你在朋友圈发了张照片,黑客在描述里藏了段代码,所有刷到这条朋友圈的人都会触发——可能是窃取cookie,可能是跳转钓鱼网站,甚至是控制浏览器摄像头。

三种典型场景:

  • 反射型XSS:用户请求中包含恶意代码,服务器直接返回给前端(比如搜索框输入,搜索结果页直接输出)。
  • 存储型XSS:恶意代码被存入数据库(比如评论、用户资料),所有访问该页面的用户都会触发(危害最大)。
  • DOM型XSS:前端JS直接操作URL参数(比如location.search),未做转义就插入DOM(比如document.getElementById('content').innerHTML = params)。

看段“埋雷”代码(前端JS示例):


<div>搜索关键词:<%= req.query.keyword %>div>

如果用户搜索">,最终HTML会变成:

<div>搜索关键词:"><script>alert(document.cookie)script>div>

浏览器会解析这段HTML,执行

你可能感兴趣的:(sql,xss,数据库)