Moodle 程序编写准则 - 安全问题(处理表单和URL数据)

不要依靠“register_globals”。每个变量必须在每个源文件里正确初始化。变量的来源必须显而易见

初始化所有的数组和对象,即使它是空的。$a = array()或$obj = new stdClass();。

不要使用optional_variable()函数。使用optional_param()函数来替代。根据数据类型选择正确的PARAM_XXXX值。使用set_default()函数检查和设置变量的可选值。

不要使用require_variable()函数。使用required_param()来替代。根据数据类型选择正确的PARAM_XXXX值。

不要使用$_GET、_POST或_REQUEST。根据您的需要使用更合适的required_param()或optional_param()

检查一个动作时,不要使用像if (isset($_GET[‘something’]))这样的代码。可以使用诸如:$something = optional_param( ‘something’,‘’,PARAM_ALPHA ),并且用empty()函数或(如果’empty’也是一个合法值)isset_param()函数测试

在任何可能的情况下,把您所有的required_param()、optional_param()和其它的变量初始化一起放在每个文件的开头,这样它们会更容易被找到。

使用“sesskey”机制保护表单处理函数不被攻击。简单示例:当生成表单的时候,要包含。使用表单时用if (!confirm_sesskey()) {error(‘Bad Session Key’);}检查。

所有文件名必须用clean_filename()函数“过滤”,但如果已经适当地使用required_param()或optional_param()做了此项工作,则不必如此

再把任何从数据库读出的数据写回之前,必须先用addslashes()处理。一个完整数据对象可以用addslashes_object()一次性完全处理完毕。

在任何可能的情况下,存入数据库的数据必须来自POST数据(也就是来自表单的数据),而不能来自GET数据(也就是来自URL的数据)。

如果能避免的话,不要使用来自$_SERVER的数据。它会给移植性带来问题

在其它地方没有做的情况下,确保所有写入数据库的数据已经被clean_param 函数处理,并且针对数据类型,使用了恰当的PARAM_XXXX。

如果您编写了自定义的SQL代码,请确保它是正确的。尤其小心在数值周围不要丢失引号,这可能会带来SQL“注入”漏洞。

每个文件内都要检查它使用的所有数据(尤其是写到数据库的数据)的合法性。不要期盼或依赖其它地方已经检查了。

被其它文件包含的代码块应当有确切定义的PHP结构(例如类的声明、函数定义等)——直接执行的代码块建议使用变量时不要初始化。