xcache_gets, 让 xcache 再快一点.

偶不想写关于如何安装 php extension 的科普文章.
patch here

(你不会打 patch? 汗… :D )

原形:
array xcache_gets(array keys [, &array failed_keys])

样例:

xcache_set('test1','1');
xcache_set('test2','2');
xcache_set('test3','3');
$result = xcache_gets(array('test1','test2','test3','test4'), $unget);
var_dump($result);
var_dump($unget);

结果:


array(3) {
["test1"]=>
string(1) "1"
["test2"]=>
string(1) "2"
["test3"]=>
string(1) "3"
}
array(1) {
[0]=>
string(5) "test4"
}

你知道它应该怎么用吗? :D

====

此外, 类似的有
mixed apc_fetch( string $key / array $keys)
array Memcache::get ( array $keys [, array &$flags ])

ps:
patch 仅经过少量非严格测试. 没事的同学慎用.

Tags:
Comments (1)

安全安全再安全(3): 保护系统的安全感

偶不想说这所谓的”安全感”来自何处.

“是个保护系统就要占资源” :D

=====

mod_security: 基于规则的过滤. 功能强大, 规则很晕.
规则包更新较快.

phpids(PHP-Intrusion Detection System):
基于过滤规则的开源防护系统. 仔细看了下规则, 有点晕. :D
规则包更新速度极快. 个人还是相当推荐的, 虽然偶不需要.

suhosin(hardened-php):
安装复杂, 性能有 10% 左右下降, 保护的主要是程序和系统. 漏洞被发现之后, 能够减轻漏洞的影响.

=====

firewallscript 和 phpids 类似的商业软件, (主程序 php 37k, 有漂亮的管理程序, $120, 没有测试).
slashdot & techcrunch 有介绍.
号称 100% 保护. (DDOS, XSS, SQL injection, 内容提交可以通过 Akismet 过滤, 可以打开 Captcha… 倒是够全)
定期提供过滤规则包.

个人认为 firewallscript 和 mod_security 的防护水平是同一级别的(规则包说明一切, 虽然见不到).
如果考虑到那个管理程序的功能和扩展性(当然还有适用人群), firewallscript 大概对得起价钱.

=====

ps:
wordpress 有插件 Bad Behaviour. 具体原理就不说了. 规则固化在代码里, 随插件更新而更新.
实际上 bad behaviour 也能保护其它软件. 不过具体效果… 就不好说了 :D

ps2:
国内的空间商通常会装一种 “信息监控拦截系统”.
有一定的保护作用(特别是所谓的关键词), 经常误报, 也经常漏报. 国内的黑客们应该对它们很熟悉了.
用一点点普通的 sql 手法就可以跳过它们.
而且好像这些系统对 XSS 好像没什么效果.

标题中的 “安全感” 是什么意思? 就这个意思.

Tags: ,
Comments (1)

安全安全再安全(1): 乱, 大杂烩

写在前面: 地震已经发生了, 关注你需要关注的, 一直盯住一种或两种固定的媒体总会出问题.

mod_security:
(实话说 mod_security 令人恶心.)

SecFilterOutput On
SecFilterSelective OUTPUT "<?php" log,deny

注: 如果你正常想输出的话, HTML 代码中应该是 “&lt;?php” (偶是手写的, 应该没错?)


<ifmodule !mod_php.c>
<filesmatch ?.php$?>
Order allow,deny
Deny from all
Allow from none
</filesmatch>
</ifmodule>

DefaultType application/x-httpd-php

<?php include( 'a/path/outside/wwwroot/config.php'); ?>

=======

htpasswd generator:
(应该没人想过它是这么做的? 不相信某些网站的 htpasswd 生成器的同学看过来.
不过这样的东西, 显而易见的漏洞. 如果跑字典的话, 对一个密码需要生成 64^2 = 4096 个对应的加密值)

代码未经严格测试.

function htaccess_verify($pass1, $pass2) {
return (crypt($pass1,substr($pass2, 0, 2)) === $pass2);
}
function htaccess_gen($user, $pass, $salt='') {
$rand64= "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
srand((double)microtime()*1000000);
$random=rand();
if (!$salt) $salt=substr($rand64,$random % 64,1).substr($rand64,($random/64) % 64,1);
$salt = substr ($salt, 0, 2);
echo $user. ':' . crypt($pass, $salt);
}

