万能密码 'or'='or'如何防

作者&投稿:郟雯 (若有异议请与网页底部的电邮联系)
网站用户名密码'or'='or'万能用户名密码怎么防~

用户名和密码分开验证,
set rs = server.createobject("adodb.recordset")
rs.open "select * from admin where 用户名 = '"&name&"' ",conn,1,
if rs.eof then
错误提示:用户名错
处理代友码。。。
end if
if rs("密码")输入密码 then
错误提示:密码错
处理代码
end if

将以下代码放入conn.asp文件就行了
"" thenChk_badword=split(Query_Badword,"∥")FOR EACH Query_Name IN Request.QueryStringfor i=0 to ubound(Chk_badword)If Instr(LCase(request.QueryString(Query_Name)),Chk_badword(i))0 ThenSelect Case Err_MessageCase "1"Response.Write "alert('传参错误!参数 "&name&" 的值中包含非法字符串!

请不要在参数中出现:and update delete ; insert mid master 等非法字符!');window.close();"Case "2"Response.Write "location.href='"&Err_Web&"'"Case "3"Response.Write "alert('传参错误!参数 "&name&"的值中包含非法字符串!

请不要在参数中出现:and update delete ; insert mid master 等非法字符!');location.href='"&Err_Web&"';"End SelectResponse.EndEnd IfNEXTNEXTEnd if'-----对 post 表 单值的过滤.if request.form"" thenChk_badword=split(Form_Badword,"∥")FOR EACH name IN Request.Formfor i=0 to ubound(Chk_badword)If Instr(LCase(request.form(name)),Chk_badword(i))0 ThenSelect Case Err_MessageCase "1"Response.Write "alert('出错了!表单 "&name&" 的值中包含非法字符串!

请不要在表单中出现: % & * # ( ) 等非法字符!');window.close();"Case "2"Response.Write "location.href='"&Err_Web&"'"Case "3"Response.Write "alert('出错了!参数 "&name&"的值中包含非法字符串!

请不要在表单中出现: % & * # ( ) 等非法字符!');location.href='"&Err_Web&"';"End SelectResponse.EndEnd IfNEXTNEXTend if%>

一般用户在登陆时,系统会要求输入用户名及密码,然后将这些数据传输到指定页,进行验证,大致的代码如下:

Set Conn= Server.CreateObject("ADODB.Connection") '定义连接数据库的对象
Const AccessFile="jmdcw.mdb" '数据库地址
Conn.ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(AccessFile) '连接到数据库
Conn.Open '打开数据库
....................
name=request("name") '得到所提交的用户名
pass=request("pass") '得到所提交来的密码
............
Set Jmdcw=Server.CreateObject("ADODB.RecordSet") '定义操作数据库的对象
SQL="SELECT username,userpass FROM User WHERE username='"&name&"' AND userpass='"&pass&"'" 'SQL语句
Jmdcw.Open SQL,Conn,1,1 '执行查询
......
If Jmdcw.EOF AND Jmdcw.BOF Then '如果没有查询到
response.redirect "onerror.html" '显示错误页
end if
'如果正确,就继续执行。
..........

以上就是一段简单的用户验证代码,当注入漏洞被广泛发掘之后,类似这样的漏洞就越来越少了,但少并不表示程序员在写代码时已经具备了防范意识,无意之中还是会出现这样或那样的漏洞。OK,书归正传,先来测试一下上面的代码。输入的用户名是:jmdcw,密码是:123456。(典型的弱口令密码,哈哈),这样SQL语句就是:

select username,userpass from user where username='jmdcw' and userpass='123456'

程序会查询user表中是否有jmdcw用户,并且该用户的密码是否为123456。如果username='jmdcw'的结果为真,userpass='123456'的结果也为真,那么“真 And 真 ”的结果就是真,验证通过。

当然,如果用户名和密码其中之一的结果为假,“真 And 假 ”的结果就是假,当然“ 假 And 假 ”的结果也是假,呵呵。

没有用户名或密码怎么进入?试一下'or''='吧,在提交用户名处输入 jmdcw'or''=',这样的SQL语句就是

select username,userpass from user where username='jmdcw'or''='' and userpass='12345678'

