防止SQL注入的几种方法

article/2025/9/23 12:40:17

一、什么是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=''

….其后果可想而知… 

四、应对方法

1.(简单又有效的方法)参数化Parameter

参数化处理是最简单有效的方法,它内置了处理SQL注入的能力,只要在调用查询时附加参数即可,单参数过多可能会比较繁琐

使用好处:

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

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

原理:

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

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

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

示例:

//这里使用的第三方orm dapper
var parameter = new {name=input.name,password=input.password };
string sql = "select * from Table where name=@name and password=@password ";
UserModel dto =await Db.Query<UserModel>(sql, parameter);

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

C#

bool Illegality = System.Text.RegularExpressions.Regex.IsMatch(sqlstr, "/response|\\*|-|%|\\(|\\)|group_concat|cmd|sysdate|xor|declare|db_name|char|and|or|truncate|asc|desc|drop|table|count|from|select|insert|update|delete|union|into|load_file|outfile/");

java

要引入的包:

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 &lt; inj_stra.length ; i++ ){

if (str.indexOf(inj_stra[i])&gt;=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 &lt; inj_stra.length ; i++ ){

if (str.indexOf(inj_stra[i])&gt;=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就可以 ,切记不要用拼接字符串的方法就可以了。

C#正则示例


string sqlstr="username=--";//通过下边的正则Illegality 就会返回true  根据自己的情况选择对下面关键字的过滤
bool Illegality = System.Text.RegularExpressions.Regex.IsMatch(sqlstr, "/response|\\*|-|%|\\(|\\)|group_concat|cmd|sysdate|xor|declare|db_name|char|and|or|truncate|asc|desc|drop|table|count|from|select|insert|update|delete|union|into|load_file|outfile/");

C#示例:

public bool sql_inj(String str){bool aa = true;String inj_str = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,"; String[] inj_stra = inj_str.Split('|');foreach (var item in inj_stra){if (str.IndexOf(item)>=0){return false;}}return aa;}


http://chatgpt.dhexx.cn/article/QobZ3U5E.shtml

相关文章

使用Python防止SQL注入攻击

文章目录 文章背景1. 了解Python SQL注入2. 设置数据库2.1 创建数据库2.2 构造数据创建表2.3 设置Python虚拟环境2.4 使用Python连接数据库2.5 执行查询 3. 在SQL中使用查询参数4. 使用Python SQL注入利用查询参数4.1 制作安全查询参数4.2 传递安全查询参数 5. 使用SQL组合6. 结…

php防止sql注入的方法

一.什么是SQL注入式攻击? 所谓SQL注入式攻击&#xff0c;就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串&#xff0c;欺骗服务器执行恶意的SQL命令。在某些表单中&#xff0c;用户输入的内容直接用来构造(或者影响)动态SQL命令&#xff0c;或作为存储过程的…

如何防止SQL注入攻击?

SQL注入是一种注入攻击&#xff0c;可以执行恶意SQL语句。下面本篇文章就来带大家了解一下SQL注入&#xff0c;简单介绍一下防止SQL注入攻击的方法&#xff0c;希望对大家有所帮助。 什么是SQL注入&#xff1f; SQL注入&#xff08;SQLi&#xff09;是一种注入攻击&#xff0c;…

SecureCRT 7.3软件下载及破解工具+教程

1、首先下载这两个文件&#xff1b; 2、安装scrt7.3.4&#xff0c;我这里提供的是一个32位的版本&#xff0c;64位的机器安装之后也没问题&#xff0c;在安装过程中&#xff0c;程序会提示你是否将32位的软件安装至64的操作系统&#xff0c;直接点击Continue&#xff1b; 3、是…

【51单片机】单片机仿真软件Proteus 8.7破解和汉化教程(附下载地址)

教程 进入安装包P8.7.SP3.exe&#xff0c;接受协议后next 选择Use a locally installed license key&#xff0c;next 进入激活界面&#xff0c;打开Crack包里的license.lxk并安装 默认选项&#xff0c;next 下一步选择完整安装 安装完成后不要运行&#xff0c;点击Close退出安…

软件破解注册码

写在破解之前&#xff1a;&#xff1a;&#xff1a;       软件破解的目的是&#xff1a;有些需要注册的软件&#xff0c;可是找不到注册码&#xff0c;将其破解之后&#xff0c;输入任何注册码都会提示注册成功。             声明&#xff1a;此贴适合从来没接触…

软件破解工具合集

[原文]调试工具&#xff08;Debuggers&#xff09; OllyDbg调试器 OllyDbg v1.1 一个新的动态追踪工具&#xff0c;将IDA与结合起来的思想&#xff0c;Ring 3级调试器&#xff0c;非常容易上手&#xff0c;己代替SoftICE成为当今最为流行的调试解密工具了。强烈推荐&#xff01…

软件破解基础教程

分步阅读 步骤 1 2 3 4 5 6 7 8 先教大家一些基础知识,学习破解其实是要和程序打交道的,汇编是破解程序的必备知识,但有可能部分朋友都没有学习过汇编语言,所以我就在这里叫大家一些简单实用的破解语句吧! -------------------------------------------------…

破解软件

转载&#xff1a;http://gbuy.gdcvi.com/?ArticleID19712 手把手教你破解软件&#xff0c;每一步都有图示&#xff0c;你若再不会就太XX 软件破解的目的是&#xff1a;&#xff1a;&#xff1a;有些需要注册的软件&#xff0c;可是找不到注册码&#xff0c;将其破解之后&am…

软件逆向工程:破解教程(1/24)

软件逆向工程&#xff1a;破解教程&#xff08;1/24&#xff09; 想学破解&#xff0c;花了很多时间还是没有多少进步&#xff1f;网上很多教程&#xff0c;看来看去&#xff0c;到头来还是一头雾水&#xff1f;其实&#xff0c;很正常&#xff0c;不是你的问题&#xff0c;是没…

软件破解初级实例教程(附工具附图)

最近在群里总是看到很多新朋友在问&#xff1a;1、“新手怎么学破解啊&#xff1f;”&#xff08;这是标准的伸手党&#xff0c;baidu google其实很好用&#xff09;2、“哎呀XX大牛&#xff0c;我什么基础都没有啊我不会汇编&#xff0c;不会C更不会C还不会…………总之高手会…

软件破解实例教程

破解需要的软件&#xff08;点击下载&#xff09;&#xff1a; 侦壳 language.exe 脱壳AspackDie.exe 反编译 W32Dasm黄金中文版 16进制编辑器 UltraEdit.rar 在破解之前先复习一下基础知识&#xff1a; 一.破解的等级 初级,修改程序,用ultraedit修改exe文件,称…

原码 反码 补码的简单计算附例题

原码 反码 补码 对计算机中常见数据简单分类机器数 与 真值原码反码补码扩展 对计算机常见数据的分类 机器数 就是数值在计算机中的二进制表现形式 机器数在计算机中有符号,使用 最高位表示符号 , 使用0 表示正,使用 1 表示负 一个字节8个bit位表示 5 0000 0101 -10 1…

原码反码补码移码

原码&#xff1a; 数值直接转为二进制数&#xff0c;负数的最高位 置1。 以8位为例&#xff1a; 1的原码为0000 0001&#xff0c;-1的原码为1000 0001. 127的原码为0111 1111&#xff0c;-127的原码为1111 1111. 0的原码为0000 0000&#xff0c;-0的原码为1000 0000. 反码…

二进制原码反码补码详解

二进制原码反码补码 首先我们在了解什么是原码&#xff0c;反码&#xff0c;补码之前&#xff0c;我们先来谈谈为什么需要有这些&#xff0c;只要原码不行吗&#xff1f; 答案肯定是不行的&#xff01;&#x1f61c; 因为在计算机中&#xff0c;二进制的运算对于正数之间不会出…

真值 原码 反码 补码

引言 计算机中只能做加法运算&#xff0c;它的减法是通过加法来实现的。原码&#xff0c;反码&#xff0c;补码的产生过程&#xff0c;就是为了解决计算机做减法和引入符号位的问题 真值 正数或负数的真值 → 为其绝对值对应的二进制数前面加上正号或负号 例如&#xff1a; 1 …

原码 反码 补码及应用

原码 反码 补码及应用 原码 什么是原码&#xff1f; 原码&#xff1a;十进制数据的二进制表现形式&#xff0c;最左边是符号位&#xff0c;0为正&#xff0c;1为负。 56 > 0 0111000 ​ 符号位 数据 最大值&#xff1a;01111111 > 127 最小值&#xff1a;11111111…

原码反码补码原理理解

原码反码补码原理理解 基础知识原码定义在这里&#xff0c;我们模仿一下计算机对数据运算的过程&#xff01;那么所有运算都是正确的吗&#xff1f;我们再试一组。 反码定义在这里&#xff0c;我们模仿一下计算机对数据运算的过程&#xff01;正数加负数也没问题了&#xff0c;…

java基础-原码反码补码

本文帮助理解&#xff0c;Java中原码反码补码的原理 1&#xff1a;原码反码补码&#xff0c;基础概念和计算方法 对于一个数&#xff0c;计算机需要使用一定的编码方式进行存储。原码反码补码是计算机存储一个具体数字的编码方式。 原码&#xff1a; 第一位表示符号位&…

原码反码补码习题

1、有以下变量求输出结果 signed char c 178; printf("%din",c); printf("%u\n",c); unsigned char d -9; printf("%din".d); printf("%u\n",d)&#xff1b; 并写出数据存储和取出的过程 2、求-57的原码、反码、补码 原码&am…