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

 找回密码
 注册

QQ登录

只需一步,快速开始

扫描二维码登录本站

手机号码,快捷登录

手机号码,快捷登录

老司机
查看: 1563|回复: 0

[转帖] 防SQL注入N法.

[复制链接]
  • TA的每日心情

    2021-1-19 10:45
  • 签到天数: 172 天

    [LV.7]常住居民III

    发表于 2008-3-29 15:37:19 | 显示全部楼层 |阅读模式
    网站要做足安全, 特别是对防SQL注入, 因为大多数程序员都会很粗心大意而导致网站被黑
    php脚本:
    基本上php本身就带有类似功能的函数了, 比如mysql_real_escape_string, addslashes等.
    大多数虚拟主机商比如耐思尼克(www.nicenic.com)都会开启了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;
        //构造正则表达式,例awlesses是=号和'号,则正则表达式为 .*[=}'].*  (正则表达式相关内容请见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;
    }


    楼主热帖
    启用邀请码注册,提高发帖质量,建设交流社区
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

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