在逻辑表达式中,AND的优先级要高于OR,所以语句会先对 “''='' and userpass='12345678'” 进行判断,虽然 ''='' 为真,但密码为假,所以结果为假,但因为我们加入了OR连接符,这样,虽然后面的结果为假,但username的结果为真,所以也一样能进入这个用户的后台。

但如果不知道用户的名称,那么就要在输入的密码后也加入一个'or''=',这样,SQL语句就是

select username,userpass from user where username='jmdcw11'or''='' and userpass='12345678'or''=''

在执行and语句,''='' and userpass='12345678'的结果为假,然后是 'jmdcw11'or假 ,结果为假,再接下来是:假or ''='',这个结果就是真了。

但现在的密码都用MD5加密,对提交来的密码在进入SQL语句之前,先用MD5进行了转换,这样,就算在密码后加入了'or''=',也发挥不了作用。对于密码采用md5加密的,不妨在用户名处再加入一个or''='',也 就是在用户名处输入:jmdcw'or''=''or''=',这样的SQL 语句就是:

select username,userpass from user where username='jmdcw11'or''=''or''='' and userpass='12345678'

先执行and语句,结果为假,然后是username='jmdcw11'or''='',结果为真,接下来是:真or假,结果还是真,这样又绕过了验证。

说到这儿,我忽然想起,在文章开头所提到的网站,其密码也是用md5加密的,并且我也不知道任何一个用户名,也只用了一个or语句,为什么却进入了呢?思来思去,莫不是SQL语句中的用户与密码的位置有所不同,其的SQL语句是这样的:

select username,userpass from user where WHERE userpass='"&pass&"'" and username='"&name&"',

密码在前面,用户在后面,这样,当我在用户名处输入:jm'or''='后,其语句就变成了

select username,userpass from user where WHERE userpass='123456" and username='jm'or''=''

按照优先级,先运算ANd语句,结果为假,然后是OR语句,假or''='',结果就是真了。看来代码中的位置发生变化也能演绎成一种漏洞。

上面所提到的方法主要是针对于ACCESS数据库,但如果程序所对应的数据库是SQL,那危害就大很了,先不要说别的,还是说一下登陆的事情,直接用:

存在的用户名';--

这个可以不用密码就登陆到指定的用户之中,如果不知道呢:就用:

任意名称'or''='';--

这样所进入的会是第一个用户,很有可能是管理员的用户之中.

如何防止这种漏洞呢?很简单,就是在接收字符的语句中加入replace过滤语句,比如name就是:

name=replace(request("name"),"'","")

将'过滤为空。密码过滤的方法也类似。当然,这是简单的过滤方法,还有更多复杂的。比如过滤一些特殊字符,空格、chr(0)、%、script等一些字符,防止写入XSS代码。

那是ASP才遇到这样的问题,JSP是不会遇到这样的,PHP可以用正则表达式

加上 ' or '1'= '1 就可以

package com.swift;

(此处空一行)

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

(此处空一行)

