防
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|insert
9 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
NEXT
4 N/ U$ q! x W; A' p7 W( Z
CHECKSTR=ISTR
2 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 编辑 ]