发新话题
打印

防SQL注入N法

防SQL注入N法

SQL注入N法7 A- e, H  c$ e! ~+ q
网站要做足安全, 特别是对防SQL注入, 因为大多数程序员都会很粗心大意而导致网站被黑
# i  e3 [3 A% {- R8 E8 zphp脚本:0 o% S$ \5 u$ K3 [
基本上php本身就带有类似功能的函数了, 比如mysql_real_escape_string, addslashes等.
6 M! b4 _2 E1 X  X5 U9 c$ h大多数虚拟主机商比如耐思尼克(www.nicenic.com)都会开启了magic_quotes_gpc这个选项, 那提交数据时, 会自动执行了addslashes这个函数, 这样就可以杜绝大多数的注入了  K. w& h8 ^% A! P! _1 i
另外因为mysql是不分数字还是文本,都可以用''来括住, 所以建议在写sql的时候, 参数都用''来括起来
- d( ~$ m1 o+ Q) d- S7 W使用方法如下:
0 Y# z3 j" v* [' p$query = mysql_real_escape_string("SELECT * FROM products WHERE name='$productname'");6 s( _3 G, g- m* _; ~* _
asp脚本:& I+ H- V! Z& @) h' {5 ?
FUNCTION CHECKSTR(ISTR)( U- M7 c! E) T: N- k) K& u
DIM ISTR_FORM,SQL_KILL,SQL_KILL_1,SQL_KILL_2,ISTR_KILL
3 t4 a, L5 H% u- M/ EIF ISTR="" THEN EXIT FUNCTION
% ?3 b$ |, z, t8 w' {ISTR=LCase(ISTR)
4 `* D' }; Z, F1 \2 AISTR_FORM=ISTR
3 R* g8 e7 a% P& t1 d, w7 t: {, k5 zSQL_KILL="'|and|exec|insert% |/ I4 B3 V7 I  j6 ]
|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|set|;|from|="
1 l: R4 a, F0 d$ }9 [/ _SQL_KILL_1=SPLIT(SQL_KILL,"|"): ]' V) b/ S4 p2 i* S" e4 E# X' I
FOR EACH SQL_KILL_2 IN SQL_KILL_1) q7 ^6 D" m  D3 y8 B7 F
ISTR=REPLACE(ISTR,SQL_KILL_2,"")
5 n3 s( G1 |! Y1 mNEXT
6 e( n2 P" _0 ?1 E% [& |CHECKSTR=ISTR  T6 J. p4 ^' ]: h9 g# T; h& C
ISTR_KILL=REPLACE(ISTR_FORM,ISTR,"")
/ X& J# N0 r! F0 {% |IF ISTR<>ISTR_FORM THEN2 O1 {0 E- Z5 C3 h
RESPONSE.WRITE "<script>alert('警告: 您提交的数据["&ISTR_FORM&"]中含有非法字符 ["&ISTR_KILL&"]');history.back();</Script>"
1 ]- O6 n% X! lRESPONSE.END
  @. S- I! T; Z& B/ y" dEND IF8 k' N# Z0 P5 u: [9 ~
END FUNCTION( n/ m! p/ S0 u! z  d6 o: V; F- P# x) |
C#脚本:
8 Y: x! a0 i0 C* P0 i# lbool CheckParams(params object[] args)6 y( _$ ~( a8 u6 d2 ^6 \
{6 u7 X+ T: @+ E9 c( U
    string[] Lawlesses={"=","'"};) c' G/ C0 h" Y4 S% t  M9 I
    if(Lawlesses==null||Lawlesses.Length<=0)return true;
8 f2 W' ]0 M9 v  T7 q: x4 [4 s: v    //构造正则表达式,例:Lawlesses是=号和'号,则正则表达式为 .*[=}'].*  (正则表达式相关内容请见MSDN)
. Y- r+ q( o9 c3 c# m" D: J8 J2 s    //另外,由于我是想做通用而且容易修改的/ V/ }8 p( J9 }/ ]2 i' V: W
函数,所以多了一步由字符数组到正则表达式,实际使用中,直接写正则表达式亦可;
. Z: C5 q9 w/ E+ i; d    string str_Regex=".*[";
) X3 x4 d4 X7 f7 _' `- a    for(int i=0;i< Lawlesses.Length-1;i++)
- B5 X! O! s' |        str_Regex+=Lawlesses+"|";
; F; t/ D3 v6 c5 s    str_Regex+=Lawlesses[Lawlesses.Length-1]+"].*";
) ^: {8 j) T: a/ m9 z/ l' @    //( u1 o5 L( M& S
    foreach(object arg in args)
  |( b+ v& n! Z3 N" m    {
$ \- @. V- O$ c1 z" W. s        if(arg is string)//如果是字符串,直接检查& w% z. S/ k6 {' l9 M% H* B$ x
        {
5 Z1 T- u$ F8 ]8 q2 v( V, C! e9 ^            if(Regex.Matches(arg.ToString(),str_Regex).Count>0)
1 M( p' Z( c4 R/ h; @            return false;6 `0 u4 w: P; ?6 A& j
        }
- `, T! f  T/ [% b        else if(arg is ICollection)//如果是一个集合,则检查集合内元素是否字符串,是字符串,就进行检查7 G! X6 ^# ^3 C4 ], K& V$ g% }
        {$ g/ {/ }" v- ?7 o; v( M
            foreach(object obj in (ICollection)arg)
( j6 u  X4 D) p) b            {$ I  E: p, U0 @! M
                if(obj is string)
  s8 G8 G, Z3 D% M7 P; E                {9 d1 o1 M" ]1 R3 y7 E
                    if(Regex.Matches
: A6 ]" ]' ]9 I(obj.ToString(),str_Regex).Count>0)2 w) Z% f5 l: ^* n6 |9 T
                    return false;) D& `" Q1 h0 W; ?* C5 t/ ?
                }5 t& |9 e2 }- E, z; Q$ \- A
            }2 Z4 `( G' {, _$ v
        }
- k- a3 u$ z5 `# q7 @5 D    }7 c) ?6 ]; A! F! L1 f, @8 ]5 T
    return true;7 p' n; _8 [/ g2 I, I/ u6 n/ H
}
本帖最近评分记录
  • 水煮鱼 威望 +10 感谢支持!236Z有你更精彩! 2008-3-19 00:12
  • 水煮鱼 金币 +10 感谢支持!236Z有你更精彩! 2008-3-19 00:12
在耐思尼克奋斗!

TOP

不错啊: y: x2 C& `  `: G& \+ d. N1 ?1 F
支持

TOP

谢谢分享

想要访谈的站长请联系我Q:893819301

TOP

发新话题