public class LoginJDBC$PreparedStatement2 {

(此处空一行)

public static void main(String[] args) {

User userSwift=new User("zhangsan","123456");

if(login(userSwift)) {

System.out.println("账号密码正确,登陆成功");

}else {

System.out.println("登陆失败");

}

(此处空一行)

private static boolean login(User userSwift) {

(此处空一行)

Connection conn=null;

PreparedStatement ps=null;

ResultSet rs=null;

try {

//1、装载驱动

Class.forName("com.mysql.jdbc.Driver");

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

try {

//2、链接数据库,使用com.mysql.jdbc.Connection包会出错

conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/sw_database?user=root&password=root");

//3、创建连接语句

ps=conn.prepareStatement("select * from sw_user where username=? and password=?");

ps.setString(1, userSwift.getUsername());

ps.setString(2, userSwift.getPassword());

//4、执行SQL语句获得结果集

rs=ps.executeQuery();

if(rs.next()) {

return true;

}

} catch (SQLException e) {

e.printStackTrace();

}finally {

//关闭结果集

try {

if(rs!=null) {

rs.close();

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

//关闭连接语句

try {

if(ps!=null) {

ps.close();

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

//关闭数据库连接

try {

if(conn!=null) {

conn.close();

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

return false;

(此处空两行)

}

(此处空一行)

}

扩展资料:

注意

sql语句通过字符串连接的方式,虽然已经使用了PreparedStatement,但依然不能防止注入,因为字符串连接可以加入'or '1'='1

ps=conn.prepareStatement("select * from sw_user where 

username='"+userZhangsan.getUsername()+"' and 

password='"+userZhangsan.getPassword()+"'");

sql语句变为 select * from sw_user where username=? and password=?

就不存在字符串连接,password 加上其他字符sql也无法执行。



请问我手机的开机密码忘了该怎么办??我全都试过了都没用。你能帮帮我吗?


芗城区15273281266: WIS和WED注入攻击程序打不开,怎么办? -
荡美消炎: 先找注入漏洞,在一些新闻或者文章后面加上;或者'来测试是不是返回错误,如果返回错误的时候再试空格and 1=1 和and 1=2再看返回错误是否不一样,不一样的说明存在了注入漏洞,开始用各种注入工具进行注入测试发现是ACCESS...

芗城区15273281266: 这个密码各位上的数都是奇数.这个密码是一个两位数.这个密码各位上的数都是3的倍数.这个密码是多少? -
荡美消炎: 39或93.

芗城区15273281266: 电视机代码是39的有那些?
荡美消炎:代码39,什么意思,是电视型号码 万能遥控密码 还是......说清楚 分辩组装还是原装,只要看电视机壳后面型号标签纸贴的正不正,原装的话一般贴的是平平的(没有小水泡)

芗城区15273281266: windows7专业版密钥 -
荡美消炎: 专业版: HWRFF-2FFYX-XFXP2-DYFC3-BX3B7 YT9K9-4R938-3TVXX-3Q3QT-9HBXM C3X7Y-R6WWH-BRXRD-FY84C-FXWHK XJBR4-M42Q4-QPJ9C-BRDRJ-KHPVY TF3Q7-YYP8R-D78R7-W9Q9M-DXVBK J8D39-J2WM3-6368H-JV8G9-...

芗城区15273281266: iphone4s默认的'移动滑块来解锁'怎么设置? -
荡美消炎: 苹果只有从左到右移动滑块解锁和密码解锁两种方式,在设置--通用--密码锁定选项中关闭就可以恢复滑块解锁,此外如果你装了其他改变解锁方式的插件,要么卸载插件要么在插件中设置一下就行了.

芗城区15273281266: windows7'开机密码忘了吧位大神告诉一下'怎么重置 -
荡美消炎: 楼上说的不够清楚,不谈他程度高不高,随便找个U盘,下载老毛桃、大白菜之类的维护工具,安装到U盘,然后重启,开机的第一个画面(不是启动windows或者选择操作系统)也就是bios的启动界面上应该有提升,按什么键进bios,按什么键选择从哪儿启动,如果可以直接选择启动盘的话(那个界面大概有CD-ROM、HDD、FLASH DISK之类的)选择U盘,可能是你的U盘型号,也可能是FLASH DISK之类的,具体可能有出入....然后,进入了一个工具箱,这里一般的都有绕过或者清除windows密码的功能,如果没有,或者没用,当然这种情况很少,就进PE,也就是工具箱第一个,进去后开始菜单里的找一下,应该会有工具.纯手打,求采纳,不懂追问~~

芗城区15273281266: 我家WiFi设了一个33位纯数字密码,好像被对面破解了,他是怎么办到的?他家窗户有两个路由器.不知 -
荡美消炎: 纯数字密码太容易给破解的,现在很多万能王都可以自动破解的,建议密码由数字加字母(大小写均有)、符号混合组成,这样就比较难破解,而且一般这样,只要有20位左右,基本就很安全了.当然要想保证再高级,可以限制MAC登录方式,每个无线终端的网卡都有一个唯一号码的MAC地址,表示方式是 00:00:00:00:00:00 一个12位的16进制,只要限制了就无法登录.

芗城区15273281266: 保险柜只知道最后一个密码是39要怎么打开?? -
荡美消炎: 机械密码保险柜,是三组密码的,只有一组密码是无法常规开启的.中国保险箱专家团为您解答!

芗城区15273281266: T ype help or '?' for a list of available commabds -
荡美消炎:[答案] 键入help或&从而输出有效命令列表.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网