直接就使用get 方式传过来的啊

解决方案 »

  1.   

    id(is_int($_GET['sortid']) && $_GET['sortid']>0)
       your code...
      

  2.   

    给你个函数.提前过滤就可以了      function stripslashes_array($array) {         while (list($k,$v) = each($array)) {
                    if (is_string($v)) {
                        $array[$k] = stripslashes($v);
                    } else if (is_array($v))  {
                        $array[$k] = $this->stripslashes_array($v);
                    }
            }
            return $array;       }
        $_GET =str_replace("'","",stripslashes_array($_GET));
        $_POST =str_replace("'","",stripslashes_array($_POST));
        $_COOKIE =str_replace("'","",stripslashes_array($_COOKIE));
    你把它放在程序开始.格式化所有GET POST COOKIE 哈.好用不好用,你自己看了!!
      

  3.   

    真奇怪,sortid=1 and 1=2 union select password from user这里面有单引号吗?
    怎么还有人答非所问, ice_berg16(寻梦的稻草人) 正解
      

  4.   

    http://blog.csdn.net/heiyeshuwu/archive/2005/06/14/394225.aspx
      

  5.   

    搜索一下"php防注"有个安全天使的,比较详细的说。
      

  6.   

    to all:
    ‘君子兰’和‘杜牧’说的接近正确,‘Evilfile(0x208WM)’说出了另外一半。php.ini 中设置 magic_quotes_gpc = On 自动进行过滤,然后写sql语句的时候养成在值得外面加单引号的习惯。这样就避免了sql注入,而且也不用在程序中判断了。
    当然,如果你需要设置magic_quotes_gpc = Off,那么在程序中给变量做 addslashes 处理就行了,即
    addslashes($_GET['sortid'])。好啦,相信我说清楚了,呵呵
      

  7.   

    单单加单引号是不行的!
    人家可以通过注入单引号来攻击你!我不清楚addslashes()的原理,谁能解释一下?
    是不是自动给用户传入的字符都加上/ ? 
    有什么意义呢?
      

  8.   

    另外,register_globals = Off 也能增加安全性,建议使用,嘿嘿,太灵活了不好,
    有时候会让优势变成劣势的。适当的严谨一点会让我们减少很多麻烦。呵呵
      

  9.   

    可以采用:单引号,再加上替换用户传入的单引号(或double它)!
      

  10.   

    另外,不知道有人看过那个“宠物中心”的论坛插件没有,不知道那个是谁写的哈,批一下先:物品属性值居然通过页面post(数据库里有的东西为什么要这样做呢再省数据库资源消耗也不能这样省阿)呵呵,建议大家养成好习惯,嘿嘿。关于数据库性能有很多好方法的,内存表是不错的选择,
    当然如果有其他语言的那种把常用的数据扔到内存中常驻就更好了:)考虑问题应该从正常的渠道找到合理的方法,而不是像“宠物中心”那种自作聪明呵呵,说过了,希望对新人有点点帮助。
      

  11.   

    to lanyd(山雨欲来风满楼):
    addslashes()或者php配置中的那个所做的是同样的,
    就比如:你的get 变量是  1' and 1=2 union select password from user where 2!='1
    那么如果不过滤得话, 你的sql语句可能是 select 。。where sortid='1' and 1=2 union select password from user where 2!='1',那么就会被注入了。
    而通过上面2种方法过滤得话,你得到的sql语句是
    select 。。where sortid='1\' and 1=2 union select password from user where 2!=\'1'明白它们的用处了吧?
      

  12.   

    to  heiyeshuwu(黑夜路人) :
    有没有对每种过滤掉的字符可能产生的危险做一下说明阿?每种都给个例子嘛!~:)
      

  13.   

    取ID后强制转换也可以(int)$_GET['id'];
      

  14.   

    sort.php?sortid=1 and 1=2 union select password from user具体情况要具体分析
    对于你的这种情况,最简单的方法就是
    $_GET$GET['sortid'] = intval($GET['sortid']);这个攻击的原理是:
    首先使你原有的查询失败
    .... where sortid=1 and 1=2
    由于1=2永远不会成立,所以你原有的查询就没有结果了
    然后他附加了自己的查询
    select password from user
    来取得你user表中的内容
    注意那个“union”
    这才是个关键,你只要从这里切断传入的串。此类攻击就都不能奏效了
      

  15.   

    其实防注入没有那么复杂,php不像asp
    一般如果是整形的数据,建议获取的时候都intval一下,字符串的一般都转义一下就全部OK。
    具体如下:1. 打开 register_global = on
    2. 打开 magic_quotes_gpc = On
    3. 打开 safe_mode = On
    4. 过滤变量,不管是get方式还是post方式的数据一律过滤,记得有个强人说过:不要相信任何用户提交的数据。
    整型数据获取的时候一般都intval一下,如:$int_var = intval($int_var)
    字符串get方式的,一般可以过滤的方式,比如象我使用正则匹配的方式,不过不是特别好,一般转义一下就可以了。
    5. 初始化你的变量建议参考以下文章:
    http://blog.csdn.net/heiyeshuwu/archive/2005/06/14/394225.aspx (我写的,不强)
    http://blog.csdn.net/heiyeshuwu/archive/2005/07/14/424814.aspx (英文的,但是很强)
      

  16.   

    其实一般 magic_quotes_gpc = On 了,字符串的代码也起不了作用,对了,还有一个忘记说了,最好在你的sql里面都加上单引号,比如:
    整型变量:$sql = "SELECT * FROM tbl_name WHERE tid = '$id' ";
    字符串变量:$sql = "SELECT * FROM tbl_name WHERE title = '$title' ";那样的话,注入的时候就会出错了,呵呵另外,还建议你参考下,安全天使的文章,里面很多关于如何注入的,知道攻了,就知道怎么防了:
    http://www.4ngel.net/article/36.htm
    http://www.4ngel.net/article/30.htmhttp://www.4ngel.net
      

  17.   

    对不起,上面说错了,应该是把全局变量关闭掉:
    1. 打开 register_global = on应该是:register_global = off呵呵,写on顺手了,全部写了 -_-#