我在用mysql数据验证注入测试时候在文本框用户名登录输入'or 1=1 --登录失败,

我在用mysql数据验证注入测试时候在文本框用户名登录输入'or 1=1 --登录失败,,第1张

select from users where user_name=''or 1=1' and password='$password'

语句中多了个单引号,查询语句错了

前面我们介绍了主备切换流程。通过这些内容的讲解,你应该已经很清楚了:在一主一备的双 M 架构里,主备切换只需要把客户端流量切到备库;而在一主多从架构里,主备切换除了要把客户端流量切到备库外,还需要把从库接到新主库上。

主备切换有两种场景,一种是主动切换,一种是被动切换。而其中被动切换,往往是因为主库出问题了,由 HA 系统发起的。

这也就引出了本文要讨论的问题:怎么判断一个主库出问题了?

你可以学习一下如何防止MYSQL被注入。

一、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 javautilregex;

正则表达式:

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

判断是否匹配:

Patternmatches(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_stralength ; i++ )

{

if (strindexOf(inj_stra[i])>=0)

{

return true;

}

}

return false;

}

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

防止SQL从URL注入:

sql_injjava代码:

package sql_inj;

import javanet;

import javaio;

import javasql;

import javatext;

import javalangString;

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_strsplit("\\|");

for (int i=0 ; i < inj_stralength ; i++ )

{

if (strindexOf(inj_stra[i])>=0)

{

return true;

}

}

return false;

}

}

5JSP页面判断代码:

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

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

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

返回值:0:是1:不是

函数名是

function check(a)

{

return 1;

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

i=fibdnlength;

j=alength;

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

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

{ temp1=acharAt(jj);

temp2=fibdn[ii];

if (tem’; p1==temp2)

{ return 0; }

}

}

return 1;

}

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

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

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

首先,没有数据库是能够建立连接的,但这只是和mysql服务器相连,而不是和某个具体的数据库,所以,这样的连接,意义不大(不知道你用什么 *** 作mysql,所以没有给出具体连接字符串)

你如果建立好了连接,判断数据库是否存在就简单了

因为mysql中有一个数据库information_schema(这应该是你知道的),而这张数据库中有一张表schemata,是用来存储其他数据库信息的,你用

select

schema_name

from

schemata;

查询一下,所有的数据库就出来了。

ps

我不知道你用的什么和mysql相连的,所以,告诉你的都是通用的方法。如果有问题,再hi我

以上就是关于我在用mysql数据验证注入测试时候在文本框用户名登录输入'or 1=1 --登录失败,全部的内容,包括:我在用mysql数据验证注入测试时候在文本框用户名登录输入'or 1=1 --登录失败,、29 - MySQL如何判断数据库是否出了问题、避免mysql注入应该避免有哪些特殊字符等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9757885.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存