阳光网驿-企业信息化交流平台【DTC零售连锁全渠道解决方案】

 找回密码
 注册

QQ登录

只需一步,快速开始

扫描二维码登录本站

手机号码,快捷登录

老司机
查看: 929|回复: 1

[转帖] 防SQL注入N法.

[复制链接]
  • TA的每日心情
    开心
    2012-3-7 10:15
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2012-1-13 10:17:07 | 显示全部楼层 |阅读模式
    网站要做足安全, 特别是对防SQL注入, 因为大多数程序员都会很粗心大意而导致网站被黑

    php脚本:
    基本上php本身就带有类似功能的函数了, 比如mysql_real_escape_string, addslashes等.
    大多数虚拟主机商比如耐思尼克(www.nicenic.com/?s=jiangyanfei)都会开启了magic_quotes_gpc这个选项, 那提交数据时, 会自动执行了addslashes这个函数, 这样就可以杜绝大多数的注入了
    另外因为mysql是不分数字还是文本,都可以用''来括住, 所以建议在写sql的时候, 参数都用''来括起来
    使用方法如下:
    $query = mysql_real_escape_string("SELECT * FROM products WHERE name='$productname'");

    asp脚本:
    FUNCTION CHECKSTR(ISTR)
    DIM ISTR_FORM,SQL_KILL,SQL_KILL_1,SQL_KILL_2,ISTR_KILL
    IF ISTR="" THEN EXIT FUNCTION
    ISTR=LCase(ISTR)
    ISTR_FORM=ISTR
    SQL_KILL="'|and|exec|insert
    |select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|set|;|from|="
    SQL_KILL_1=SPLIT(SQL_KILL,"|")
    FOR EACH SQL_KILL_2 IN SQL_KILL_1
    ISTR=REPLACE(ISTR,SQL_KILL_2,"")
    NEXT
    CHECKSTR=ISTR
    ISTR_KILL=REPLACE(ISTR_FORM,ISTR,"")
    IF ISTR<>ISTR_FORM THEN
    RESPONSE.WRITE "<script>alert('警告: 您提交的数据["&ISTR_FORM&"]中含有非法字符 ["&ISTR_KILL&"]');history.back();</Script>"
    RESPONSE.END
    END IF
    END FUNCTION

    C#脚本:

    bool CheckParams(params object[] args)
    {
        string[] Lawlesses={"=","'"};
        if(Lawlesses==null||Lawlesses.Length<=0)return true;
        //构造正则表达式,例:Lawlesses是=号和'号,则正则表达式为 .*[=}'].*  (正则表达式相关内容请见MSDN)
        //另外,由于我是想做通用而且容易修改的
    函数,所以多了一步由字符数组到正则表达式,实际使用中,直接写正则表达式亦可;
        string str_Regex=".*[";
        for(int i=0;i< Lawlesses.Length-1;i++)
            str_Regex+=Lawlesses+"|";
        str_Regex+=Lawlesses[Lawlesses.Length-1]+"].*";
        //
        foreach(object arg in args)
        {
            if(arg is string)//如果是字符串,直接检查
            {
                if(Regex.Matches(arg.ToString(),str_Regex).Count>0)
                return false;
            }
            else if(arg is ICollection)//如果是一个集合,则检查集合内元素是否字符串,是字符串,就进行检查
            {
                foreach(object obj in (ICollection)arg)
                {
                    if(obj is string)
                    {
                        if(Regex.Matches
    (obj.ToString(),str_Regex).Count>0)
                        return false;
                    }
                }
            }
        }
        return true;
    }

    楼主热帖
    启用邀请码注册,提高发帖质量,建设交流社区
  • TA的每日心情
    擦汗
    2013-10-14 10:19
  • 签到天数: 47 天

    [LV.5]常住居民I

    发表于 2012-1-14 12:14:35 | 显示全部楼层
    学习了。。。。谢谢楼主。。。。。。。。。。。。。。
    启用邀请码注册,提高发帖质量,建设交流社区
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    快速回复 返回顶部 返回列表