PHP开发规范
⼀、摘要
  这是⼀份旨在增强团队的开发协作,提⾼代码质量和打造开发基⽯的编码风格规范。当⼀个团队开始指定并实⾏编码规范的话,错误就会变得更加显⽽易见。如果⼀段特定的代码不符合规范的话,它有可能只是代码风格错误,⽽也有可能会是 bug,更可能出现安全问题。早期指定规范就使得代码审核得以更好的开展,并且可以更精确的地定位到错误。只要开发者们能够保证源代码源⽂件都严格遵循规范,那接下来的维护⼯作就可以变得轻松简单。
总之,我们的⽬标就是遵循同⼀套编码规范,不管有多少⼈共同参与同⼀项⽬,都可以确保每⼀⾏代码都像是同⼀个⼈编写的,每⼀个功能都是安全的。
⼆、PHP相关命名规范
2.1 ⽅法命名
  ⽅法,指的是在类中定义的函数,⽅法的命名使⽤驼峰法,并且⾸字母⼩写或者使⽤下划线“_”,例如 getUserName(
),_parseType( ),通常下划线开头的⽅法属于私有⽅法;
2.2 函数命名
  函数是指不在类中定义的函数,例如在公共⽂件中的函数。函数的命名使⽤⼩写字母和下划线的⽅式,例如 get_client_ip( );
2.3 变量(属性)命名
  变量,也叫属性。属性的命名使⽤驼峰法,并且⾸字母⼩写或者使⽤下划线“_”,例如 tableName、_instance,通常下划线开头的属性属于私有属性;
2.4 常量命名
  常量以⼤写字母和下划线命名,例如 HAS_ONE和 MANY_TO_MANY;
2.5 配置参数命名
  配置参数以⼤写字母和下划线命名,例如 HTML_CACHE_ON = 1;
三、数据库相关命名规范
3.1 数据库命名
  数据库的命名⼀般采⽤⼩写字母命名,如 testdb;
3.2 数据表命名
  数据表命名格式为 表前缀+下划线(_)+表名 组合⽅式命名。同⼀数据库表前缀相同,且使⽤⼩写字母命名,表名使⽤⼩写字母和下划线命名。例如 wll_setting_record,其中wll为前缀,setting_record为表名。
3.3 字段命名
  字段的命名采⽤⼩写字母和下划线命名,如 coin_type。
四、禁⽌使⽤的命名⽅式
4.1 ⽆意义的命名
  例如:$abcd、qqqqqqq()、test1111111等,命名应该使⽤对应的英⽂翻译;
4.2 拼⾳命名
  例如添加⽤户(tjyh)或中英混合的(tjUser),如果使⽤这种⽅式,其他开发⼈员会很难看得懂,
加⼤维护难度。
4.3 单字母命名
  ThinkPHP中封装了很多名称为单字母的快捷⽅法,例如A( )、C( )、M( )。如果再定义可能会发⽣冲突。
五、注释规范
5.1 ⽅法和函数
  在⽅法和函数的上⼀⾏必须⽤双斜线注释注明该⽅法或函数的功能,在难以理解的代码语句后⾯适当添加注释说明,例如:
// 短信宝短信 www.smsbao/
public function smsbao($username, $password, $moble, $content)
{
$url = 'api.smsbao/sms?u=' . $username . '&p=' . $password . '&m=' . $moble . '&c=' . $co
ntent;
if (function_exists('file_get_contents')) {
$file_contents = file_get_contents($url);
} else {
$ch      = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$file_contents = curl_exec($ch);
curl_close($ch);
}
if ($file_contents > 0) {
return [$file_contents];    // 失败
} else {
return [$file_contents, 1]; //成功
}
}
5.2 配置参数
  在配置⽂件中的参数设置必须注明变量含义,例如:
php文件管理系统mvc 源码'DB_TYPE'              =>  'mysql',      // 数据库类型
'DB_HOST'              =>  'localhost',  // 服务器地址
'DB_NAME'              =>  'wlldb',      // 数据库名
'DB_USER'              =>  'root',      // ⽤户名
'DB_PWD'                =>  'root',      // 密码
六、编码风格规范
6.1 禁⽌出现多⾏空格
  如果不是特殊需要,在代码⽂件中禁⽌出现多⾏空格,例如下⾯这种是不允许的:
//公共⽅法
public function common(){
$name='tom';  //定义姓名
$this->assign('name',$name);
$this->display();
}
6.2 缩进
  代码中需要适当的缩进,否则会加⼤维护难度。
6.3 ⽬录结构
  ⼀般框架都是有默认的⽬录结构,⾮特殊情况不允许修改⽬录结构,例如thinkphp默认的是MVC架构的⽬录结构,避免由于更改⽬录结构带来的维护困难。Controller⽂件放在Controller⽬录 中,Model⽂件放在Model⽬录中,View⽂件放在View⽬录中,不要随意更改⽬录的位置和⽬录名称。
七、安全
7.1.1 输⼊框
  所有的输⼊框请设置最⼤长度,必填项请做必填的限制。例如帐号CHN00000001,只能输⼊11位,那么最⼤输⼊长度只能为11,并且添加required="required"属性。
