您的位置:首页 >带你理解什么是sql注入攻击、xss攻击和cors攻击
发布于2026-04-21 阅读(0)
扫一扫,手机访问
说到常见的Web安全风险,SQL注入绝对是个“资深元老”。简单来说,它的核心玩法就是在Web表单、查询字符串等用户输入的地方,巧妙地塞入恶意的SQL命令,最终“骗”过服务器去执行它。
任何一次成功的SQL注入,通常都离不开以下几步“标准动作”:
光说理论可能不够直观,来看一个经典的“万能密码”场景。假设有一个登录界面,需要输入用户名和密码。攻击者完全可以这么输入:
用户名: 'or 1 = 1 -- 密 码:
点击登录后,如果后端没做处理,攻击者就能大摇大摆地进去了。是不是有点匪夷所思?我们拆解一下背后的逻辑。
通常,后端的身份验证SQL语句会是这样写的:
String sql = "select * from user_table where username=' "+userName+" ' and password=' "+password+" '";
当把前面那个“特殊”的用户名和密码(其实密码为空)拼接进去后,这条SQL就变成了:
SELECT * FROM user_table WHERE username=''or 1 = 1 -- and password=''
关键就在这里了。username='' or 1=1 这个条件,因为 1=1 永远为真,所以整个WHERE子句结果也为真。后面那两个连续的减号 --,在SQL里是行注释符,意味着它把后面的 and password='' 整个给注释掉了,完全失去了过滤作用。于是,这条查询总能成功返回用户数据,非法登录就这样发生了。
参数绑定(预编译)
这是目前公认最有效、最根本的防御手段。它的原理是,使用预编译语句将SQL语句的骨架预先定义好,而用户输入的数据只被当作“参数”传递,不会被解释为SQL代码的一部分。这就从根本上切断了注入的可能。现在主流的技术框架,比如MyBatis,也明显区分了这两种方式:使用 # 符号是占位符,相当于预编译,安全;而使用 $ 是直接拼接字符串,风险很高,需要慎用。
如果说SQL注入是“骗服务器”,那么XSS(跨站脚本攻击)的核心就是“骗浏览器”。攻击者会想方设法在网页中注入恶意的客户端脚本(最常见的是Ja vaScript),当其他用户浏览这个被“污染”的页面时,嵌入的脚本就会在其浏览器中执行,从而达到盗取信息、会话劫持等目的。
通俗点讲,攻击者就是“教唆”用户的浏览器,去执行一段这个页面上本不该有的代码。
一个典型的例子就是留言板(这属于“持久型XSS”)。留言板的功能很单纯:展示用户留言。正常情况下,大家输入的都是文字。但如果有攻击者留言时输入了这样一句话:
那么,最终生成的页面HTML代码就会包含这行脚本。当下一个用户打开留言板,浏览器加载到这行代码时会怎么处理?它可分辨不出这是善意还是恶意,只会老老实实地执行,弹出一个警示框。页面结构大致会变成这样:
留言板
除了上面那种会“永久存储”在服务器上的持久型XSS,还有一种更常见的“反射型XSS”(非持久)。它通常需要诱骗用户点击一个精心构造的链接。
比如,一个正常的消息链接可能是:
//www.test.com/message.php?send=Hello,World!
而一个恶意的链接则可能是:
http://www.test.com/message.php?send=!
当用户点击这个链接,服务器将 send 参数的值(即那段脚本)直接嵌入到返回的页面中,脚本便在用户浏览器里执行了。
XSS问题产生的根源,很大程度上在于过于信任客户端提交的数据。因此,黄金法则就是:永远不要信任用户输入。所有来自客户端的数据,都必须经过严格的检查、过滤或转义处理,才能进行下一步操作。
document.cookie 读取到这些受保护的Cookie(如Session ID),从而有效防止会话被盗。, , ![]()
等危险标签。onclick, onerror, onload 等,防止事件被绑定恶意代码。需要注意的是:安全策略需要灵活应用。在某些特定场景下(比如富文本编辑器、允许用户自定义样式的板块),确实需要允许部分HTML甚至安全的Ja vaScript代码。这时候就不能“一刀切”地全部转义或过滤,而应该采用更精细的白名单策略,只允许经过验证的安全标签和属性通过。
CORS(跨域资源共享)本身是一个非常重要的W3C标准,它的出现是为了让浏览器能安全地进行跨域AJAX请求,是解决前端“同源策略”限制的正规手段。但是,如果配置不当,这项好技术也会被攻击者利用,演变成泄漏用户敏感数据的漏洞。
本质上,CORS漏洞就是攻击者利用目标网站错误的CORS配置,诱导用户浏览器发起跨域请求,从而窃取本应受同源策略保护的数据。
CORS请求主要分为两类:
当请求方法为GET、POST、HEAD之一,且HTTP头信息不超出几种固定字段(如Accept, Content-Type等)时,浏览器会直接发出CORS请求,并自动在头信息中增加一个 Origin 字段,标明请求来自哪个“源”(协议+域名+端口)。
GET /cors HTTP/1.1 Origin: http://api.bob.com Host: api.alice.com Accept-Language: en-US Connection: keep-alive User-Agent: Mozilla/5.0…
服务器收到请求后,会检查这个 Origin 值。如果允许,就在响应头中加入 Access-Control-Allow-Origin 字段(这是必须的),告诉浏览器允许哪个源访问资源。
问题就出在这个字段的值上。如果开发者图省事,将其设置为一个星号 *,就意味着“允许任何来源的网站访问本资源”。这相当于敞开了大门,攻击者可以轻易从自己控制的恶意网站上发起请求,窃取到用户在这里的敏感数据。

对于那些“不那么简单”的请求(比如用了PUT、DELETE方法,或者Content-Type是application/json),浏览器会先发一个“预检”请求(OPTIONS方法)来探路,询问服务器是否允许接下来的实际请求。只有服务器明确批准后,真正的请求才会发出。这其实增加了一道安全关卡。
要堵上CORS配置的漏洞,遵循以下几个原则至关重要:
Access-Control-Allow-Origin 设置为 *。上一篇:饿了么商家客服如何转人工
下一篇:豚豚剧如何注销账号
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9