防止SQL注入

SQL注入是比较常见的网络攻击方式之一,不是BUG是编程逻辑上容易疏忽导致的潜在危险。也是比较常见的老问题了。

作为攻击方,SQL注入的总体思路是这样

        1.寻找位置,比如哪个能输入内容的地方。

        2.判断服务器类型和后台数据库类型。

        3.针对不同的服务器和数据库特点进行SQL注入攻击。

攻击例子

在登录界面里,要求输入用户名和密码:

可以这样输入实现免账号登录:

用户名: ‘or 1 = 1 --

密码:

这个是最基本简单的攻击例子,点击登录,如果没有做特殊处理那么这个非法用户就可以登录进去。(当然现在的有些语言的数据库API已经处理了这些问题)

原理是这样,正常的流程可能是:

"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 那么这个条件一定会成功;然后后面加两个-,这意味着注释,它将后面的语句注释,让他们不起作用,这样语句永远都能正确执行,用户轻易骗过系统,获取合法身份。

然后再来一个更暴力的破坏方式:

SELECT * FROM user_table WHERE username='' ;DROP DATABASE (DB Name) --' and password=''


下面是重点,怎样应对常见的SQL注入攻击(针对JSP说)

1.PreparedStatement(简单有效)

用预编译语句集,它内置了处理SQL注入的能力,具体原理可以看这个:

https://blog.csdn.net/qq_25302531/article/details/80250505

好处

  1. .代码的可读性和可维护性。
  2. PreparedStatement尽最大可能提高性能。
  3. 最重要的一点是极大地提高了安全性。

2.正则表达式、字符串过滤、非法字符、SP页面判断代码

    这些都是类似的方式,检测,排除一些字符串特征。然后直接要求用户重新输入合规的字符串进行存储和下一步。需要有耐心和细心尽可能把条件都写全,考虑完整。

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/csnd/p/12061888.html