通用的防止SQL注入代码

新建sqllin.asp网页文件,编写以下代码检查POST和GET方式提交的所有数据,如果发现有过滤字符,则显示弹出对话框,并中断程序的运行

<%
Dim   SQL_Post,SQL_Get,strFilter,aFilter,i
strFilter=" |;|and|(|)|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare" 
aFilter=split(strFilter,"|") 
If Request.Form<>"" Then  检查POST方式提交的数据
 For Each SQL_Post In Request.Form 
  For i=0 To Ubound(aFilter) 
  If Instr(LCase(Request.Form(SQL_Post)),aFilter(i))<>0 Then 
    此处可添加保存恶意攻击者的信息到数据库
   str=str & "<Script Language=JavaScript>"
   str=str & "alert( 请不要在参数中包含非法字符尝试注入攻击本站!/n/n"
   str=str & "本站已经记录了您的以下数据:/n/n"
   str=str & "操作IP:" & Request.ServerVariables("REMOTE_ADDR")&"/n/n"
   str=str & "操作时间:"& Now & "/n/n"
   str=str & "操作页面:"&Request.ServerVariables("URL")&"/n/n"
   str=str & "提交方式:POST/n/n"
   str=str & "提交参数:"& SQL_Post &"/n/n"
   str=str & "提交数据:"& Request.Form(SQL_Post)
   str=str & "</script>"
   Response.Write str
   Response.End
  End If 
  Next 
 Next 
End If 

If Request.QueryString<>"" Then  检查GET方式提交的数据
 For Each SQL_Get In Request.QueryString 
  For i=0 To Ubound(aFilter) 
  If Instr(LCase(Request.QueryString(SQL_Get)),aFilter(i))<>0 Then 
    此处可添加保存恶意攻击者的信息到数据库
   str= "<Script Language=JavaScript>"
   str=str & "alert( 请不要在参数中包含非法字符尝试注入攻击本站!/n/n"
   str=str & "本站已经记录了您的以下数据:/n/n"
   str=str & "操作IP:" & Request.ServerVariables("REMOTE_ADDR")&"/n/n"
   str=str & "操作时间:"& Now & "/n/n"
   str=str & "操作页面:"&Request.ServerVariables("URL")&"/n/n"
   str=str & "提交方式:GET/n/n"
   str=str & "提交参数:" & SQL_Post &"/n/n"
   str=str & "提交数据:" & Request.QueryString(SQL_Get) & " );"
   str=str & "</script>"
   Response.Write str
   Response.End
  End   If 
  Next 
 Next 
End If    
%>

在过滤字符串strFilter中可根据需要进行添加

在处理用户提交数据的页面首部包含sqlin.asp文件即可

<!--#include file=sqllin.asp-->

 

 

### ### 使用参数化查询防止 SQL 注入 在 Java 中,最有效的防止 SQL 注入的方法是使用 `PreparedStatement` 进行参数化查询。这种方式通过将用户输入作为参数绑定到预编译的 SQL 语句中,而不是直接拼接 SQL 字符串,从而避免恶意输入破坏 SQL 结构 [^2]。例如: ```java String sql = "SELECT * FROM users WHERE userid = ?"; try (Connection conn = dataSource.getConnection(); PreparedStatement stmt = conn.prepareStatement(sql)) { stmt.setString(1, userid); // 安全地绑定参数 ResultSet rs = stmt.executeQuery(); } ``` ### ### 避免使用字符串拼接 SQL 语句 手动拼接 SQL 查询字符串是非常危险的做法,容易导致 SQL 注入漏洞。例如以下代码存在注入风险: ```java String query = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'"; Statement stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery(query); // 存在 SQL 注入风险 ``` 如果攻击者传入恶意构造的用户名或密码,可能导致数据库执行非预期的 SQL 操作 [^2]。 ### ### 在 ORM 框架中使用安全的参数占位符 对于使用 MyBatis 等 ORM 框架的情况,应优先使用 `#{}` 占位符来传递参数,而非 `${}`。`#{}` 会自动对参数进行预编译处理,而 `${}` 则是直接替换为原始值,容易引发 SQL 注入问题 [^4]。例如: ```xml <select id="selectUser" resultType="User"> SELECT * FROM users WHERE userid = #{userid} <!-- 推荐做法 --> </select> ``` ### ### 对输入数据进行校验和过滤 除了使用参数化查询外,还应对所有外部输入进行严格的验证。例如,对于数字类型的字段,确保输入为合法数字;对于字符串类型字段,限制特殊字符的使用。可以结合正则表达式进行格式校验,以增强安全性 [^1]。 ### ### 使用数据库连接池的安全特性 某些数据库连接池(如 Druid)提供了内置的 SQL 过滤功能,可以在一定程度上检测并拦截可疑的 SQL 输入。虽然这类机制不能完全替代参数化查询,但可以作为辅助护手段,在复杂场景下提供额外保障 [^4]。 ### ### 使用存储过程封装 SQL 逻辑 在特定业务场景中,可将 SQL 操作封装在数据库存储过程中,并通过参数化方式调用。由于存储过程内部逻辑固定,且参数通常经过严格校验,因此能有效降低 SQL 注入的可能性。 ### ### 引入安全框架与工具库 还可以借助 OWASP 提供的 SQL 注入御指南等资源,参考其推荐的最佳实践。此外,一些第三方库也提供了 SQL 注入护的功能,可用于增强应用的整体安全性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值