阅读:2506回复:0
PHP安全编码
译自:《Pro PHP Security》
验证过滤用户的输入 即使是最普通的字母数字输入也可能是危险的,列举几个容易引起安全问题的字符: ! $ ^ & * ( ) ~ [ ] | { } ' " ; < > ? - `在数据库中可能有特殊意义的字符: ' " ;还有一些非打印字符: 字符x00或者说ASCII 0,NULL或FALSE 字符x10和x13,或者说ASCII 10和13,n r 字符x1a或者说ASCII 26,表示文件的结束 输入错误的参数类型,也可能导致程序出现意想不到的错误。 输入过多的参数值,可能导致溢出等错误。 PHP中验证用户的输入 这里特别要注意php.ini中的register_globals的设定,在早期的php版本中是默认开启的,这会导致很严重的安全问题: #!php上面这段代码看起来是安全的,但是如果register_globals开启了的话,在访问的url中加入?admin=1即可绕过前半部分的逻辑判断。 更安全的代码应该给$admin赋默认FALSE值: #!php早期人们开发调试的时候发现使用register_globals有极大的便利,所以早期的php版本中默认开启。 但是随着越来越多的安全问题,从php 4.2.0开始,register_globals变为了默认关闭。 当你发现register_globals是on的时候,你可能会在脚本当中加入如下代码使其关闭: #!phpini_set('register_globals', 0);但实际上,当所有的全局变量已经创建了之后,以上代码并不会起到作用。 但是你可以在文档的根目录下的.htaccess的文件中加上下面这一行: php_flag register_globals 0变量声明:强烈建议总是事先声明变量。 检查输入的类型,长度和格式: 字符串检查:在PHP中,字符串几乎可以是任何事情,但有些值并不是严格的字符串类型,可以用is_string()函数来确定。 有些时候你不介意数字作为字符串,可以用empty()函数。 数字类型检查:使用is_int()函数或者is_integer()或is_long(),例如: #!php$year = $_POST['year'];if (!is_int($year))exit("$year is an invalid value for year!");也可以使用gettype()函数判断类型后做处理: #!phpif (gettype($year) != 'integer') {exit("$year is an invalid value for year!");}至少还有三种方式可以吧$year变量转变为整数: #!php$year = intval($_POST['year']);$year = ( int ) $_POST['year'];if (!settype($year, 'integer')) {exit("$year is an invalid value for year!");}如果允许浮点型与零的值,可以使用is_numeric()函数来做判断。 判断一个值是否为布尔型的时候使用is_bool()函数。 下表是对各种类型变量使用各函数判断的结果: 图片:2014091811222282173.jpg 检查字符串的长度使用strlen()变量: #!phpif (strlen($year) != 4) exit("$year is an invalid value for year!");概括总结一下PHP中类型,长度,格式等验证: #!php |
|