安全性设计

PHP中的变量不并不像C语言那样需要事先声明,解释器会在第一次使用时自动创建他们,同样类型也不需要指定,解释器会根据上下文环境自动确定。从开发人员的角度来看,这无疑是一种极其方便的处理方法。一个变量被创建了,就可以在程序中的任何地方使用。这导致的结果就是开发人员工经常不注意初始化变量。因此,为了提高程序的安全性,我们不能相信任何没有明确定义的变量。所有的变量在定义使用前要初使化以防止恶意构造提交的变量覆盖程序中使用的变量。

不要相信任何客户端提交的数据是安全的。(包括:$_GET、$_POST、$_COOKIE、$_FILES、$_SERVER、$_REQUEST)

其他细节问题

包含调用

包含调用程序文件,请尽量使用require,以保证效率。必要情况下,如难以避免的重复调用时可以使用require_once。

包含调用缓存文件,由于缓存文件无法保证100%正确打开,请使用 include_once 或 include。在必要时,可以使用 @include_once 或 @include 的方式,以忽略错误提示;

包含和调用代码中,须以 IA_ROOT . '/'开头,应避免直接写程序文件名(例如:require_once 'x.php';)的做法;

所有被包含和调用的程序文件,包括但不限于程序、缓存或模板,通常其不能被直接URL请求。程序通过在 IA_ROOT/source/bootstrap.inc.php中定义一个标记性常量IN_IA,来判断程序是否被合法调用。因此,在除了IA_ROOT/source/bootstrap.inc.php以外的任何一个被包含和调用的程序文件中,需要包含以下内容,以使得访问者无法直接通过URL请求该文件:

if(!defined('IN_IA')) { exit('Access Denied');}

错误报告级别

在软件开发和调试阶段,修改 /data/config.php 中的 $config['setting']['development'] = 1;,打开错误报告以便能够报告程序中所有的错误、警告和提示信息,以帮助开发者检查和核对代码,避免大多数安全性问题和逻辑错误、拼写错误。

在软件发布时,请修改 /data/config.php 中的 $config['setting']['development'] = 0;,来关闭错误报告,以利于用户使用并将无谓错误提示信息降至最低。

其他注意要点

正则表达式操作请使用perl兼容正则表达式,即preg_ 系列的函数。以提升效率。

尽量使用高版本的函数。

本项目不使用命名空间,因此需要按照传统的方式使用文件名和文件夹来规划代码结构。

数据库设计

表和字段命名

所有数据表名称,只要其名称是可数名词,则必须以复数方式命名,例如:ims_members(用户表)、ims_rules(规则定义表);

存储多项内容的字段,或代表数量的字段,也应当以复数方式命名,例如:params(parameters,参数个数)、views(查看次数)、replies(回复次数)。

当几个表间的字段有关连时,要注意表与表之间关联字段命名的统一,如 ims_rule_keywords表中的rid与ims_rules表中的rid。

代表id自增量的字段,通常用以下几种形式:

最常用的核心id,或经常在URL中进行调用的,尽量用简写的形式,例如rid、weid、uid;

有功能性作用,URL中偶尔用到的id,使用全称的形式,例如pluginid;

没有功能性作用,只为管理和维护方便而设的id,可以使用全称的形式,也可只将其命名为id。

所有与表、字段相关的命名,请参考本系统现有字段的命名方式,以保证命名的系统性和统一性。

字段结构

基于效率的考虑,所有字段均不能为空,即全部NOT NULL,可以设置默认值来代替。

预计不会存储非负数的字段,例如各项id、统计数等,必须设置为UNSIGNED类型。UNSIGNED类型比非UNSIGNED类型所能存储的正整数范围大一倍,因此能获得更大的数值存储空间。

储开关、选项数据的字段,通常使用tinyint(1)非UNSIGNED类型,少数情况也可能使用enum()结果集的方式。tinyint作为开关字段时,通常1为打开;0为关闭;-1为特殊数据,例如N/A(不可用),高于1的为特殊结果或开关二进制数组合。

任何类型的数据表,字段空间应当本着足够用,不浪费的原则。MEMORY/HEAP类型的表中,尤其要注意规划节约使用存储空间,这将节约更多内存。

SQL语句

所有SQL语句中,除了表名、字段名称以外,全部语句和函数均需大写,应当杜绝小写方式或大小写混杂的写法。例如select * from ims_members;是不符合规范的写法。

很长的SQL语句应当有适当的断行,依据JOIN、FROM、ORDER BY等关键字进行界定。

通常情况下,在对多表进行操作时,要根据不同表名称,对每个表指定一个1~2个字母的缩写,以利于语句简洁和可读性。

运算与检索

数值运算一般比字符串运算更快。例如比较运算,可在单一运算中对数进行比较。而串运算涉及几个逐字节的比较,如果串更长的话,这种比较还要多。

如果串列的值数目有限,应该利用普通整型或emum类型来获得数值运算的优越性。

更小的字段类型永远比更大的字段类型处理要快得多。对于字符串,其处理时间与串长度直接相关。一般情况下,较小的表处理更快。对于定长表,应该选择最小的类型,只要能存储所需范围的值即可。例如,如果mediumint够用,就不要选择bigint。对于可变长类型,也仍然能够节省空间。一个TEXT 类型的值用2 字节记录值的长度,而一个LONGTEXT 则用4字节记录其值的长度。如果存储的值长度永远不会超过64KB,使用TEXT 将使每个值节省2字节。

性能优化

主要分为:表结构优化,索引优化,查询优化。取决于开发人员经验和个人能力。不详述。


返回

条结果""