常见的sql注入及修复方式

2 篇文章 0 订阅

常见代码疏漏

对于mysql

1.将 WHERE some_field = ‘${变量}’ 替换为 WHERE some_field = #{param}

2.将 like ‘%${变量}%’ 替换为 like concat(’%’, #{变量}, ‘%’)

3.将 like concat(’%’, ${变量}, ‘%’) 替换成 like concat(’%’, #{变量}, ‘%’)

  1. 将 WHERE some_field IN (${变量}) 替换为
WHERE `some_field` IN
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>

对于oracle:
将 like ‘%${变量}%’ 替换为 LIKE ‘%’||#{变量}||’%’

SQL中# 与$ 的区别

区别:
(1)#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是id,则解析成的sql为order by “id”。
(2)$将传入的数据直接显示生成在sql中。如:order by u s e r i d user_id userid,如果传入的值是id,则解析成的sql为order by id。
(3)#方式在很大程度上能够防止sql注入。
(4) 方 式 无 法 防 止 s q l 注 入 。 ( 5 ) 方式无法防止sql注入。 (5) sql5方式一般用于传入数据库对象,例如传入表名。(这里得注意SQL注入问题)
(6)一般能用#的就别用$。

ps:在使用mybatis中还遇到<![CDATA[]]>的用法,在该符号内的语句,将不会被当成字符串来处理,而是直接当成sql语句,比如要执行一个存储过程。

总结区别:#{} 传入值时,sql解析时,参数是带引号的,而${}穿入值,sql解析时,参数是不带引号的。

举个例子:

select * from ${table_Name} where name = #{name}

在这个例子中,如果表名为

user; delete user; --

则动态解析之后 sql 如下:

select * from user; delete user; -- where name = ?;

–之后的语句被注释掉,而原本查询用户的语句变成了查询所有用户信息+删除用户表的语句,会对数据库造成致命损伤。
但是表名用参数传递进来的时候,只能使用 ${} 。这也提醒在这种用法中要小心sql注入的问题。

防止SQL注入方法:

首先,永远不要相信用户的输入。

(1)不使用SQL,考虑NoSQL。

(2)正则表达式,字符串过滤。

(3)参数绑定PreparedStatement。

(4)使用正则表达式过滤传入的参数。

(5)JSP中调用该函数检查是否包函非法字符或JSP页面判断代码。JSP参考JSP使用过滤器防止SQL注入

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SQL注入漏洞是Web应用程序常见的安全漏洞之一,以下是SQL注入漏洞的防御及修复建议: 1. 输入验证:在Web应用程序中,所有输入数据都应该进行有效性验证和过滤,确保输入数据的合法性和安全性。包括对用户输入的特殊字符进行转义和过滤,例如单引号、双引号、反斜杠等。 2. 使用参数化查询:使用参数化查询可以有效避免SQL注入攻击。参数化查询将输入数据作为参数传递给数据库,而不是将输入数据直接拼接到SQL语句中。这样可以防止攻击者通过输入恶意SQL语句来控制数据库查询。 3. 最小权限原则:在数据库中,应该为每个应用程序用户分配最小的权限,以防止攻击者通过SQL注入攻击获取管理员权限或访问敏感数据。 4. 安全编程实践:开发人员应该掌握安全编程实践,避免编写容易受到SQL注入攻击的代码。例如,不要将输入数据直接拼接到SQL语句中,不要使用动态拼接SQL语句的方式等。 5. 安全审计和漏洞扫描:定期对Web应用程序进行安全审计和漏洞扫描,及时发现和修复SQL注入漏洞和其他安全漏洞。 6. 补丁和更新:定期更新Web应用程序和数据库的补丁和版本,确保系统和应用程序的安全性和稳定性。 以上是SQL注入漏洞的防御及修复建议,需要综合考虑应用程序的具体情况和安全需求,采取有效的措施来保护Web应用程序的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

左林右李02

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值