防注入其实很简单。 这里是PHP版,我给大家讲一下ASP中我是如何防注入的。 比如一个用户表,登陆过要用到这个SQL语句 select * from Users where username='' and password='' 一般的程序员都不做任何处理,其实应该处理过。最简单的方法是这样的。 我给大家讲一下Users的表结构 Id username用户名,明文 Auth_username用户名,密文 password密码密码文 其实大家将用户名也给他保存一个密文,比如值为md5(username) 然后登陆的时候用这样一个SQL 语句 select * from Users where Auth_username='md5(Request.Form("username"))' and password='md5(提交的密码)' 这样在username字段,不管你有没有加什么注入字符,都给你转成MD5了,是神仙也注入不了了。 而且这个功能仅仅是在表里加了一个字段,没什么浪费。 这样有些人会说用MD5会不会造成两个不同的username的MD5密文却是一样的呢。有这种可能。不过概率实在太小。 然后有人会说你这个查询的时候将注入封掉了,那插入数据怎么办。插入数据用这段代码好了。 用ADO直接插入,不用SQL语句. set rs=server.createobject("adodb.recordset") rs.Open "users",conn,1,3 rs.addnew
http://blog.csdn.net/heiyeshuwu/archive/2005/07/20/429880.aspx
这里是PHP版,我给大家讲一下ASP中我是如何防注入的。
比如一个用户表,登陆过要用到这个SQL语句
select * from Users where username='' and password=''
一般的程序员都不做任何处理,其实应该处理过。最简单的方法是这样的。
我给大家讲一下Users的表结构
Id
username用户名,明文
Auth_username用户名,密文
password密码密码文
其实大家将用户名也给他保存一个密文,比如值为md5(username)
然后登陆的时候用这样一个SQL 语句
select * from Users where Auth_username='md5(Request.Form("username"))' and password='md5(提交的密码)'
这样在username字段,不管你有没有加什么注入字符,都给你转成MD5了,是神仙也注入不了了。
而且这个功能仅仅是在表里加了一个字段,没什么浪费。
这样有些人会说用MD5会不会造成两个不同的username的MD5密文却是一样的呢。有这种可能。不过概率实在太小。
然后有人会说你这个查询的时候将注入封掉了,那插入数据怎么办。插入数据用这段代码好了。
用ADO直接插入,不用SQL语句.
set rs=server.createobject("adodb.recordset") rs.Open "users",conn,1,3
rs.addnew
rs("username")=username
rs("Auth_username")=md5(username)
rs("password")=md5(password)
rs.update
rs.close这只是简单的描述。用这种思路从来没有被注入过。之所以被注入,是因为我们没有花脑子去想。单凭过滤。有时候有些字符无辜的被过滤了。
select pwd from user where name='".$name."'
然后判断获取的纪录中的 pwd字段再做判断呵呵