作者:fcicq 来源:fcicq’s blog-beta 酷勤网收集 2008-04-21
对照观看.
制作安全网站的 checklist
1 SQL
1.1 绑定可使用 PDO, 或者自己写的框架之类, 这个你随便
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 方面设置过详细的权限对性能有一定影响, 还是自己好好写程序吧 
(这些权限的设置, 都要对 mysql 数据库中,
user, db, host, tables_priv, columns_priv, procs_priv 表中的一个或多个进行查询)
2 命令行注入
(希望大家没人这么干
)
3 路径名问题
3.1 诸如 ../ 这样的都会过滤吧 
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 秘密信息过期时间也成为了一个问题. 可以考虑生成两个时间戳相关的秘密消息.
– 其它方法你自己考虑去.
5 XSS
允许输入 HTML:
strip_tags (事实上应该去掉多数 attribute), 或使用相关的检测函数.
6 CSRF
6.1 问题同 4.5.
ps:
XSS & CSRF 通用方法: 找一个叫 caja 的东西去吧…
(偶没用过, 具体好不好用还要你说了算
)
ps2:
会日语的同学, 原版更好看.
安全なウェブサイトの作り方 改訂第3版
ps3:
应该都在关注 mysql uc 2008 吧, 偶偏不写, 偏不写

