3
八/09
0

编写安全的drupal代码

本文主要是参考那本经典的drupal 6 模块开发指南,接合自己对脚本安全的一点理解整理出来的,方便E文不是很好的朋友共享。

首先是文本格式转换方面的有效函数,以前的文章我也提过。check_plain()函数能安全的将用户任意输入转换为纯文本,filter_xss()函数放宽了用户的输入,可以输入一些不被过滤的html字符,既有好的样式也保证了安全性,而drupal_urlencode()则对url安全编码,比较常用,是对php的urlencode函数更好的一次封装。mime_header_encode()函数对邮件更好的编码,使用drupal_mail()函数时不需调用,已经内部应用了。

————-为database抽象层使用安全方面预留位置—————

drupal的文件安全已经在htaccess文件中做了很多限制,这个是web容器级别的安全,脚本方面我们仍然要考虑,使用文件路径前,最好调用file_check_location函数。为了避免邮件头部注入,drupal为我们引进了mime_header_encode()函数,文中提到一个很简单的例子作为参考。

如果邮件的标题(subject)是用户输入的,如果输入

Have a nice day%0ABcc:spamtarget@example.com%0A%0AL0w%20c0st%20mortgage!

邮件头部注入后则会变成:

Subject: Have a nice day
Bcc: spamtarget@example.com
L0w c0st mortgage!

一目了然。

另外,我们经常会编写独立的php文件来为drupal做一些维护或者数据迁移的工作,

include_once ‘includes/bootstrap.inc’;
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

这两行代码执行后,我们就可以在独立的php文件中使用drupal的db抽象层和相关函数,但最好我们加上uid为1的判断,只有超级用户才可以执行该php文件,如果该文件是操作发布站点数据,则这个限制更显得至关重要。

ajax的安全大家可以参考其他资料,请求脚本程序要格外小心。

最后,drupal的表单api中,title和description等元素必须check_plain()转换为纯文本,而default_value则无需,因为theme_textfield() 在includes/form.inc文件中已经调用一次了,二次转义将会使数据更加混乱。

以上只是接合drupal的安全方面简单陈述,要想更加安全你的代码,请参考更多的PHP安全方面的资料。

关键字:
4
一/09
2

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次。

待续。。。有点累了。

 

关键字: ,
8
十/08
0

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。

(待补充。。。)

关键字: ,
26
九/08
7

PHP Architect’s Guide to PHP Security [1]

这几天稍微轻松点,就再看了一次PHP Architect’s Guide to PHP Security这本经典PHP安全书籍。其中整理了一些笔记之类的东西,分享给大家。都是个人组织和翻译的东西,如果有不周到的地方还请广大安全爱好者给出批评和指正。本来想逐字翻译全文,但是这是一个浩大的工程,并且学习意义不大,所以挑选一些重要的内容进行翻译和注释。

200809261133336667

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

关键字: ,
16
九/08
1

什么是流氓黑客

今天看到一个站点公然写着:本站长期招聘网站入侵者。又在某自称国内最大黑客站点上,依我看就是一堆没素质的菜鸟聚集地,看到某“牛人”公开视频演讲,说自己已经有房有车有女人,殊不知这些钱都是广大无知的青少年朋友给他的,换来的都是一些没用的技术,没用的工具。网上浩浩荡荡的工具小子大都是从这里出来的吧,还自称什么黑日同盟,多么的可笑。穿个红裤衩就把自己漂白成红客了。人再无知,没修养不过如此,打着培训中国网络安全人才的旗号,给自己赚取大把钞票,出来的都是一些技术智障人士。

没办法,国内的网络安全意识确实不是很好。

昨天到一个内容挺多的站点,随手一测试了不得,这么大一个站点到处都是洞洞。我加了他们的站长,好心提醒,没有得到重视。随便写点js进去,跳转到我的blog,没想到一会功夫给我的blog增加了100多个ip访问量,看来确实如其站长所说:“我们站会员很活跃”。再次提醒他哪里有问题,然后为了避免流量“淹没”我的blog,想去删除掉我的那个日志,没想到没有删除功能。既然洞洞这么大,自己可以随便的删除。不过我们虽然有这个能力,但没有这个资格。大部分页面都有问题,估计这里的会员都比较“老实”,又发现这个站点的cooke机制一点加密措施都没有,配合xss可以拿到整站的会员资料,密码也是明文的。

其实脚本安全也没有我们想象中那么复杂,写程序的时候只要我们本着负责任的态度,多想想哪里可能会出问题,闲暇时候补充下自己所用语言的一些安全常识,加上多和一些资深人士多交流,出问题也不会出大的问题。没有绝对的安全,但是我们相对可以做到更好。

关键字: