防止SQL注入的五种方法

2023-10-27

一、SQL注入简介

SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库。

二、SQL注入攻击的总体思路

1.寻找到SQL注入的位置

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

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

三、SQL注入攻击实例

比如在一个登录界面,要求输入用户名和密码:

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

用户名: ‘or 1 = 1 –

密 码:

点登陆,如若没有做特殊处理,那么这个非法用户就很得意的登陆进去了.(当然现在的有些语言的数据库API已经处理了这些问题)

这是为什么呢? 下面我们分析一下:

从理论上说,后台认证程序中会有如下的SQL语句:

String sql = “select * from user_table where username=

’ “+userName+” ’ and password=’ “+password+” ‘”;

当输入了上面的用户名和密码,上面的SQL语句变成:

SELECT * FROM user_table WHERE username=

‘’or 1 = 1 – and password=’’

分析SQL语句:

条件后面username=”or 1=1 用户名等于 ” 或1=1 那么这个条件一定会成功;

然后后面加两个-,这意味着注释,它将后面的语句注释,让他们不起作用,这样语句永远都能正确执行,用户轻易骗过系统,获取合法身份。

这还是比较温柔的,如果是执行

SELECT * FROM user_table WHERE

username=” ;DROP DATABASE (DB Name) –’ and password=”

….其后果可想而知…

四、应对方法

下面我针对JSP,说一下应对方法:

1.(简单又有效的方法)PreparedStatement

采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setXXX方法传值即可。

使用好处:

(1).代码的可读性和可维护性.

(2).PreparedStatement尽最大可能提高性能.

(3).最重要的一点是极大地提高了安全性.

原理:

sql注入只对sql语句的准备(编译)过程有破坏作用

而PreparedStatement已经准备好了,执行阶段只是把输入串作为数据处理,

而不再对sql语句进行解析,准备,因此也就避免了sql注入问题.

2.使用正则表达式过滤传入的参数

要引入的包:

import java.util.regex.*;

正则表达式:

private String CHECKSQL = “^(.+)\sand\s(.+)|(.+)\sor(.+)\s$”;

判断是否匹配:

Pattern.matches(CHECKSQL,targerStr);

下面是具体的正则表达式:

检测SQL meta-characters的正则表达式 :

