Php安全规范

 

一.基本准则

    1. 所有的用户输入都是有害的,对所有从客户端传入的数据都不信任, 需要做判断和过滤(类型,长度,格式,范围),否则可能会受到SQL Injection、XSS等攻击。比如:$_GET, $_POST, $_COOKIE, $_FILES, $REQUEST等。 直接使用将可能存在被注入的危险。

 

    1. 用户的相关输入涉及数据库操作时需要对输入做专门的转换。例如: 数据库操作中数字型的需要做intval转换,字符串类型的需要通过mysql_real_escape_string过滤。

 

    1. 用户上传的文件的文件名必须随机重新命名,并限制其后缀,大小,类型,并以明确的后缀结束。

 

    1. 数据库操作必须使用安全数据库操作类.不使用安全数据库操作类的,使用Intval对整数型参数过滤,使用mysql_real_escape_string对字符串型进行过滤,并要配合mysql_set_charset设置当前字符集进行使用。PHP版本小于5.0.5的,须使用SET character_set_connection=字符集, character_set_results=字符集, character_set_client=binary; 这三句语句替代mysql_set_charset进行数据库字符集设置。在能用PDO的情况下,最好用PDO的预编译功能。

 

    1. 最好别使用PHP调用shell,若实在要调用shell命令时,输入参数作为system,exec,passthru等任何命令执行函数的参数时,要使用escapeshellarg函数进行过滤。(escapeshellcmd在某些条件下会存在漏洞,因此强烈推荐使用escapeshellarg) 。

 

    1. 输入参数作为php文件内容时,要使用var_export进行数据导出。字符串尽量用’ ‘而不是” “进行引用,一个是效率问题,一个是安全问题。

 

    1. 输出到网页中的变量要用htmlspecialchars 处理转义 防止xss攻击。

 

    1. 若有输入变量带到网址跳转中去,必须校验域名地址,防止通过URL被篡改,从当前网站跳转到欺诈网站,产生钓鱼攻击。

 

    1. 一些其它数据来源:比如导入excel数据,在进入库或者查询时。必须进行转义处理。

 

    1. 对外提供API接口的,数据传输过程中建议使用rsa+aes 相结合的方式来做加密处理,防止数据传输过程中被嗅探和篡改.

 

    1. 入库中存放密码不能明文,用户密码不能用纯md5加密 应该用md5+salt等

 

    1. 在表单提交中,最好加入token机制,以防CSRF攻击。

 

  1. 若文件包含了一个用户输入变量,请校验后缀,路径等信息,过滤一些跨目录符号。如:../ ..\ .. 等 防止文件遍历。

二.安全配置

    1. magic_quotes_gpc = On 注:此配置项在php5.4中已经移除。自动把用户提交的变量进行转换,比如把 ‘ 转为 \’ 等,相当于php中的addslashes()函数的处理。这对防止sql注射有重大作用。

 

    1. register_globals=off 注:register_globals允许php将$_GET,$_POST,$_COOKIE等变量里的内容自动注册为全局变量,如果程序里的某些变量没有经过初始化而直接使用将导致安全问题。

 

    1. expose_php=off 注:避免PHP版本信息暴露。

 

    1. display_errors = Off 注:页面不显示错误显示

 

    1. Safe_mode=on 注:启用安全模式

 

    1. disable_functions=exec,passthru,popen,proc_open,shell_exec,system,phpinfo, assert 注:禁用一些危险函数,

 

    1. allow_url_fopen = Off allow_url_include = Off 注:防止远程包含漏洞。

 

    1. session.cookie_httponly = 1 注:防止在xss漏洞中暴露cookies

 

  1. 设置好合适的 open_basedir  防止一个网站被入侵,同服所有网站被沦陷风险的跨站点攻击。

