一.基本准则

    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格式。因为这字段内容可随意伪造。

Php安全规范的更多相关文章

  1. iOS代码规范(OC和Swift)

    下面说下iOS的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下. 相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个VC里有3个按钮被命名为button ...

  2. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  3. 百度MIP页规范详解 —— canonical标签

    百度MIP的规范要求必须添加强制性标签canonical,不然MIP校验工具会报错: 强制性标签<link rel="/^(canonical)$/"> 缺失或错误 这 ...

  4. JavaScript var关键字、变量的状态、异常处理、命名规范等介绍

    本篇主要介绍var关键字.变量的undefined和null状态.异常处理.命名规范. 目录 1. var 关键字:介绍var关键字的使用. 2. 变量的状态:介绍变量的未定义.已定义未赋值.已定义已 ...

  5. JavaScript 开发规范

    本篇主要介绍JS的命名规范.注释规范以及框架开发的一些问题. 目录 1. 命名规范:介绍变量.函数.常量.构造函数.类的成员等等的命名规范 2. 注释规范:介绍单行注释.多行注释以及函数注释 3. 框 ...

  6. c#语言规范

    0x00 分类 C#语言规范主要有两个来源,即我们熟知的ECMA规范和微软的规范.尽管C#的ECMA规范已经前后修订4次,但其内容仅仅到C# 2.0为止.所以慕容为了方便自己和各位方便查询,在此将常见 ...

  7. OSGi规范的C#实现开源

    这是大约在3-4年前完成的一个C#实现的OSGi框架,实现的过程参照了OSGi规范与与一些实现思路(感谢当时的那些资料与项目),此框架虽然仅在几个小型项目有过实际的应用,但OSGi的规范实现还是相对比 ...

  8. 【腾讯优测干货分享】如何降低App的待机内存(二)——规范测试流程及常见问题

    本文来自于腾讯优测公众号(wxutest),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/806TiugiSJvFI7fH6eVA5w 作者:腾讯TMQ专项测 ...

  9. 超炫的HTML5粒子效果进度条 VS 如何规范而优雅地code

    最近瞎逛的时候发现了一个超炫的粒子进度效果,有多炫呢?请擦亮眼镜!   // _this.ch){ _this.particles.splice(i, 1); } }; this.Particle.p ...

  10. 我的公司培训讲义(1):.NET开发规范教程

    这是1年多以前我在公司所做讲座的讲义,现在与园友们分享,欢迎拿去使用.一起讨论.文中有若干思考题,对园友们是小菜一碟.另有设计模式讲义一篇,随后发布.博文上了首页,感谢博客园团队推荐,也感谢所有园友的 ...

随机推荐

  1. [2015.08.13]万峰快递单打印软件 v2.2

    <万峰快递单打印软件>是一款简单易用,且支持所有快递单的打印软件.1.支持文字打印位置的坐标精确定位和微调的打印工具.2.操作灵活,只需录入收件人和发件人信息即可打印:3.快递单打印尺寸和 ...

  2. ThoughtWorks.QRCode源码

    http://files.cnblogs.com/files/xiaoyu369/ThoughtWorks.QRCode.rar

  3. MaskEdit 使用方法

    它有一个  MaskEdit 属性(注意,属性) 打开后有一个   Input Mask 编辑框 格式符意义 L 允许输入英文字母,且一定要输入                      l 允许输入 ...

  4. Apache Shiro 简单概念

    Apache Shiro 是ASF旗下的一款开源软件(Shiro发音为"shee-roh",日语"堡垒(Castle)"的意思),提供了一个强大而灵活的安全框架 ...

  5. RT-Thread的线程(任务)处理【RT-Thread学习笔记 2】

    RT-Thread中使用线程这个概念,而不是任务.两者相似,我在这里把他的线程当作任务来理解了 1.任务处理: 动态任务相关API 创建任务:rt_thread_create函数,创建任务之后会返回r ...

  6. debian8 Apache 更改根目录

    进入配置文件,路径为:/etc/apache2/sites-available/000-default.conf 然后找到DocumentRoot /var/www/html ,将其更改为 Docum ...

  7. 表在用时建索引要加ONLINE

    因为: 源地址:https://zhidao.baidu.com/question/585392982737434725.html 一般建立索引会引起锁表,不允许进行数据更新等DML操作: 如果建立索 ...

  8. SpringMVC实例分析

    Spring的MVC模块 Spring提供了自己的MVC框架实现,相比Struts.WebWork等MVC模块,Spring的MVC模块显得小巧而灵活.Spring的MVC使用Controller处理 ...

  9. 支持ASP.NET MVC

    ASP.NET MVC能很方便在后台返回JSON数据,所以与MiniUI进行数据交互非常简单. 1)后台处理: 在MVC控制器中,可以通过方法参数接收数据,也可以通过Request接收更复杂的数据对象 ...

  10. Laravel学习笔记(三)数据库 数据库迁移

    该章节内容翻译自<Database Migration using Laravel>,一切版权为原作者. 原作者:Stable Host, LLC 翻译作者:Bowen Huang 正文: ...