7.1.2 ⽂本编辑器
  前台页⾯尽量不要使⽤富⽂本编辑器,因为富⽂本编辑器可以输⼊代码,有很⼤的安全隐患。如果要使⽤,必须对提交内容进⾏过滤,例如使⽤htmlspecialchars()进⾏过滤。
7.2 后台接收参数
  PHP从表单获取url中获取参数必须进⾏字段类型判断。例如接收数字的参数不能含有其他字符,只能是数字,建议编写公共的检查接收post和get参数的函数,对每⼀个参数值进⾏验证,防⽌注⼊恶意代码。
  接收长篇内容的变量,例如留⾔内容等变量时,必须进⾏特殊字符的过滤操作。⽐如strip_tags()、htmlspecialchars()、htmlentities()等函数可以起作⽤,防⽌⽤户注⼊恶意代码进⾏跨站脚本攻击。
7.3 数据库查询
  数据库查询语句禁⽌直接使⽤sql语句和传递的参数直接执⾏,例如下⾯这种的写法是禁⽌使⽤的:
$id = 1;
$User = M("User"); // 实例化User对象
$User->where('id='.$id)->select();  //错误写法1
$User->where("id=$id")->select();  //错误写法2
  如果传递过来的参数含有SQL注⼊代码,这两种写法都是⾮常危险的。正确的写法有以下两种:
(1)数组条件,例如:
$where['id'] = 1;
$User = M("User"); // 实例化User对象
$User->where($where)->select();
或者
$User = M("User"); // 实例化User对象
$User->where(['id'=>1])->select();
(2)预处理机制,例如:
$User = M("User"); // 实例化User对象
$User->where("id=%d",$id)->select();
7.4 权限控制
  凡是需要登录之后才可以访问的页⾯加载页⾯之前必须做好登录检测,登录超时的必须重新登录。需要权限访问的页⾯和功能必须做好权限控制和检测。
7.5 越权访问
7.6 数据导出
  数据的导出和下载必须做好登录状态验证和权限的控制,没有权限或没有登录的禁⽌下载导出。
7.7 防暴⼒破解
  暴⼒破解是指使⽤数据字典等枚举⽅式逐个帐号进⾏密码的尝试破解,为了防⽌这种破解,在登录、注册、回密码等页⾯必须设置好图形验证码或者其他验证,最好是做好错误次数的限制,例如密码输错5次,⼀个⼩时内禁⽌登录等。
7.8 短信邮件安全
  ⽤到和发送邮件的页⾯,必须设置图形验证码,点击发送之前,验证图形验证码正确后再发送。最好限制每个⼿机号每天的发送数量。
7.9 密码明⽂传输
  ⼀般在前端页⾯表单提交的时候,⽤户输⼊密码是明⽂的。在服务器没有配置SLL证书(https)的情况下,必须先进⾏加密操作再提交,参数传递到后台接收后再进⾏解密操作。服务器配置SLL证书(https)可以⾃动进⾏加密传输,安全性更⾼。
7.10 使⽤外部⽂件
  在前端页⾯中,禁⽌引⼊其他⽹站的静态⽂件(javascript、css、⽹络图⽚等),如果需要⽤到,必须下载到本地,使⽤相对地址引⼊⽂件。使⽤本地静态⽂件的优点:加载更快,安全,确保不失效。
7.11 密码安全
  禁⽌将明⽂密码存储在数据库中,所有密码必须加密处理,防⽌⽤户数据被导出造成密码泄露。禁⽌在⽇志、调试信息⽂件、cookies 中记录密码⼝令、银⾏账号、通信内容等敏感数据。为了保障帐号的安全,所有密码的长度强制限制在6位以上。
⼋、并发和⼤流量处理
8.1 重复提交
  为了防⽌⽤户在提交表单时重复提交,表单必须设置提交验证。例如商城提交订单时,必须防⽌⽤户重复提交。Thinkphp框架中提供表单令牌的功能可以防⽌重复提交,原⽣php也可以在打开页⾯前⽣成token,并保存在session,然后将token传递到页⾯表单字段,在表单提交时将token⼀起提交,在后台接收时验证token,验证后销毁session的保存的token。
8.2 session
  ⼀次性验证的session使⽤后必须销毁,例如短信验证,表单验证等,防⽌⼀次性session被重复利⽤,例如在⽤户在注册时如果不销毁短信验证码session,⽤户可以⽤同⼀个短信验证码注册多个账号。
8.3 并发
  并发处理会经常碰到,例如商城秒杀功能,如果不做好并发处理,那么同⼀件商品江湖被多个⽤户购买。并发的处理⽅案可以考虑以下⽅案:
(1)锁表操作,缺点是并发数⽐较⼤的时候回造成系统卡顿。
(2)队列
(3)负载均衡
(4)数据库读写分离
(5) 使⽤Nginx作为http服务器
8.4 缓存
  对于经常需要访问的数据库数据,可以使⽤缓存来提⾼访问速度,读取缓存⽂件数据币数据库查询要快得多,主要缓存技术有:
(1)Thinkphp⾃带的S()⽅法
(2)⽂件读写,这个⽅法主意数据的加密确保安全性
(3)Memcached

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。