草根站长论坛's Archiver

niceok 发表于 2008-3-18 15:50

防SQL注入N法

防SQL注入N法
zuuW"U7wH?%k 网站要做足安全, 特别是对防SQL注入, 因为大多数程序员都会很粗心大意而导致网站被黑/O:av A'yr9a'B
php脚本:WNF%R,I
基本上php本身就带有类似功能的函数了, 比如mysql_real_escape_string, addslashes等. m-s]aU
大多数虚拟主机商比如耐思尼克([url=http://www.nicenic.com]www.nicenic.com[/url])都会开启了magic_quotes_gpc这个选项, 那提交数据时, 会自动执行了addslashes这个函数, 这样就可以杜绝大多数的注入了3R,Et2` @0U
另外因为mysql是不分数字还是文本,都可以用''来括住, 所以建议在写sql的时候, 参数都用''来括起来
X0EE[0t"r bU 使用方法如下:B| H0Wt1n2Ni
$query = mysql_real_escape_string("SELECT * FROM products WHERE name='$productname'");R;OQeRN
asp脚本:&RGE;TL
FUNCTION CHECKSTR(ISTR)
X.rz C&o(t*@$tb DIM ISTR_FORM,SQL_KILL,SQL_KILL_1,SQL_KILL_2,ISTR_KILL /b4cA/?1Q9t8l
IF ISTR="" THEN EXIT FUNCTION`LCq%d;Q1?/bO
ISTR=LCase(ISTR)
J] k%G |rvh ISTR_FORM=ISTR+A$zuZ8_~
SQL_KILL="'|and|exec|insert)|T;V_~0G7|
|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|set|;|from|="5W P"Y-{WO;d W9K
SQL_KILL_1=SPLIT(SQL_KILL,"|")
g/|H mTA FOR EACH SQL_KILL_2 IN SQL_KILL_1
Vpn XC-m"sZ\ ISTR=REPLACE(ISTR,SQL_KILL_2,"")
gZ:x{+c+mNB5I NEXT h? @+y-]R
CHECKSTR=ISTR
biA1]w ISTR_KILL=REPLACE(ISTR_FORM,ISTR,"")1pX u{&JtR
IF ISTR<>ISTR_FORM THEN4`"?:U,Z;FP n"`E s
RESPONSE.WRITE "<script>alert('警告: 您提交的数据["&ISTR_FORM&"]中含有非法字符 ["&ISTR_KILL&"]');history.back();</Script>"
!Frm5L8U.n RESPONSE.END
)k t5\lx"L END IF4e V4~ g1l/G8L!N Sa
END FUNCTION[,ql2Y G"N(H f9H
C#脚本:
"?-M B8P%Qd7[ bool CheckParams(params object[] args)G)v*n!kq7S{+j ] A
{
Yb i t\xy HW;c s%M     string[] Lawlesses={"=","'"};4DKyJJOEk!S
    if(Lawlesses==null||Lawlesses.Length<=0)return true;
h@Q ~,N4D4FH|     //构造正则表达式,例:Lawlesses是=号和'号,则正则表达式为 .*[=}'].*  (正则表达式相关内容请见MSDN)
9n;iq!P0fF$Z     //另外,由于我是想做通用而且容易修改的
1ju.Yg;V DL 函数,所以多了一步由字符数组到正则表达式,实际使用中,直接写正则表达式亦可;nr2NH,rM&o
    string str_Regex=".*[";
T7bYaDZ6V u     for(int i=0;i< Lawlesses.Length-1;i++)(~r1PB.eRhc
        str_Regex+=Lawlesses[i]+"|";!nRZZrh$Y Q ~N
    str_Regex+=Lawlesses[Lawlesses.Length-1]+"].*";
s~n Ch!E     //!N"{a1O4B4PFz)So
    foreach(object arg in args)$L*P"a9O+C i:VY
    {` @ m*h$m0Ess
        if(arg is string)//如果是字符串,直接检查!MT8jl9v7er@k
        {
{+fO%W"} s-t             if(Regex.Matches(arg.ToString(),str_Regex).Count>0)
n,A@9hk!d             return false;
5a@5h$z|FLd2P         }
&Bm D9L wo         else if(arg is ICollection)//如果是一个集合,则检查集合内元素是否字符串,是字符串,就进行检查
f&NWq*y)D.BE8j         {4G2W&UNw7?#jR"G6J
            foreach(object obj in (ICollection)arg)
bRr\%U7aT [&\_N             {:qn(H2K1M@ m3n
                if(obj is string)
N#S9M{7UZ@                 {
r h2?H:Q!m0BYg                     if(Regex.MatchesNp P(SA0lkN4J
(obj.ToString(),str_Regex).Count>0)
;bq F;{9i)KZL]do                     return false;
/dME&@Pyo8q                 } ]i-~!['D ]\zf
            }$@w,P9CM+B
        }!QYB:}|Fu.}V
    }
] dxd`Er1?8E'j5[     return true;
Q.k1azw(k @4F }

逢春枯木 发表于 2008-3-19 00:09

不错啊Y2]BSFV v
支持

紫风铃 发表于 2008-3-19 11:29

谢谢分享

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.