=======
disabled_functions:
system,passthru,shell_exec,exec,proc_open,popen
virtual,getmyuid,getmypid,getenv,putenv,get_current_user –至少偶能看出来用没用 suexec 一类的东西
pcntl_exec,pcntl_fork — 推荐不编译.
ini_restore,ini_set,ini_get,ini_get_all,get_cfg_var –get_cfg_var,ini_get,ini_get_all 存疑, ini_alter= ini_set.
chmod,chown,chgrp — 存疑
leak
set_time_limit
php_uname,phpinfo
fsockopen,pfsockopen
highlight_file — show_source
ftp_connect,ftp_ssl_connect –ftp, sftp(if openssl available)
shmop_open –shmop
socket_create — socket
curl_init –curl 是安全隐患, 能够跳过 open_basedir, allow_url_fopen.

mail –偶从来不配这样的环境, 不过…
tmpfile — 受 open_basedir 影响, 偶不用 :D
extension_loaded, dl —-如果需要加载的话… :(
syslog,openlog –偶是不封的, 大量应用.

什么? 懒人? ok.

一般:
system,passthru,shell_exec,exec,proc_open,popen,virtual,getmyuid,getmypid,getenv,putenv,
get_current_user,pcntl_exec,pcntl_fork,ini_restore,ini_set,leak,fsockopen,pfsockopen,
highlight_file,ftp_connect,ftp_ssl_connect,shmop_open,socket_create

增强:
ini_get,ini_get_all,get_cfg_var,php_uname,phpinfo,curl_init,tmpfile,chmod,chown,chgrp,set_time_limit

另外几个存疑:
set_error_handler –自己写函数输出?
track_errors = 0 ?

(看的资料还太少, 估计这些也不够完整)
=======

allow_url_fopen = 0
display_errors = 0
error_log = “syslog” –这可是个大好的习惯.

=======

开发用的机器嘛, 统一 Apache(装偶挑选的性能/调试相关的 ext) , 使用一般的 disabled_functions.
docref_root 设置成内部镜像 or cn.php.net/cn2.php.net (这两个在偶这里都很快…)

=======

需要 disable eval 的环境, 使用 suhosin(hardened-php):
suhosin.executor.disable_eval

Tags: , ,
Comments (3)

Taint support for PHP

Taint, (污点检测).
防止未过滤的(文本)数据进入 HTML, SQL, Shell (命令/参数), 文件名等.

对 Perl 熟悉的同学应该知道, 从 Perl 5.8.0 起, perl 支持 taint mode.
-t enable tainting warnings
-T enable tainting checks

例如如下代码:

#!/usr/bin/perl

my $arg=shift; # 从命令行得到变量
sys-tem($arg); # 执行 :D (去掉那个横线, 否则? ...)

如果加上 -t:

Insecure $ENV{PATH} while running with -t switch at XXXX line Y.
Insecure dependency in system while running with -t switch at XXXX line Y.

需要特别注意:
透过正则表达式得到的变量能够通过这样的检查,
但是这样的检测不能分辨那些不能起到过滤作用的正则表达式.

===

2007.8.22, CORE GRASP, 一个需要打在 php-5.2.3 的 patch,
通过对字符串变量的逐字符标记, 给 php 增加了 taint mode (仅能保护 mysql_* 函数).
– 由于太过时, 而且功能不全, 所以就不给出具体地址了.

2008.4.23, 另一种 taint mode 的实现, php-5.2.5 patch, 来自 IBM.
(见 php wiki. http://wiki.php.net/rfc/taint)

在通过 php.ini 或脚本(ini_set) 开启 taint mode 后, 未过滤的字符串变量将会得到类似这样的提示:
Warning: echo(): Argument contains data that is not converted with htmlspecialchars() or htmlentities() in /path/to/script on line 3

常见的过滤方式:
HTML: htmlspecialchars(), htmlentities()
Shell: escapeshellcmd(), escapeshellarg()
Mysql: mysql_escape_string(), mysql_real_escape_string()
(数据库对应函数, addslashes 等)
正则表达式: preg_quote()

副作用: $_SERVER['SCRIPT_FILENAME'] 等安全的变量被误判, 可以用 untaint().
– untaint 操作要慎用 :D

===

taint 可以解决一些过滤问题(比如多数的 SQL 注入, 部分 XSS). 不过它当然不是万能的.
先有良好的安全意识, 再加上一些合适的工具做适当检测, 打造安全的运行环境并非不可能.

=== 正文结束 ===

ps:
Ruby 好像也有类似的支持.
python 有人写了类似的东西.

ps2:
开发用的机器上的环境, 都应该打大量的补丁, 性能, 安全, 一个都不能少.
– 你要一个列表? 抱歉, 暂时没整理出来. 想整理大概会比较困难.

ps3:
Firewall Script, 谁有钱, 谁去买… 估计应该会有用.

ps4:
接上篇文章,
对于这样的文章, 信息渠道是偶独有的, 如果通过正常的途径, 把这样的东西找出来, 应该是费时费力的.
非常不幸的是偶写这样的文章, 如果出现了什么问题, 大概也不会有什么人能够给偶纠错/更新,
这也是偶不喜欢写这类东西的原因.

内容时效性的提示, 仅仅是一个开始.

Tags: ,
Comments (2)

PHP 实践 Security Checklist

对照观看.
制作安全网站的 checklist

1 SQL
1.1 绑定可使用 PDO, 或者自己写的框架之类, 这个你随便 :D

Method #1:

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

Method #2:

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);

Method #3:

$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?");
if ($stmt->execute(array($_GET['name']))) {

1.3 error_reporting() 设置为合适的级别.
1.4 mysql 方面设置过详细的权限对性能有一定影响, 还是自己好好写程序吧 :D
(这些权限的设置, 要对 mysql 数据库中,
user, db, host, tables_priv, columns_priv, procs_priv 表中的一个或多个进行查询)

2 命令行注入
(希望大家没人这么干 :D )

3 路径名问题
3.1 诸如 ../ 这样的都会过滤吧 :D
3.2 open_basedir, ***注意 curl 能够跳过这个限制***.
3.3 实际上这个也相当重要, 权限当然是越低越好了.
比如 uploadfiles/ 这类目录不应该给任何的执行权限.
apache 你知道怎么做吧? (以下代码未经测试.)

<Directory /uploadfiles>
php_flag engine off
</Directory>

如果还不过瘾, 可以使用 fstab 的限制方法.
限制都是有用的(4): Linux 的大洞不用补

4 会话管理
4.1 会话 ID 一般都和 uniqid() or md5() or sha1() 有关. — 这个相当笼统, 自己理解去吧…
一个相当好的会话 ID 样例: md5(uniqid(rand(), true));
4.2 URL 最容易被截取, 当然, 事实上 Cookies 和 URL 的截取, 难度是相近的.
4.5 秘密信息过期时间也成为了一个问题. 可以考虑生成时间戳相关的秘密消息.
例如 timestamp=xxx&hash=md5(timestamp . ’somesecret’. username)
– 其它方法你自己考虑去.

5 XSS
允许输入 HTML:
strip_tags (事实上应该去掉多数 attribute), 或使用相关的检测函数.

6 CSRF
6.1 问题同 4.5.

ps:
XSS & CSRF 通用方法: 找一个叫 caja 的东西去吧…
(偶没用过, 具体好不好用还要你说了算 :D )

ps2:
会日语的同学, 原版更好看.
安全なウェブサイトの作り方 改訂第3版

ps3:
应该都在关注 mysql uc 2008 吧, 偶偏不写, 偏不写 :D

Tags: ,
Comments (1)

new 30 days(22): php day 2

写好代码的同时还要短一点, 当然并不是越短越好,
短不一定好读,但好读的一定会短.
优良的算法也应该是短代码的保证吧.
6 PHP coding tips to write less code

各式各样的代码规范见多了. 你遵守了多少? 违反了多少?
PHP coding guidelines

根据c++ coding standard 写成的php coding standard.
php5 的 OOP 方面有了很大进步, 这一点文章中没有提到, 因为长期没有更新了…
还有关于HTTP_*_VARS也没更新,仍不失为好材料..
PHP Coding Standard

写出什么样的代码,就应该得到相应的报酬.
毋庸置疑,同时注意到安全,性能,扩展,易读… 的代码肯定是好代码.
前期的付出,后面的维护就会轻松许多吧.
SitePoint Blogs – Good and Bad PHP Code

许多有意思的东西已经有无数人做过了,
不要重新制造轮子, 多数情况下都能在这里找到.
偶自己最成功的利用就是一个(无须extension的) zip 解压器,
也因为有这样一个地方,许多项目(比如论坛)公然违反GPL,
当然了,开源对他们只是一个推进商业的行为.
Welcome to the PHP Classes Repository – PHP Classes

Tags: ,
Comments

new 30 days(21): php day 1 – coding & functions

基本上这些篇都是函数的对比.但同样是对比,或多或少都还是有不同的.

1 call_user_func 慢.
2 类的magic method全都慢.
3 通过类的读取慢
4 Iterators 慢
Benchmarking magic | GarfieldTech

这个就更清晰了.
自己去慢慢比较,偶并不想说什么.
BlueShoes: PHP Benchmark

虽然许多hacks并不常用,还是看一看?
40 Tips for optimizing your php Code

事实上这是篇再老不过的东西了. 个人认为不如上一篇,虽然这是从 presentation 中提取的.
12 PHP optimization tips – alex.moskalyuk

一组幻灯片, 有点包罗万象的感觉, 不过真正实际做的时候还是有区别的.
Accelerating PHP Applications

函数比较, 这些和上面的某些一样就像是细节性的东西.
开发完了没bug了再去试试吧.
比较列表:
sizeof vs count
is_int vs is_integer
chop vs rtrim
doubleval vs floatval
fwrite vs fputs
implode vs join
ini_alter vs ini_set
7 tips for lightning fast PHP sites
Updated: Better Benchmarks

Tags: ,
Comments

让 Wordpress 2.2 工作在 SQLite 平台

链接已失效, 只维护英文版本的文章.

English: Get WordPress 2.2 working with SQLite

原始(For Wordpress 2.0 Only)
源码以 GPL 协议发布.

环境要求:

运行中的 PHP 安装. 有 SQLite 支持
(暂不支持 PDO_SQLite)

运行情况:

基本上都能工作吧 :D
Read the rest of this entry »

Tags: ,
Comments (5)

中国php人才缺口缘何产生? (And my OPML share)

Updated:(2007.7.8)
(续)关于php人才的讨论,兼答问题.

最近的一个什么调查显示php人才供不应求.

首先重申偶的一个原则,抓问题要抓根本.

donews中的一篇文章(抱歉,偶忘了是哪篇了…)提了4个要点.

1. 人才储备不足 – M$,Sun两家独大
2. 培训体系的不健全 – 自学,网络为主
3. Web开发技术发展迅速的结果 – Web2.0,ajax,高负载…
4. 人才对PHP的认知程度肤浅 – 喜欢.net,Java的大有人在.

可惜这些都不是根本原因.

就针对这4条,一个一个驳回去.
Read the rest of this entry »

Tags:
Comments (11)

Get WordPress 2.2 working with SQLite (Updated: 2.2.2)

This code is no longer maintained.

Please use PDO for Wordpress instead.

This wordpress for sqlite patch is based on tume and havarddahle’s work.
Mysql – Sqlite SQL Parse Code comes from tikiwiki project.

Original Version(For Wordpress 2.0 Only)

The previous version can be found here, based on Hasin’s work, Wordpress for SQLite
(For Wordpress 2.0 Only :( )

This source code is released under the terms of the GNU Public License.

It will never go into the Wordpress release,
but it is REALLY easy to get wordpress working with sqlite.

only SQLite 2(2.8.16) have been tested.
Almost Everything works well.

Chinese version
Read the rest of this entry »

Tags: ,
Comments (18)

Page 1 of 3123