小坚的技术博客

PHP开发规范

本文作者:陈进坚
博客地址:https://jian1098.github.io
CSDN博客:https://blog.csdn.net/c_jian
简书:https://www.jianshu.com/u/8ba9ac5706b6
联系方式:jian1098@qq.com

一、摘要

  这是一份旨在增强团队的开发协作,提高代码质量和打造开发基石的编码风格规范。当一个团队开始指定并实行编码规范的话,错误就会变得更加显而易见。如果一段特定的代码不符合规范的话,它有可能只是代码风格错误,而也有可能会是 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 方法和函数

  在方法和函数的上一行必须用双斜线注释注明该方法或函数的功能,在难以理解的代码语句后面适当添加注释说明,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 短信宝短信 http://www.smsbao.com/
public function smsbao($username, $password, $moble, $content)
{
$url = 'http://api.smsbao.com/sms?u=' . $username . '&p=' . $password . '&m=' . $moble . '&c=' . $content;
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 配置参数

  在配置文件中的参数设置必须注明变量含义,例如:

1
2
3
4
5
'DB_TYPE'               =>  'mysql',      // 数据库类型
'DB_HOST' => 'localhost', // 服务器地址
'DB_NAME' => 'wlldb', // 数据库名
'DB_USER' => 'root', // 用户名
'DB_PWD' => 'root', // 密码

六、编码风格规范

6.1 禁止出现多行空格

  如果不是特殊需要,在代码文件中禁止出现多行空格,例如下面这种是不允许的:

1
2
3
4
5
6
7
8
9
10
//公共方法
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语句和传递的参数直接执行,例如下面这种的写法是禁止使用的:

1
2
3
4
$id = 1;
$User = M("User"); // 实例化User对象
$User->where('id='.$id)->select(); //错误写法1
$User->where("id=$id")->select(); //错误写法2

  如果传递过来的参数含有SQL注入代码,这两种写法都是非常危险的。正确的写法有以下两种:
(1)数组条件,例如:

1
2
3
$where['id'] = 1;
$User = M("User"); // 实例化User对象
$User->where($where)->select();

或者

1
2
$User = M("User"); // 实例化User对象
$User->where(['id'=>1])->select();

(2)预处理机制,例如:

1
2
$User = M("User"); // 实例化User对象
$User->where("id=%d",$id)->select();

7.4 权限控制

  凡是需要登录之后才可以访问的页面加载页面之前必须做好登录检测,登录超时的必须重新登录。需要权限访问的页面和功能必须做好权限控制和检测。

7.5 越权访问

  比如邮件列表的页面 http://119.28.56.83/user/xq/id/5 ,只需要修改最后面的邮件id就可以直接访问的,必须加入当前用户判断,只能查看自己的邮件,禁止越权访问。

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

-------------本文结束感谢您的阅读-------------
🐶 您的支持将鼓励我继续创作 🐶