纯月部落

左手创新,右手敏捷,反过来可以么!

夏纯中ID:danny_xcz
846033次访问,排名41好友1人,关注者39
danny_xcz的文章
原创 298 篇
翻译 3 篇
转载 26 篇
评论 728 篇
纯月的公告
最近评论
lovedoghero:真是一种不错的生活方式。
yctcsms:哈哈,言之有理!
hfgayy:tag
quzhoushijie:gby企业管理
网站推广
打折机票
gby520
我爱你
Iloveyou
收藏
    相册
    Blog用途
    我的相册
    Java Desktop
    Open Source
    友情链接
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 PHP+MySQL安全方案整理收藏

    新一篇: SSO单点登陆方案整理 | 旧一篇: 敏捷开发案例:用白板解决项目管理和团队沟通

     

    看之前牢记一句老话:一切用户输入的都是不安全的。


    1 不要依赖于服务器端的magic_quotes,虽然他们默认都是打开的(magic_quotes_gpc)

    将下面两个关闭
    ini_set("magic_quotes_runtime", 0);
    ini_set("magic_quotes_sybase", 0);

       全部自己手工对所有变量添加magic_quotes,就是添加addslashes
       代码如下:
       function stripslashes_deep($value){
      $value = is_array($value) ?
         array_map('stripslashes_deep', $value) :
         stripslashes($value);
      return $value;
       }
       
      function strip_slashes(){
       // If already slashed, strip.
       //把原有的slash去掉,重新添加自己的magic_quotes
       if ( get_magic_quotes_gpc() ) {
         $_GET    = stripslashes_deep($_GET   );
         $_POST   = stripslashes_deep($_POST  );
         $_COOKIE = stripslashes_deep($_COOKIE);
         $_SERVER = stripslashes_deep($_SERVER);
         $_REQUEST = stripslashes_deep($_REQUEST);
       }
       $_GET    = add_magic_quotes($_GET   );
       $_POST   = add_magic_quotes($_POST  );
       $_COOKIE = add_magic_quotes($_COOKIE);
       $_SERVER = add_magic_quotes($_SERVER);
       $_REQUEST = add_magic_quotes($_REQUEST);
      }

      strip_slashes();

      
       显示的时候全部stripslashes还原,虽然这很麻烦,不过如果你有一个模板引擎,可以在变量赋值的时候,统一作这个事情,
       例如: function assign($var, $value = '') {
      if (is_array($var)) {
       foreach ($var as $k => $v) {
        $this->vars[$k] = stripslashes_deep($v);
       }
      } else {
       $this->vars[$var] = stripslashes_deep($value);
      }
     }


      这样可以避免' " \ 等符号,下面还会有说明

    2 对于用户名这样的字段,输入时候,检查不允许有空格,而且必须是字母数字下划线或划线这四种,用正则检查

      还有诸如结点名,菜单名,角色名这些不需要用' " \的,一定要在录入之前就检查,或者用替换为空

    3 所有ID为数字的变量,必须检查是否为数字,并将变量强制转换成数字
      如果ID是前面带0的或者字符型的,可用编码规则对其进行检查,例如全是数字的正则

    4 对于php的mysql函数,由于天生一次只能执行一条语句,即;不会自动断。所以无法通过追加语句实现注入,只可能通过将语句插入到变量中来起作用注入,所以对于delete ,select,update都可能有破坏作用。
    例如:delete from tbl_users where user_id = 'admin' 变成 delete from tbl_users where user_id = 'admin or user_id<>'0',即在输入栏为:admin or user_id<>'0
      所以对于变量参数:
      不该有空格的,空格要去掉
      该位数字的,一定要转换成数字
      有编码规则的,一定要检查编码规则
      有长度限制的一定要加入长度限制
      绝对不会有注入语句的,就筛查sql关键字
      将一些危险字符进行替换,例如用“代替",空格用%20代替,特殊字符转成html等等
      当然用addslashes还是有明显效果的,对于php来说,要想在变量中插入条件,必须通过'来完成,所以这一招可以彻底断了所有企图
     
    5 apache,php,mysql不要以系统用户运行

    6 连接mysql不要用root

    7 系统的所有错误信息必须关闭或者屏蔽

    8 屏蔽非主流浏览器的user-agent

    9 记录所有的sql操作和用户ip,如果发现危险语句,可以立刻屏蔽该IP,例如3天
      如果是用户登录后,有危险sql注入的语句,直接删除该用户,同时屏蔽IP

    10 对于验证码要可以采用使用中文,变换字符串样式,必须点击弹出等方法

    11 如果还是不安全,就要像电子银行那样,用U盾和专用控件了

    发表于 @ 2007年09月14日 09:14:00|评论(loading...)|编辑

    新一篇: SSO单点登陆方案整理 | 旧一篇: 敏捷开发案例:用白板解决项目管理和团队沟通

    评论

    #usfine 发表于2008-07-15 08:40:17  IP: 220.178.42.*
    Welcome to usfine for Age Of Conan gold and
    aoc powerlevewling sevise.
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 纯月