SQL 注入攻击
SQL 注入攻击,这个是最常聊到的话题,使用过 Java 的开发人员,第一个反应就是一定要使用预编译的 PrepareStatement
什么是 SQL 注入攻击
攻击者在 HTTP 请求中注入恶意的 SQL 代码,服务器使用参数构建数据库 SQL 命令时,恶意 SQL 被一起构造,并在数据库中执行。
用户登录,输入用户名 tom,密码 'or '1' = '1' ,如果此时使用参数构造的方式,就会出现
<code>select * from user where name = 'tom' and password = '' or '1'='1'
/<code>
不管用户名和密码是什么内容,使查询出来的用户列表不为空。这里的or就是或者的意思,只要查询条件满足一条即。
现在还会存在 SQL 注入攻击么
这个问题在使用了预编译的 PrepareStatement 后,安全性得到了很大的提高,但是真实情况下,很多人并不重视,还是会留下漏洞的。举个例子,看看,大家的代码中对 sql 中 in 操作,使用了预编译,还是仍然还是通过字符串拼接呢?
如何防范 SQL 注入攻击
使用预编译的 PrepareStatement 是必须的,但是一般我们会从两个方面同时入手:
- Web 端有效性检验。限制字符串输入的长度。
- 服务端不用拼接 SQL 字符串。使用预编译的 PrepareStatement。有效性检验。(为什么服务端还要做有效性检验?第一准则,外部都是不可信的,防止攻击者绕过 Web 端请求)过滤 SQL 需要的参数中的特殊字符。比如单引号、双引号。
閱讀更多 IT猿猿 的文章