/(\%27)|(\’)|(–)|(\%23)|(#)/ix

修正检测SQL meta-characters的正则表达式 :/((\%3D)|(=))[^\n]*((\%27)|(\’)|(–)|(\%3B)|(:))/i

典型的SQL 注入攻击的正则表达式 :/\w*((\%27)|(\’))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix

检测SQL注入,UNION查询关键字的正则表达式 :/((\%27)|(\’))union/ix(\%27)|(\’)

检测MS SQL Server SQL注入攻击的正则表达式:

/exec(\s|+)+(s|x)p\w+/ix

等等…..

3.字符串过滤

比较通用的一个方法:

(||之间的参数可以根据自己程序的需要添加)

public static boolean sql_inj(String str)

{

String inj_str = “’|and|exec|insert|select|delete|update|

count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,”;

String inj_stra[] = split(inj_str,”|”);

for (int i=0 ; i < inj_stra.length ; i++ )

{

if (str.indexOf(inj_stra[i])>=0)

{

return true;

}

}

return false;

}

4.jsp中调用该函数检查是否包函非法字符

防止SQL从URL注入:

sql_inj.java代码:

package sql_inj;

import java.net.*;

import java.io.*;

import java.sql.*;

import java.text.*;

import java.lang.String;

public class sql_inj{

public static boolean sql_inj(String str)

{

String inj_str = “’|and|exec|insert|select|delete|update|

count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,”;

//这里的东西还可以自己添加

String[] inj_stra=inj_str.split(“\|”);

for (int i=0 ; i < inj_stra.length ; i++ )

{

if (str.indexOf(inj_stra[i])>=0)

{

return true;

}

}

return false;

}

}

5.JSP页面判断代码:

使用javascript在客户端进行不安全字符屏蔽

功能介绍:检查是否含有”‘”,”\”,”/”

参数说明:要检查的字符串

返回值:0:是1:不是

函数名是

function check(a)

{

return 1;

fibdn = new Array (”‘” ,”\”,”/”);

i=fibdn.length;

j=a.length;

for (ii=0; ii<i; ii++)

{ for (jj=0; jj<j; jj++)

{ temp1=a.charAt(jj);

temp2=fibdn[ii];

if (tem’; p1==temp2)

{ return 0; }

}

}

return 1;

}

===================================

总的说来,防范一般的SQL注入只要在代码规范上下点功夫就可以了。

凡涉及到执行的SQL中有变量时,用JDBC(或者其他数据持久层)提供的如:PreparedStatement就可以 ,切记不要用拼接字符串的方法就可以了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

防止SQL注入的五种方法 的相关文章

  • [NCTF2019]SQLi:regexp正则注入

    文章目录 题目 regexp正则注入 1 模糊注入 2 布尔盲注的regexp注入 3 盲注脚本 4 使用 00进行注释 总结 收获 参考 题目 登陆框 给出后台查询语句sqlquery select from users where us
  • SQL注入时?id=1 and 1=1和?id=1 and 1=2的功能

    此文章是记录本人对知识理解的随手笔记 内容不肯定百分百正确 如有错误望指出并谅解 id 1 and 1 1 id 1 and 1 2 id 1 结论 若在GET请求中 id 1 and 1 1和 id 1 and 1 2都没有报错 则是字符
  • sqli-labs靶场第十八关

    十八关有点特殊 后台对输入的账号和密码都调用了函数进行过滤了 所以要转换注入方式 尝试去请求头里面修改信息 可以尝试cookie注入 user agent注入 refer字段注入 最终在user agent字段发现注入点 因为输入单引号或双
  • SQL注入漏洞(postgresql注入)

    以前孤陋寡闻对postgresql这个数据库少有了解 后来与几个目前在企业实习的朋友聊天才得知他们有的公司项目用的是postgresql 有的公司是正在将原本的数据库迁移到postgresql 可见postgresql比较热 毕竟免费且功能
  • sqli-labs通关大全(更新至Less60)

    sqli labs通关 less1 less10 箭雨镜屋 CSDN博客 sqli labs通关 less11 less20 箭雨镜屋 CSDN博客 sqli labs通关 less21 less30 箭雨镜屋 CSDN博客 sqli la
  • 2022年江西省中职组“网络空间安全”赛项模块B-网页渗透

    2022年中职组山西省 网络空间安全 赛项 B 10 网页渗透解析 不懂私信博主 联系方式 3260344435 一 竞赛时间 420分钟 共计7小时 吃饭一小时 二 竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第 阶段 单兵模
  • sqlmap --os-shell 使用方法

    一 burp suite抓包 如上图所示 红框处很明显是一个传参点 我们就在这个页面抓包 抓到包之后将内容保存到桌面的1000 txt文件下 二 sqlmap跑包 打开sqlmap跑包 python sqlmap py r C Users
  • sql注入详解

    sql注入详解 SQLI介绍 SQLI sql injection 我们称之为sql注入 sql Structured Query Language 叫做结构化查询语句 在我们的应用系统使用 sql 语句进行管理应用数 据库时 往往采用拼接
  • 实验吧——加了料的报错注入

    coding utf8 import requests import re def denglu username password 设置代理 用于调试过程中抓包分析 proxies http http localhost 9008 htt
  • python脚本实现sql时间盲注

    这里用sqli labs master第10关举例 1 爆数据库长度 coding utf 8 import requests import datetime import time 获取数据库名长度 def database len fo
  • 2022年江西省中职组“网络空间安全”赛项模块B-Web渗透测试

    2022年中职组山西省 网络空间安全 赛项 B 8 Web渗透测试任务书 B 8 Web渗透测试解析 不懂可以私信博主 一 竞赛时间 420分钟 共计7小时 吃饭一小时 二 竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第 阶段
  • MYSQL HTTP头部注入

    HTTP头部基础 Accept 浏览器能够处理的内容类型 Accept Charset 浏览器能够显示的字符集 Accept Encoding 浏览器能处理的压缩编码 Accept Language 浏览器当前设置的语言 Connectio
  • 如何利用SQL注入进行爆库

    SQL注入能做什么 在 SQL注入基础 一文介绍了SQL注入的基本原理和实验方法 那接下来就要问一下 SQL注入到底能什么 估计很多朋友会这样认为 利用SQL注入最多只能获取当前表中的所有记录 但无法获取其它表的内容 事实果真的如此 正像小
  • 渗透测试——万能密码与POST注入

    1 万能密码的原理 数据库没有对前端输入的参数的合法性做过率 并且账号和密码 一起输入 可以通过编写恶意语句 将用户与密码的输入结果判断为真 就实现了万能密码的登录 2 万能密码实例 查询语句select from KaTeX parse
  • SQLi-LABS(21~25a关详解)

    SQLi LABS Less 21 查看题目环境 登陆给我回显的数据是I LOVE YOU COOKIES 这题看了网上的wp才知道原来是将我们的uname和passwd都进行base64编码 表示不知道怎么看出来的 Cookie unam
  • 实验吧——认真一点!

    coding utf8 import requests import urllib 设置代理 用于调试过程中抓包分析 proxies http http localhost 9008 https http localhost 9008 he
  • Sqlmap的安装与简单使用

    一 概述 1 1 简介 sqlmap是一款开源的自动化渗透测试工具 可以扫描 发现并利用给定URL的SQL注入漏洞 检测动态页面中的get post参数 cookie http头 查看数据库数据 还可以访问文件系统 甚至能够执行操作系统命令
  • 基于Sqli-Labs靶场的SQL注入-1~4关

    less 1 Less4联合注入讲解 目录 less 1 基于字符型 单引号 注入点的联合注入 注入类型判断 猜解数据库中字段数 爆破数据库库名以及版本号 爆破数据库中的表名以及数据库安装路径 爆破某张表中的列名以及当前数据库的用户名 查询
  • sqlmap脚本tamper使用

    很多时候还是得静下来分析过滤系统到底过滤了哪些参数 该如何绕过 sqlmap中的tamper给我们带来了很多防过滤的脚本 非常实用 可能有的朋友还不知道怎样才能最有效的利用tamper脚本 当然使用脚本之前需要确定的就是系统过滤了哪些关键字
  • 基于Sql-Labs靶场的SQL注入-11~16关

    目录 Less 11 基于POST表单提交方式的字符型注入 爆破数据库名 爆破表名 爆破列名 爆破字段值 Less 12 基于POST表单提交方式的字符型注入 Less 13 基于POST表单提交方式的报错注入 爆破数据库名 爆破表名 爆破

随机推荐

  • 刷题笔记-数组---求一个数组中第三大的数

    题目 求取一个数组中第三大的数 数组中至少有一个数据 eg 输入 a 1 2 3 输出 1 第三大的数为1 输入 a 1 2 输出 2 当数组中的数据少于三个时 输出最大的数据 输入 a 1 1 3 2 3 4 输出 2 解题思路 给出的一
  • 【神经网络】神经网络架构大全剖析(附原始论文地址)

    随着新的神经网络架构不时出现 很难跟踪这些架构 知道所有缩写 DCIGN BiLSTM DCGAN anyone 起初可能有点压倒性 所以我决定编写一个包含许多这些体系结构的备忘单 这些大多数是神经网络 有些是完全不同的野兽 虽然所有这些体
  • PTA程序设计类实验辅助教学平台-基础编程题--JAVA--7.4 BCD解密

    import java util Scanner public class Main public static void main String args Scanner sc new Scanner System in
  • Listener监听器与web.xml相关配置

    Listener监听器 在JavaWeb中有个叫监听器的东西 这监听器主要用来监听三大对象 HttpServletRequest HttpSession ServletContext 每个对象对应着各自的监听器接口 监听器可以监听这三个对象
  • ORA-28547:连接服务器失败,可能是Oracle Net管理错误

    网上有很多很杂的文章 我找到一个比较可以解决这个问题的方案 分享出来 真的这个Oracle的安装 plsql的安装 虚拟机的链接 数据库的连接这两天真的能把我搞的生不能 求死不能 差点就放弃当程序员了 不过还好的是 我的一直足够坚定 其实昨
  • 【开发工具】Mac电脑彻底删除Idea(卸载)

    将应用移至废纸篓进行删除 删除缓存和日志文件 打开 终端命令行 iterm 然后使用命令行执行如下命令 上面的 xxx 对应你的电脑当前使用用户名 记得更换上面的日期版本 IntelliJIdea202x x 旧版本 cd Users xx
  • 计算机网络原理_第7章 应用层 IP地址与域名

    IP 地址由32位 即4字节 二进制组成 为书写方便起见 常将每个字节作为一段并且以十进制表示 每段间用 分隔 一 IP地址由网络标识和主机标识两部分组成 常用的IP地址有A B C三类 每类均规定了网络标识和主机标识在 32 位中所占的位
  • android app闪退原因总结分析

    存储不够 缓存过多 剩余空间不够 针对内存 后台任务太多 导致运存不够 针对运存 App和SDK版本不兼容 sdk版本明显低于app 高版本app调用低版本SDK没有的API 不同版本间API 对象或类加载器等差异导致调用异常 程序运行时异
  • IDEA+maven搭建web框架

    一 安装maven 配置环境变量 M2 HOME D maven apache maven 3 3 3 path M2 HOME bin 修改本地仓库地址 进入到apache maven 3 3 3 conf 修改settings xml文
  • GitHub热榜登顶:开源版GPT-4代码解释器,可安装任意Python库,本地终端运行

    省时查报告 专业 及时 全面的行研报告库 省时查方案 专业 及时 全面的营销策划方案库 免费下载 2023年8月份全网热门报告合集 ChatGPT提词示例 让你的ChatGPT聪明100倍 超百页干货资料 AI应用的难点 痛点与未来 202
  • 高并发与高可用知识总结

    文章目录 高并发与高可用知识总结 高并发与高可用知识总结 究竟啥才是互联网架构 高并发 一 什么是高并发 高并发 High Concurrency 是互联网分布式系统架构设计中必须考虑的因素之一 它通常是指 通过设计保证系统能够同时并行处理
  • 【接口声明与接口实现需文件分离】

    接口声明与接口实现需文件分离 定义一个ADT时 类型定义放在头文件中 类型接口的实现 一定要放在同名cpp文件中 否则就会报错 实现一定不能放在头文件中
  • ubuntu安装ROS melodic(最新、超详细图文教程)

    Ubuntu 安装 ROS ROS安装 准备 方法一 推荐 使用小鱼ROS一键安装 方法二 使用官方教程 配置rosdep 方法一 推荐 使用小鱼ROS一键安装 方法二 通过修改文件 ROS简介 ROS 是一个适用于机器人的开源的元操作系统
  • QT5.12编译MQTT

    使用mingw81 64进行编译安装 超级便捷的方法 几步即可完成 源码传送门 https github com emqx qmqtt git 打开下图编译器控制台 打开后如下图所示 步骤一 进入下载的mqtt源码目录 qtmqtt 5 1
  • C语言单链表的建立

    1 头文件 include
  • codeforce刷题 1

    1 Sequence Pair Weight 题目大意 给定一个长度为 n 的数组 a 规定 i lt j 且 ai aj 为一个数对 求数组 a 的 所有连续子序列中有多少个这样的数对 输出总数 解题思路 易得如果一个一个子序列去遍历的话
  • STM32 电机教程 4 - 直流有刷电机闭环电流控制

    前言 有刷电机是大家最早接触的一类电机 中学时物理课堂上介绍电动机也是以它为模型来展示的 有刷电机的主要结构就是定子 转子 电刷 通过旋转磁场获得转动力矩 从而输出动能 电刷与换向器不断接触摩擦 在转动中起到导电和换相作用 有刷电机采用机械
  • SpringBoot中一个空格引发的服务器崩塌

    SpringBoot中一个空格引发的服务器崩塌 在练习SpringBoot整合Thymeleaf的时候 由于一时不查 导致服务器崩塌 细究之下 原来是一个空格的原因 练习是这样的 打算在com action包下建一个UserAction c
  • 嵌入式系统中的“四个地址”

    1 物理地址 计算机在运行程序时 需要对代码指令及相关数据进行保存 而这些数据将会保存到内存 包括RAM和ROM 中 为了能够在读取数据时 可以直接找到数据的位置所在 因此 会对内存进行编号 从0开始顺序编号 直到其支持的最大存储单元 物理
  • 防止SQL注入的五种方法

    一 SQL注入简介 SQL注入是比较常见的网络攻击方式之一 它不是利用操作系统的BUG来实现攻击 而是针对程序员编程时的疏忽 通过SQL语句 实现无帐号登录 甚至篡改数据库 二 SQL注入攻击的总体思路 1 寻找到SQL注入的位置 2 判断