什么是CSRF攻击?XSS攻击?

CSRF CSRF(Cross-site request forgery跨站请求伪造,也被称为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。 你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账……造成的问题包括:个人隐私泄露以及财产安全。 从上图可以看出,要完成一次CSRF攻击,受害者必须依次完成两个步骤: 1.登录受信任网站A,并在本地生成Cookie。 2.在不登出A的情况下,访问危险网站B。 看到这里,你也许会说:“如果我不满足以上两个条件中的一个,我就不会受到CSRF的攻击”。是的,确实如此,但你不能保证以下情况不会发生: 1.你不能保证你登录了一个网站后,不再打开一个tab页面并访问另外的网站。 2.你不能保证你关闭浏览器了后,你本地的Cookie立刻过期,你上次的会话已经结束。(事实上,关闭浏览器不能结束一个会话,但大多数人都会错误的认为关闭浏览器就等于退出登录/结束会话了……) 3.上图中所谓的攻击网站,可能本身并不是一个恶意网站,只是自身存在漏洞被别人利用了而已。 XSS漏洞 跨站脚本攻击(Cross Site Scripting),恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。 比如说有这样一种场景:我们有一个a页面,a页面中有一个前台表单,表单内容接受用户输入的用户名和密码。然后我们在b页面中打印出用户在a页面中输入的内容。如果用户正常输入,那么当然没问题。但是如果用户输入的是一段css代码或者javascript代码会发生什么?比如用户输入<script>alert("攻击你");</script> 那么,在b页面中就会弹出对话框。这就是简单的xss攻击。 漏洞的解决 1、防止csrf攻击: 第一种方式:验证 HTTP Referer 字段 根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一个网站,比如用户在淘宝买东西,我们需要在他下单的时候检测是不是用户本人进行的操作,那么我们可以通过查看http请求带过来的referer是不是www.taobao.com信任的URL。但是这种方式并不是绝对安全的,为什么这么说呢,问题就在于我们凭什么能相信referer呢?什么情况下这个referer会有问题呢?其实,虽然http协议有规定,但是每个浏览器对referer的实现方式都是不一样的,如果,某个浏览器本身就是不安全的,那么他提供给我们的referer就不是安全的。 第二种方式:在请求地址中添加 token 并验证 CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 cookie 中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的 cookie 来通过安全验证。要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。 这种方法要比检查 Referer 要安全一些,token 可以在用户登陆后产生并放于 session 之中,然后在每次请求时把 token 从 session 中拿出,与请求中的 token 进行比对,但这种方法的难点在于如何把 token 以参数的形式加入请求。对于 GET 请求,token 将附在请求地址之后,这样 URL 就变成 http://url?csrftoken=tokenvalue。 而对于 POST 请求来说,要在 form 的最后加上 <input type=”hidden” name=”csrftoken” value=”tokenvalue”/>,这样就把 token 以参数的形式加入请求了。但是,在一个网站中,可以接受请求的地方非常多,要对于每一个请求都加上 token 是很麻烦的,并且很容易漏掉,通常使用的方法就是在每次页面加载时,使用 javascript 遍历整个 dom 树,对于 dom 中所有的 a 和 form 标签后加入 token。这样可以解决大部分的请求,但是对于在页面加载之后动态生成的 html 代码,这种方法就没有作用,还需要程序员在编码时手动添加 token。 ...

March 22, 2026 · 1 min · santu

什么是DDoS攻击?如何防止被攻击?

典型回答 分布式拒绝服务(DDoS:Distributed Denial of Service)攻击,是指攻击者利用大量“肉鸡”对攻击目标发动大量的正常或非正常请求、耗尽目标主机资源或网络资源,从而使被攻击的主机不能为正常用户提供服务。 扩展知识 DoS DoS(拒绝服务,Denial of Service)就是利用合理的服务请求来占用过多的服务资源,从而使合法用户无法得到服务的响应。这是早期非常基本的网络攻击方式。 举一个简单的例子,小王开了一家商店,店面不大,加上小王一共有三个服务员。由于他们这里物美价廉,工作人员的态度又比较友善,所以慢慢的生意越来越好。 但是,这家店所在的小镇上有一个恶霸,恶霸看到小王的店很赚钱,于是想要通过一些下作的手段谋取私利。于是他装扮成普通的顾客,在小王的店里有一搭无一搭的总和店员攀谈,问问这个多少钱,问问那个怎么卖,还时不时的给店员提供一些虚假信息,比如哪里缺货了之类的信息。使店员们都被他搞的团团转。 由于恶霸是装作普通顾客的,小王和店员们又不能彻底不理他,所以就要分出一些精力来服务他,但是由于店内的服务员有限。这样一来,很多其他的顾客就可能受到了冷落。 虽然恶霸的行为是恶意的,但是他在店内的是一个普通顾客,他的咨询价格之类的行为也都是合理的。但是由于他频繁询问,长时间霸占服务员的时间。这就导致店铺的其他用户体验有所下降。 对于网站来说,其实也是一样的,网站就像是小王的商店一样。对于一个网站来说,他是要搭建在服务器上面的,而由于硬件资源有限,所以服务能力也是有限的。如果有人频繁访问或者长时间占用资源,就会导致其他用户的体验有所下降。 这种,利用合理的服务请求来占用过多的服务资源,从而使合法用户无法得到服务的响应的行为,就是DoS攻击。 在信息安全的三要素——保密性、完整性和可用性中,DoS针对的目标正是可用性。该攻击方式利用目标系统网络服务功能缺陷或者直接消耗其系统资源,使得该目标系统无法提供正常的服务。 DDoS 如果只是一个恶霸的话,只要能够识别出来,然后阻止他进入店铺就行了。 随着恶霸被发现之后,他也想了一个办法,这次他不再自己一个人跑去店里捣乱了,而是纠集了一群无赖,而这些无赖每天都换,店铺里面的服务员根本识别不出来到底谁是恶霸派来的。 无赖们扮作普通客户一直拥挤在商场,赖着不走,真正的购物者却无法进入;或者总是和营业员有一搭没一搭的东扯西扯,让工作人员不能正常服务客户;也可以为商铺的经营者提供虚假信息,商铺的上上下下忙成一团之后却发现都是一场空,最终跑了真正的大客户,损失惨重。一个无赖去胡闹,就是 DoS攻击,而一群无赖去胡闹,就是 DDoS攻击。 一般来说,DDoS 攻击可以具体分成两种形式:带宽消耗型以及资源消耗型。它们都是透过大量合法或伪造的请求占用大量网络以及器材资源,以达到瘫痪网络以及系统的目的。 DDoS的危害 当服务器被DDos攻击时,一般会出现以下现象: 被攻击主机上有大量等待的TCP连接; 网络中充斥着大量的无用的数据包; 受害主机无法正常和外界通讯; 受害主机无法处理所有正常请求; 严重时会造成系统死机。 对于用户来说,在常见的现象就是网站无法访问。 DDoS的防范 为了对抗 DDoS攻击,你需要对攻击时发生了什么有一个清楚的理解。简单来讲,DDoS 攻击可以通过利用服务器上的漏洞,或者消耗服务器上的资源(例如 内存、硬盘等等)来达到目的。 一般来说,可以用以下办法防范: 1、如果可以识别出攻击源,如机器IP等,可以在防火墙服务器上放置一份 ACL(访问控制列表) 来阻断这些来自这些 IP 的访问。 2、对于带宽消耗型攻击,最有效的办法那就是增加带宽。 3、提高服务器的服务能力,增加负载均衡,多地部署等。 4、优化资源使用提高 web server 的负载能力。例如,使用 apache 可以安装 apachebooster 插件,该插件与 varnish 和 nginx 集成,可以应对突增的流量和内存占用。 5、使用高可扩展性的 DNS 设备来保护针对 DNS 的 DDOS 攻击。可以考虑购买 Cloudflare 的商业解决方案,它可以提供针对 DNS 或 TCP/IP3 到7层的 DDOS 攻击保护。 ...

March 22, 2026 · 1 min · santu

什么是DNS污染?DNS劫持?

DNS污染是指当一个DNS服务器被恶意修改或替换,导致该服务器不再返回正确的DNS记录,而是返回错误的记录,从而将用户错误地导向到恶意站点。 有些时候,DNS污染是官方行为,目的是不让普通用户访问某些固定的网站。 DNS劫持是指当一个攻击者截获DNS请求,并代替正确的DNS服务器,提供不正确的DNS记录,从而将用户错误地导向到恶意站点。 有些时候,DNS劫持可能是运营商做的,比如把用户重定向到广告网站等。 如何防止DNS污染和DNS劫持呢? 完全避免DNS污染和DNS劫持是不可能的,可以通过以下手段尽量避免: 使用安全的DNS服务商:选择一个可靠的DNS服务商,以确保DNS请求的安全。 使用DNSSEC:DNSSEC是一种安全扩展,它可以确保DNS查询不被篡改,从而防止DNS劫持。 设置静态DNS:设置静态DNS在DNS更换或DNS污染时,可以防止DNS请求被重定向到错误的地址。 使用VPN:使用VPN,可以保护您的网络连接,防止攻击者对您的DNS通信进行污染或劫持。 定期更新软件:定期更新您的操作系统和浏览器软件,可以防止漏洞被攻击者利用。

March 22, 2026 · 1 min · santu

MD5是加密算法吗?绝对安全吗?

典型回答 MD5是一种散列函数,用于生成一个固定长度,固定值的摘要信息。 MD5是一种消息摘要算法,不是加密算法。它的作用是对原始数据进行一种压缩,以生成一个固定长度的字符串作为该数据的数字指纹,以验证数据的完整性和一致性。 加密算法需要加密和解密,MD5是单向的,不可逆,所以是无法通过解密得到原始数据的。 但是,MD5算法不是绝对安全的。由于MD5算法生成的哈希值长度是固定的,所以存在"碰撞“的情况,即两个不同的消息生成的哈希值是相同的,所以如果用于数据安全的场合,MD5算法是不能保证安全的。 因此,对于对安全性要求更高的场合,可以使用更安全的哈希算法,例如SHA-256或更高版本的哈希算法。 扩展知识 SHA-256 SHA-256是一种密码散列函数,常被用于对数据进行签名或生成信息摘要。 与其他散列算法一样,SHA-256在进行操作时不能逆向解密。SHA-256生成的消息摘要长度为256位,这使得其非常适合于加密数字签名。 SHA-256是SHA-2系列中最常用的散列算法,也是最可靠的。 为什么不会碰撞? 因为SHA-256在生成消息摘要时,使用了大量的位运算、逻辑运算和移位运算等,并且消息摘要长度非常长,因此生成的消息摘要具有很强的随机性。在实际应用中,发生碰撞的概率极低,几乎不可能发生。因此,SHA-256是一种可靠的安全哈希算法。

March 22, 2026 · 1 min · santu

什么是水平越权?如何防止

典型回答 水平越权(水平权限漏洞):是指攻击者尝试访问与当前用户具有相同权限的其他用户资源。 如:用户管理系统中,可以通过uid查询用户信息(包括用户手机号、家庭住址等敏感信息),且uid为数据库自增主键。此时攻击者可用自己的uid向下递减或向上递增试探性查询其他用户信息,导致用户信息泄露。 防范方法:无限增大攻击者攻击成本,包括不限于: 参数以post方式提交,攻击者需要抓包才能看到参数 关键参数进行加密混淆(主要手段) 限制ip、当前uid在单位时间内的请求频次 主要字段,如uid,避免用自增ID生成。 但是,其实有一种非常简单且实用的方法,那就是不管任何数据的查询,都要带上用户id去查询,同时,这个用户id我们不相信前端传过来的,而是直接在后端代码中去session中获取。这样就能非常有效的避免水平越权。 比如说用户想要查看不属于自己的订单,那么在查询订单的接口中,先通过session查询出当前用户id,再去查询订单表的时候,把这个用户id当做where条件去查询,就能避免查询到不属于自己的订单了。 扩展知识 加密混淆 以用户信息管理uid横向越权为例,如何对uid进行加密混淆? 基本思路:由于是查询接口,可以对uid直接进行对称加密,客户端或浏览器只要拿到加密后的密文提交查询请求即可,不需要知道uid明文是什么。服务端可以通过存储在服务器上的私钥进行解密拿到uid明文去查询数据库。 方案1(不可行):使用散列算法,如md5,会导致uid不可逆,无法直接拿到数据库中查询。由于md5是32位或16位,攻击者也很容易观察出密文采用何种算法。 注意:md5用于生成摘要信息,并不是用来加密的。 方案2(可行):使用对称加密,如AES,服务端存储私钥,对uid加密后下发。查询接口携带密文,服务端通过私钥解密出明文uid,查询数据库即可。 方案3(推荐):使用对称加密后,密文固定且通常会很长,如: 1 2 明文uid为1,私钥为123456,AES加密后密文为: U2FsdGVkX1/fFmiULJXOvhkdWdBZLnf2Nw3UyFdF60g= 对于请求参数,要保证简单原则。同时如果能让每次请求uid密文变化,显然会大幅度增加攻击者的识别成本。 这里推荐开源的Sqids算法,官网链接。 该算法本质是将一系列整数散列成一个字符串,并通过指定字符表的方式对散列进行多次打乱,确保不会被碰撞,且保证加密出的密文非常简短(同样是hash算法,md5可能出现碰撞且密文较长)。 我们可以把uid+下发uid密文时的请求时间戳组合起来进行散列,这样确保了每次同一个uid其密文都不一样。客户端提交上来的密文,可以解出uid明文和时间戳。 使用方法: 1 2 3 4 5 6 // maven引入坐标 <dependency> <groupId>org.sqids</groupId> <artifactId>sqids_3</artifactId> <version>0.5.0</version> </dependency> 1 2 3 4 5 6 7 8 // 创建sqids对象 SqidsOptions options=new SqidsOptions(); options.Alphabet="TGEpuRNDVtYvISsh34jz5c1db8eoPin6CJUgQwMAmLK9Farl2fW0OyHxqXkBZ7"; //指定字符表,确保密文不会被碰撞 Sqids sqids=new Sqids(options); // 加密 String id=sqids.encode(Arrays.asList(1L,1696867066L)); //假设uid为1,时间戳为1696867066,加密后的密文为 W8mmdRiM6 // 解密 List<Long> numbers=sqids.decode(id); // 解密结果为[1, 1696867066]

March 22, 2026 · 1 min · santu

加密&解密、加签&验签做的事情一样吗?

典型回答 当我们在和外部机构进行接口交互的时候,需要做加解密及加签验签。那么他们有什么区别呢? ✅和其他公司做数据交互时,有什么需要注意的? 加密&解密 目的:加密的主要目的是保护数据的隐私性,即确保即使数据泄露了,别人也只能拿到密文。 加密(Encryption):将明文数据转换为无法读取的密文,通常使用密钥进行加密。只有拥有正确密钥的人才能解密密文以恢复原始数据。 解密(Decryption):使用相应的密钥将密文转换回原始的明文数据。 加密算法可以是对称加密(使用相同的密钥进行加密和解密)或非对称加密(使用一对公钥和私钥,其中一个用于加密,另一个用于解密)。 ✅对称加密和非对称加密有什么区别? 加签&验签 目的:加签的主要目的是保证数据的完整性和来源的真实性,即确保数据在传输过程中未被篡改,并且能验证数据来自于声称的发送者。 加签(Signing):使用发送者的私钥对数据(通常是数据的散列值,而不是数据本身)进行加密,生成数字签名。这个签名随数据一起发送给接收者。 验签(Verification):接收者使用发送者的公钥来解密数字签名,如果解密后的散列值与接收者自己计算的数据的散列值一致,则证明数据未被篡改,并且签名确实是发送者生成的。 所以,二者的主要区别就是在作用上了。加密是为了保护数据的隐私性,而数字签名是为了保证数据的完整性和来源的认证。

March 22, 2026 · 1 min · santu

什么是SQL注入攻击?如何防止

典型回答 SQL注入是一种常见的网络安全漏洞,攻击者通过在应用程序的用户输入中插入恶意的SQL代码,试图欺骗数据库执行非预期的查询。 SQL注入导致对数据库的未经授权的访问、数据泄露、数据破坏,甚至完整的数据库被攻陷。 攻击者常常通过在用户输入中注入SQL代码,改变应用程序对数据库的查询语句,以实现他们的恶意目的。 假设有一个简单的登录系统,根据用户提供的用户名和密码进行身份验证。应用程序可能会使用以下类似的SQL查询来检查用户是否存在: 1 2 3 String query = "SELECT * FROM users WHERE username='" + userInputUsername + "' AND password='" + userInputPassword + "'"; 在这个查询中,userInputUsername 和 userInputPassword 是从用户输入中获取的值。如果应用程序不正确处理这些输入,它可能容易受到SQL注入攻击。 考虑以下情况,攻击者在用户名和密码字段中输入了恶意的字符串: 1 2 Username: ' OR '1'='1' -- Password: ' OR '1'='1' -- 将这些值代入原始的SQL查询,得到的查询变成了: 1 SELECT * FROM users WHERE username='' OR '1'='1' --' AND password='' OR '1'='1' -- 在注入的SQL中,使用-- 来注释掉他后面的代码,那么我们原来的查询,就会返回用户表中的所有记录,因为 '1'='1' 是一个始终为true的条件。 如上,攻击者可以通过注入这样的恶意字符串绕过身份验证,获得对应用程序中所有用户的访问权限,甚至执行其他恶意操作。 如果还只是查询的话影响还不大,万一是一个delete操作被注入了,就可能会导致数据被攻击而导致删除。如以下被注入后的SQL: 1 DELETE FROM users WHERE username='' OR 1=1; --' 扩展知识 如何防止被SQL注入 使用预编译语句: 使用预编译的语句或参数化的语句,而不是通过字符串拼接构建SQL查询。这样可以防止攻击者通过在用户输入中插入恶意代码来改变SQL查询的结构。 ...

March 22, 2026 · 1 min · santu

什么是中间人攻击?

中间人攻击(Man-in-the-middle attack,缩写:MITM)在密码学和计算机安全领域中是指攻击者与通讯的两端分别创建独立的联系,并交换其所收到的数据,使通讯的两端认为他们正在通过一个私密的连接与对方直接对话,但事实上整个会话都被攻击者完全控制。 整个过程如下: 1.服务器向客户端发送公钥,中间人截获公钥 2.中间人伪造身份,骗取服务端的私钥 3.中间人冒充服务端与客户端通信,并骗取客户端公钥与私钥 4.中间人冒充客户端端与服务端通信 5.中间人冒充服务端与客户端通信 主要过程就是中间人通过拦截正常的网络通信数据,并进行数据篡改,而通信的双方却毫不知情。 中间人攻击是一种比较常见的攻击手段,根据攻击的方式不同,可以分成以下几种: **Wi-Fi欺骗:**攻击者可以创建与本地免费Wi-Fi同名的虚假Wi-Fi接入点(AP)。 例如,在上例的咖啡馆中,攻击者会模仿创建一个和墙上贴着Wi-Fi信息同名“Guest Wi-Fi”。一旦您连接上去,您的一切在线网络行为,将尽在攻击者的监控和掌握之中。 **HTTPS欺骗:**攻击者通过欺骗您的浏览器,使您认为自己访问的是可信任站点。 当您输入与该站点相关的登录凭据时,您的流量将被重定向到攻击者自建的非安全站点处。 **SSL劫持:**通常,当您尝试连接或访问不安全的HTTP://站点时,您的浏览器会自己将您重定向到安全的HTTPS://处。 此时,攻击者则可以劫持该重定向的过程,将指向其自建服务器的链接植入其中,进而窃取您的敏感数据、以及输入的所有信任凭据。 **DNS欺骗:**为了准确地浏览到目标网站,域名系统会将地址栏中的URL,从人类易于识别的文本格式,转换为计算机易于识别的IP地址。 然而,DNS欺骗则会迫使您的浏览器,在攻击者的控制下,发生转换异常,而去访问那些被伪造的地址。 **电子邮件劫持:**如果攻击者获得了受信任机构(例如银行)的邮箱、甚至是邮件服务器的访问权限,那么他们就能够拦截包含敏感信息的客户电子邮件,甚至以该机构的身份发送各种电子邮件。

March 22, 2026 · 1 min · santu

什么是撞库、拖库和洗库?

典型回答 **”撞库”**是黑客通过收集互联网已泄露的用户和密码信息,生成对应的字典表,尝试批量登陆其他网站后,得到一系列可以登录的用户。 很多用户在不同网站使用的是相同的帐号密码,因此黑客可以通过获取用户在A网站的账户从而尝试登录B网址,这就可以理解为撞库攻击。 说的简单一点,就是一个小偷,入室盗窃后偷到了一串钥匙,然后他拿着这串钥匙,在整个小区里面挨家挨户的进行开锁。这个过程就是撞库。 **“拖库”**本来是数据库领域的术语,指从数据库中导出数据。到了黑客攻击泛滥的今天,它被用来指网站遭到入侵后,黑客窃取其数据库。 黑客通过技术手段窃取数据库的过程叫做拖库。就像小偷偷东西是一样的。 “拖库”的通常步骤为: 1、黑客对目标网站进行扫描,查找其存在的漏洞,常见漏洞包括SQL注入、文件上传漏洞等。(小偷蹲点) 2、通过该漏洞在网站服务器上建立“后门(webshell)”,通过该后门获取服务器操作系统的权限。(小偷想办法进入室内) 3、利用系统权限直接下载备份数据库,或查找数据库链接,将其导出到本地。(小偷盗走值钱的东西) 小偷想要入室盗窃的前提就是可以入室,那么,在互联网中,黑客一般都是利用网站自身存在的漏洞来入侵的。 最常见的网站入侵的方式就是黑客利用网站的漏洞来对网站进行攻击。这里说的网站漏洞包括网站应用自身的漏洞、网站使用的WEB服务器的漏洞、网站使用的开源框架中的漏洞、网站使用的数据库漏洞等。 比如,如果应用自身没有做防SQL注入、存在文件上传漏洞等,就极大可能被黑客入侵。 黑客还有可能会利用系统漏洞,在特定的网站上进行挂马,如果网站管理员在维护系统的时候不小心访问到这些网站,就可能被植入木马,也会引发后续的拖库风险。 “洗库”,属于黑客入侵的一种,就是黑客入侵网站,通过技术手段将有价值的用户数据归纳分析,售卖变现。 说的简单一点,就是一个小偷,入室盗窃后偷到了很多东西,他对这些赃物分类,然后进行销赃的过程。

March 22, 2026 · 1 min · santu

为什么预编译可以避免SQL注入?

典型回答 数据库的预编译(Prepared Statement)是一种数据库查询优化技术,在预编译中,可以先先提交带占位符的 SQL ,MySQL 先将其编译好,然后用户再拿着SQL中定义的占位符对应的参数让 MySQL 去执行。 当一个SQL被预编译之后,预编译的SQL模板中的占位符,比如问号(?),是作为参数的位置标记存在的,而不是作为SQL语句的一部分。无论用户输入什么样的参数,这些参数都会被视为数据,而不会被解释为SQL语句的一部分。 也就是说,用户输入的恶意代码会被当作普通的数据处理,而不会被解释为SQL语句的一部分。如果恶意注入的内容打破了SQL语句的语法结构,数据库可能会在执行阶段产生语法错误,导致查询无法成功执行。这实际上是数据库系统试图解析预编译模板时的结果,因为预编译模板本身的语法是固定的。 举一个简单的例子,加入我们有一个原始SQL: 1 2 // 原始查询模板 $sql = "SELECT * FROM users WHERE username = ?"; 当用户输入恶意代码尝试进行SQL注入: 1 $userInput = "hollis'; DROP TABLE users; --"; 用户期望最终这个SQL变成: 1 SELECT * FROM users WHERE username = 'hollis'; DROP TABLE users; --' 会导致数据表被删除。那么,如果用了预编译之后,就不会出现这种问题了。 预编译过程如下: 1 2 3 4 5 PREPARE stmt FROM 'SELECT * FROM users WHERE username = ?'; EXECUTE stmt USING @userInput; DEALLOCATE PREPARE stmt; 语法参考: https://dev.mysql.com/doc/refman/8.0/en/sql-prepared-statements.html ...

March 22, 2026 · 1 min · santu

留言给博主