防
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 THEN
2 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 IF
8 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
}