三.其它容易被忽略的地方

  1. 注意php各版本之间的区别 比如:php5.4 php5.5中 $_REQUEST 默认只包含 $_GET $_POST 不包含$_COOKIES

     public function dispose_request()
         {
             $_POST = daddslashes($_POST);
             $_GET  = daddslashes($_GET);
             $_REQUEST = daddslashes($_REQUEST);
     }
     上面的代码如果是在PHP5。3以上的环境中运行  $_COOKIES变量是没有经过转义的。
    
  2. 通用过滤转义函数在过滤数组时,别忘记对$key过滤

     function daddslashes($string, $force = 0)
     {
         if (!get_magic_quotes_gpc() || $force)
         {
             if (is_array($string))
             {
                 foreach ($string as $key => $val)
                 {
                     $string[$key] = daddslashes($val, $force);
                 }
             }
             else
             {
                 $string = addslashes($string);
             }
         }
         return $string;
     }
       $test[“username’a”]=”admin’a” //只转义了数组对应的value  key没有转义
       $test=daddslashes($test);
    
  3. 在用preg_replace 中,慎用e 参数

       function dunserialize($string)
       {
           return unserialize(preg_replace('!s:(\d+):"(.*?)";!se', '"s:".strlen("$2").":\"$2\";"', $string));
       }
       $str='s:123:"${phpinfo()}";';
       dunserialize($str);   //程序最终会执行php代码,产生代码执行漏洞
    
        其它会产生类似代码执行漏洞的函数还有:
         eval create_function call_user_func call_user_func_array assert  等 在使用这些函数时务必注意参数的合法性。
    
  4. parse_str使用过程中注意变量覆盖和注入漏洞

     parse_str('a=%27');
     php<=5.3  $a=\’
     Php>5.3  $a=’
    
  5. 在要对浏览器标识入库时,必须做转义处理。

     $agent = addslashes($_SERVER['HTTP_USER_AGENT']);
    
  6. 在取客户端IP中。若取到了$_SERVER[‘HTTP_X_FORWARDED_FOR’]这段。请校验该字段的值是否为IP格式。因为这字段内容可随意伪造。

转载于:https://www.cnblogs.com/hellohell/p/6114551.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java,c/c++,php,c#安全编码规范,从代码层面避免被入侵 1 业务安全编码规范 6 1.1 输入验证和数据合法性校验 6 1.1.1 避免SQL注入 6 1.1.2 避免XML注入 6 1.1.3 避免跨站点脚本(XSS) 7 1.1.4 避免跨站请求伪造(CSRF) 8 1.1.5 避免敏感信息泄露 12 1.2 安全框架 12 1.2.1 Apache Shiro安全框架 12 1.2.2 webSecrity安全框架 13 1.2.3 Enterprise Security API 13 2 基础安全编码规范 15 2.1 声明和初始化 15 2.1.1 避免类初始化的相互依赖 15 2.2 表达式 16 2.2.1 不可忽略方法的返回值 16 2.2.2 不要引用空指针 16 2.2.3 使用Arrays.equals()来比较数组的内容 16 2.3 数字类型和操作 17 2.3.1 防止整数溢出 17 2.3.2 避免除法和取模运算分母为零 18 2.4 类和方法操作 18 2.4.1 数据成员声明为私有,提供可访问的包装方法 18 2.4.2 敏感类不允许复制 18 2.4.3 比较类的正确做法 19 2.4.4 不要硬编码敏感信息 19 2.4.5 验证方法参数 19 2.4.6 不要使用过时、陈旧或低效的方法 20 2.4.7 数组引用问题 20 2.4.8 不要产生内存泄露 20 2.5 异常处理 21 2.5.1 不要忽略捕获的异常 21 2.5.2 不允许暴露异常的敏感信息 21 2.5.3 不允许抛出RuntimeException, Exception,Throwable 22 2.6 多线程编程 23 2.6.1 确保共享变量的可见性 23 2.6.2 确保共享变量的操作是原子的 24 2.6.3 不要调用Thread.run(),不要使用Thread.stop()以终止线程 26 2.6.4 确保执行阻塞操作的线程可以终止 26 2.6.5 相互依存的任务不要在一个有限的线程池执行 27 2.7 输入输出 27 2.7.1 程序终止前删除临时文件 27 2.7.2 检测和处理文件相关的错误 27 2.7.3 及时释放资源 27 2.8 序列化 28 2.8.1 不要序列化未加密的敏感数据 28 2.8.2 在序列化过程中避免内存和资源泄漏 29 3 其他参考资料 30

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值