一/092
PHP Architect’s Guide to PHP Security [3]
今天继续翻译PHP Architect’s Guide to PHP Security这本书的第三章《SQL注入》。由于第二章XSS有专门的书籍介绍,以后会专门翻译,所以暂时跳过XSS,先对SQL Injection进行介绍。
SQL注入是另一种常见的漏洞(针对XSS来说),是由于对输入数据过滤不严导致的。它不像XSS是直接针对站点的用户,而是直接破坏站点本身,特别是数据库。SQL注入的目的是插入任意数据,常常是插入一条被数据库执行的SQL语句。这些潜伏的被插入语句常常执行很多操作,从获取数据到更改或删除数据库信息。
// supposed input
$name = “ilia’; DELETE FROM users;”;
mysql_query(“SELECT * FROM users WHERE name=’{$name}’”);
这段功能本来是想从user表中获取匹配name字段的数据,一般情况下,name变量是一些字母数字和空白字符的组合,比如字符串“ilia”,但如果我们附加了查询语句,这条注入的查询语句将会删除users表中的所有记录。(幸运的是,mysql的mysql_query函数不允许堆查询,在一次调用中不允许执行多次查询,但是SQLite和postgresql扩展是可以的。
PHP的自动转义机制GPC提供了一些基本保护,如果启用了magic_quotes_gpc,将会对单引,双引等一些字符进行转义(在前面加反斜线)。但是magic quotes不包括所有需要转义的字符,并且这个特性不总是开启的。所以你需要自己用代码来阻止SQL注入。
php的很多数据库扩展有自己专门的转义机制,例如Mysql扩展的mysql_real_escape_string()函数。
if (get_magic_quotes_gpc()) {
$name = stripslashes($name);
}
$name = mysql_real_escape_string($name);
mysql_query(“SELECT * FROM users WHERE name=’{$name}’”);
在调用数据库扩展的转义机制之前,首先要对magic quotes的状态进行检查,如果magic guotes启用了,则要去掉它可能添加的反斜线,以免输入数据被转义2次。
待续。。。有点累了。
十一/081
关于drupal安全
大家都知道php编码漏洞造成的问题严重性,而drupal恰恰是用PHP实现的。幸好drupal有很多的内置方法帮我们处理一些安全方面的问题,只要熟悉就能很大程度确保安全。
form表单提交过来的数据本来是可以构造的,但drupal给我们提供了一个token机制,提交后会判断值是否为表单内置的几个值其中之一,这样就为checkbox,select等控件提供了一定安全保障。
另外drupal数据流的原则是原样保存到数据库中,输出的时候做过滤和转义。也就是说不管用户输入什么数据,包括html字符等等,只要我们使用drupal的内置db接口,就不会有问题,原样保存,输出的时候如果是文本数据用check_plain()函数做下处理,基本就没什么问题了,至于需要一些简单的样式或者需要特定的html字符,我们用filter_xss()函数即可处理。
总之,输出用户提供的数据时要格外小心,drupal的安全漏洞公告有几个模块都是因为这样的问题导致的,包括5.11版本的book模块标题没有转义。更多的安全常识和知识还要多参考php安全方面的东西,很喜欢《PHP Security Guide》中那句话:Security is a measurement, not a characteristic.
十/080
PHP Architect’s Guide to PHP Security [2]
White List Validation (白名单验证)
Being Careful with File Uploads (文件上传时要小心)
File Content Validation (文件内容验证)
Accessing Uploaded Data (访问上传数据)
The Dangers of Magic Quotes (Magic Quotes的危险性)
Magic Quotes Normalization (Magic Quotes正规化)
Validating Serialized Data (验证序列化数据)
External Resource Validation (外部资源验证)
Assumption is the enemy of security and making assumptions about user input is a sure way to allow an attacker to subvert your code. 又一次强调开发者的假设所带来的后果。对开发者来说,普遍假设selection box和check box以及radio button和hidden字段值是不用验证的,这就完全错了,
因为恶意用户可以拷贝html表单代码并且修改后来进行恶意提交任意数据。比起黑名单的概念,我们最好还是选择白名单,也就是说我们给出合法的值,然后验证是否合法;而不是给出不合法的值,验证值是否非法。显然后者不如前者来得安全。这里作者给出一个例子,说明了这个问题:
$months = array(“January”, “February”, /* … */);
if (empty($_POST[‘month’]) || !in_array($_POST[‘month’], $months)) {
exit(“Quit hacking, you’re not a lumberjack!”);
}
关于文件上传:如果你的应用程序不会使用到文件上传的特性,你可以编辑php.ini文件来禁止文件上传。
file_uploads=off
upload_max_filesize指令可以控制上传的单个文件最大值,以字节为单位。默认值为2M
post_max_size指令限制了当表单以POST方式提交的数据大小。通常情况下,这个值我们应该设置地比上面那个file_uploads稍微大一点点。如果你可能用到多文件上传,根据需要自行调整。默认值为8M。
(待补充。。。)
九/087
PHP Architect’s Guide to PHP Security [1]
这几天稍微轻松点,就再看了一次PHP Architect’s Guide to PHP Security这本经典PHP安全书籍。其中整理了一些笔记之类的东西,分享给大家。都是个人组织和翻译的东西,如果有不周到的地方还请广大安全爱好者给出批评和指正。本来想逐字翻译全文,但是这是一个浩大的工程,并且学习意义不大,所以挑选一些重要的内容进行翻译和注释。


前言和介绍就略过不翻译了,作者描述了一下PHP安全的重要性,以及为何变得如此重要。我想目前线上的很多php站点遭到攻击和破坏足以说明这点了,我们直接来看第一章Input Validation。今天先写前半章吧。(一章内容太多,本人英文比较菜,看完需要差不多3个小时)