发新话题
打印

[原创] 防SQL注入N法.

防SQL注入N法.

SQL注入N法.
# h0 M$ ~6 r$ g+ Q* O( W; d) M: u# a% G6 A
网站要做足安全, 特别是对防SQL注入, 因为大多数程序员都会很粗心大意而导致网站被黑* c6 D8 e+ H7 V- L$ r5 {
3 D3 y4 z; v7 i7 s7 u
php脚本:: p" H* }6 P. f8 b4 u+ L$ o
基本上php本身就带有类似功能的函数了, 比如mysql_real_escape_string, addslashes等. ! D" ]% ]+ B/ D( |# N" O. `
大多数虚拟主机商比如耐思尼克都会开启了magic_quotes_gpc这个选项, 那提交数据时, 会自动执行了addslashes这个函数, 这样就可以杜绝大多数的注入了5 e" Z" c2 W6 g3 ^: |/ |0 z
另外因为mysql是不分数字还是文本,都可以用''来括住, 所以建议在写sql的时候, 参数都用''来括起来1 c4 u# b( f& D, l* Z+ m0 f* @5 g
使用方法如下:
/ N5 B" v3 p( J$query = mysql_real_escape_string("SELECT * FROM products WHERE name='$productname'");% ]7 L6 ^6 y: O. i' J# L/ J
$ H! Y% F) [7 C8 T* f) K
asp脚本:
! G( d/ v7 ^9 L5 aFUNCTION CHECKSTR(ISTR)
7 N3 O9 S- q, l# |/ xDIM ISTR_FORM,SQL_KILL,SQL_KILL_1,SQL_KILL_2,ISTR_KILL - L. e5 y- \4 w* {/ S
IF ISTR="" THEN EXIT FUNCTION* J) p5 x: ~2 \- f
ISTR=LCase(ISTR)
: K9 ]$ ?4 M* w$ eISTR_FORM=ISTR" F9 @/ F5 j5 {& q0 W
SQL_KILL="'|and|exec|insert9 R# h# n+ Y* r, G* u4 U* Q* n
|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|set|;|from|=", d3 Z8 h1 m9 A; j
SQL_KILL_1=SPLIT(SQL_KILL,"|")5 U% ]' O* q+ ~( E& j
FOR EACH SQL_KILL_2 IN SQL_KILL_1
* V, r$ P5 I! F5 M- ?& ]& xISTR=REPLACE(ISTR,SQL_KILL_2,"")$ H- X# t6 m" H) A& D% Q( A$ M
NEXT4 N/ U$ q! x  W; A' p7 W( Z
CHECKSTR=ISTR2 f$ r8 d" G4 F; L- i/ B$ l
ISTR_KILL=REPLACE(ISTR_FORM,ISTR,"")
; T) X+ o! ?6 E& j; P8 E" _6 AIF ISTR<>ISTR_FORM THEN* T+ [/ i# L+ `1 g. R
RESPONSE.WRITE "<script>alert('警告: 您提交的数据["&ISTR_FORM&"]中含有非法字符 ["&ISTR_KILL&"]');history.back();</Script>"
' Z' I6 v2 x% }6 K8 e  X* [RESPONSE.END
( W, v& Q- j2 _1 \% ~7 DEND IF
+ H# i2 b& r( f: V* s( eEND FUNCTION
/ d- |& |3 G6 y, N5 ^' I7 Q
' `- ~2 Y# h. F( M) Q8 g1 X8 T% KC#脚本:
; v. X( c! k  }# [, g
3 ~$ ~5 L; v5 Z5 ibool CheckParams(params object[] args)4 I. k# q5 f  M5 G, @, y5 v
{5 {$ ?( Q( c) o) o
    string[] Lawlesses={"=","'"};$ d' N$ D- _' A- m) V; [3 r
    if(Lawlesses==null||Lawlesses.Length<=0)return true;( ~4 Z& \2 M3 ?- l0 ~% S( k
    //构造正则表达式,例:Lawlesses是=号和'号,则正则表达式为 .*[=}'].*  (正则表达式相关内容请见MSDN)' `; F& l! I0 w0 [9 e) @
    //另外,由于我是想做通用而且容易修改的  _) T" p( [* T5 X. h: ^
函数,所以多了一步由字符数组到正则表达式,实际使用中,直接写正则表达式亦可;- N3 T4 C% K, n3 D. e
    string str_Regex=".*[";  `0 F2 U3 i& [! i1 J' i' _
    for(int i=0;i< Lawlesses.Length-1;i++); k+ ^6 Y4 z! v  I6 @) b, e8 r
        str_Regex+=Lawlesses+"|";/ U0 x  u# |) ~, D0 {5 B
    str_Regex+=Lawlesses[Lawlesses.Length-1]+"].*";
3 D; y! ~8 q1 m' v# a. _    //
8 ]. ?2 a2 Y3 b1 s2 @    foreach(object arg in args)% k0 d$ |$ m& z2 [0 Y. w* d
    {
; E- k! `8 m$ O6 \        if(arg is string)//如果是字符串,直接检查6 _; G4 Q5 H0 U. o/ m( i7 M, s" l, t
        {
% H+ r) b# H7 r7 @" \+ g0 x            if(Regex.Matches(arg.ToString(),str_Regex).Count>0)" _- |3 ^$ _# H# C( Z! p6 j
            return false;
2 m% ~5 ~8 f) t, F- B5 J3 b" \        }  {) |9 y% E: M+ p: o% X
        else if(arg is ICollection)//如果是一个集合,则检查集合内元素是否字符串,是字符串,就进行检查1 S8 {8 ^1 ?9 d$ M& k- J2 S
        {! F& b2 u8 r0 u3 S9 e  j
            foreach(object obj in (ICollection)arg)
  N% N9 i' f* q% z/ [6 k1 e            {
. Q" j! D( A: Q  D                if(obj is string)2 G& p: {6 v6 A- K+ o$ O! ^
                {$ ^  e" u7 W; w- A2 ]3 ^
                    if(Regex.Matches: T6 d, j, E0 m; m( J: \8 Z  l/ d
(obj.ToString(),str_Regex).Count>0)0 |; z: B2 \. V/ ^$ g) m! h- L+ V
                    return false;
  H1 h( B( y' L- v# q                }
7 [: m$ j8 X# z' V( w, X            }
& x  ?8 o. O/ }        }
, f7 ~5 G* O9 I4 h    }
" w% d, B) w3 ?7 M$ V  J" {& ?    return true;9 }' a0 M( s: W6 F& w0 O
}

3 |+ A0 R7 C3 a; w- K
6 \* p8 m( V5 B1 I/ L8 }. b[ 本帖最后由 nicenicfly 于 2008-5-7 11:58 编辑 ]

TOP

这个行吗

TOP

支持一下哟

TOP

不会哟

TOP

在这里在顶一次就够了

TOP

呵呵。当然行 你试试就知道了!

TOP

http://www.qq1919.com/

TOP

支持一下

TOP

发新话题