在insert into ... 和 select ... where..的时候 如果字段为数字类型,添加或者查询数据时,给数字添加引号是不是多余的?
insert into table (atype) values ('1')
insert into table (atype) values (1)
atype是数字字段,这两种方法都行啊,因为mysql手册上面的东西实在是太乱,根本找不到相关的信息。

解决方案 »

  1.   

    不多余,不加引号总让人对sql注入感到担心,所以只要mysql的sql_mode不严格设置(一般很少设置严格),都要加引号。
    特别是查询语句,如果你select ...where后面的条件和用户输入相关,不加引号加大了受攻击的危险系数。$user_id = $_GET['user_id'];//假如用户在url里构造参数使得$_GET['user_id']为 1 or 1=1
    $sql = "select * from `user` where user_id={$user_id}";//下面这句sql不就变成了select * from `user` where user_id=1 or 1=1,所有user数据?假如加了引号,又对用户有可能进行注入的入口(get post cookie)进行数据过滤,会相对安全很多。insert into table (atype) values (select something from sometable limit 1) ,括号里是可以构造sql语句的,指不定就给人利用去攻击了,所以还是加引号保险点。delete,update等也要注意此类问题。
      

  2.   

    6L,你说的注入问题我这几天看了,不过GET POST 传入数字我都会先把他强制转换成数字赋给一个变量,就像这样
    $Intx = $_GET['id'];
    $Intx = (int) $Intx;
    最终$Intx的结果肯定是数字,然后再根据自己的需求设定$Intx的范围,这样他还能注入?如果传入的是字符串我直接 mysql_real_escape_string();然后两边加引号,并且我用的都是utf8编码,没有任何一个页面,数据表,字段用的是GBK,所以就不会出现0xbf27编码注入的问题。这样他还能注入?