转自:http://www.nowamagic.net/librarys/veda/detail/2076

 

1.关闭register_globals,以提高安全性

2.在部署环境,不要让不相关的人看到报错信息,可以如此设置:

ini_set('error_reporting', E_ALL | E_STRICT);
ini_set('display_errors', 'Off');
ini_set('log_errors', 'On');
ini_set('error_log', '/usr/local/apache/logs/error_log');
或者设置错误处理函数:
set_error_handler('my_error_handler');
function my_error_handler($number, $string, $file, $line, $context)
{
$error = "= == == == ==\nPHP ERROR\n= == == == ==\n";
$error .= "Number: [$number]\n";
$error .= "String: [$string]\n";
$error .= "File: [$file]\n";
$error .= "Line: [$line]\n";
$error .= "Context:\n" . print_r($context, TRUE) . "\n\n";
error_log($error, 3, '/usr/local/apache/logs/error_log');
}

3.深度防范/最小权限/简单就是美/暴露最小化原则

4.平衡风险与可用性/跟踪数据

5.过滤用户输入

    1)识别输入:_GET/_POST/_SERVER,session,数据库
    2)过滤输入:防止非法数据进入你的应用,并且只做检查,不做纠正,提高安全性
    3)区分已过滤及被污染数据:利用一个$clean数组来保存过滤后的数据,但是需要做两件事情:
        a.经常初始化该数组为一个空数组
        b.加入检查及阻止来自外部数据源的变量命名为clean

6.对输出要转义

    1)识别输出:echo/print/printf/<?=
    2)过滤输出:htmlentities/htmlspecialchars/mysql_real_escape_string/addslashes
    3)区分已转义及未转义数据:利用一个$html数组来保存转义后的数据

7.利用session相关机制来避免URL语义攻击

8.防御文件上传攻击

    1)限制上传大小:upload_max_filesize/post_max_size
    2)对缓存区的数据进行确认:is_uploaded_file/move_uploaded_file/filesize
9.利用"过滤输入,转义输出"的原则来降低XSS攻击的风险

10.利用POST和Token来降低CSRF的风险

    特别需要指出的是,习惯上GET与HEAD方式不应该用于引发一个操作,而只是用于获取信息。这些方式应该被认为是‘安全’的。客户浏览器应以特殊的方式,如POST,PUT或DELETE方式来使用户意识到正在请求进行的操作可能是不安全的

11.不要使用HTTP的头中的Referer,而是采用过滤输入的方式来避免欺骗表单的提交

12.还是采用过滤输入的方式来避免欺骗HTTP的接受

13.不要将配置文件放在根目录,也不要采用其他的特殊后缀名,防止暴露配置信息

14.利用"过滤输入,转义输出"的原则来降低SQL注入风险

    1)利用参数化查询语句
    2)配置magic_quotes_gpc自动对GET和POST数据进行addslashes处理

15.通过防止CSRF漏洞和修复暴露cookie的浏览器漏洞相结合来防止cookie盗窃

16.Session回话固定

    SessionID是浏览器和后台交易的基础,浏览器可以通过固定或者捕获的方式来获得该数值,有以下几种防御方式:
    1)可以在权限等级变化时,利用session_regenerate_id来每次重新生成
    2)修改PHPSESSID,改成一些没有规律的名称
    3)比较每次请求的$_SERVER['HTTP_USER_AGENT'],不同就有嫌疑
    4)采用更为俺安全的SSL,防止信息被泄露

17.源代码的暴露

    1)对包含文件使用非常用的扩展名,例如:inc等
    2)包含文件保存在网站主目录下
    3)Apache未设定.inc文件的类型
    4)Apache的默认文件类型是text/plain 

18.为了阻止文件名被操控,当然最有效的方法就是过滤输入,此时之外,还有以下几个方法

    1)没有路径信息的文件名,用basename过滤
    2)允许有路径信息但想要在检测前把它化简,用realpath过滤
    3)还可以用pathinfo来获得路径信息
    4)关闭allow_url_fopen,不能用include/require访问远程文件

19.通过限制登录次数或登录间隔,来限制暴力破解攻击

20.攻击者可以用抓包软件来嗅探用户密码,最好的方法是采用HTTPS

21.攻击者得到密码后,就可以进行重播攻击,可以采取的防御为

    1)避免受保护资源永久访问权的的使用
    2)避免受保护资源访问权的临时性

22.如果非要进行永久访问权的使用,可以采用的方法为

     在username和password的基础上,加上identifier/token/timeout字段,加如二次验证
1)生成
$salt = 'SHIFLETT';
$identifier = md5($salt . md5($username . $salt));
$token = md5(uniqid(rand(), TRUE));
$timeout = time() + 60 * 60 * 24 * 7;
setcookie('auth', "$identifier:$token", $timeout);

2)验证

$clean = array();
$mysql = array();
$now = time();
$salt = 'SHIFLETT'; list($identifier, $token) = explode(':', $_COOKIE['auth']);
if (ctype_alnum($identifier) && ctype_alnum($token))
{
$clean['identifier'] = $identifier;
$clean['token'] = $token;
}
else
{
/* ... */
} $mysql['identifier'] = mysql_real_escape_string($clean['identifier']);
$sql = "SELECT username, token, timeout
FROM users
WHERE identifier = '{$mysql['identifier']}'";
if ($result = mysql_query($sql))
{
if (mysql_num_rows($result))
{
$record = mysql_fetch_assoc($result);
if ($clean['token'] != $record['token'])
{
/* Failed Login (wrong token) */
}
elseif ($now > $record['timeout'])
{
/* Failed Login (timeout) */
}
elseif ($clean['identifier'] != md5($salt . md5($record['username'] . $salt)))
{
/* Failed Login (invalid identifier) */
}
else
{
/* Successful Login */
}
}
else
{
/* Failed Login (invalid identifier) */
}
}
else
{
/* Error */
}
3)退出
setcookie('auth', 'DELETED!', time());

23.尽量将Session数据保存在Mysql或Memcache中,减少因文件被操控后被猜中后泄露和操控的机会

24.PHP安全模式生效时,PHP会对正在执行的脚本所读取(或所操作)文件的属主进行检查,以保证与该脚本的属主是相同的,他是一种深度防范

PHP安全编程的更多相关文章

  1. 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代

    2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...

  2. JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议

    软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...

  3. 读书笔记:JavaScript DOM 编程艺术(第二版)

    读完还是能学到很多的基础知识,这里记录下,方便回顾与及时查阅. 内容也有自己的一些补充. JavaScript DOM 编程艺术(第二版) 1.JavaScript简史 JavaScript由Nets ...

  4. [ 高并发]Java高并发编程系列第二篇--线程同步

    高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...

  5. C#异步编程(一)

    异步编程简介 前言 本人学习.Net两年有余,是第一次写博客,虽然写的很认真,当毕竟是第一次,肯定会有很多不足之处, 希望大家照顾照顾新人,有错误之处可以指出来,我会虚心接受的. 何谓异步 与同步相对 ...

  6. UE4新手之编程指南

    虚幻引擎4为程序员提供了两套工具集,可共同使用来加速开发的工作流程. 新的游戏类.Slate和Canvas用户接口元素以及编辑器功能可以使用C++语言来编写,并且在使用Visual Studio 或 ...

  7. C#与C++的发展历程第三 - C#5.0异步编程巅峰

    系列文章目录 1. C#与C++的发展历程第一 - 由C#3.0起 2. C#与C++的发展历程第二 - C#4.0再接再厉 3. C#与C++的发展历程第三 - C#5.0异步编程的巅峰 C#5.0 ...

  8. 猫哥网络编程系列:HTTP PEM 万能调试法

    注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...

  9. 关于如何提高Web服务端并发效率的异步编程技术

    最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...

  10. 异步编程 In .NET

    概述 在之前写的一篇关于async和await的前世今生的文章之后,大家似乎在async和await提高网站处理能力方面还有一些疑问,博客园本身也做了不少的尝试.今天我们再来回答一下这个问题,同时我们 ...

随机推荐

  1. javascript 对象的复制

    1. jQuery has a method that can be used to deep-clone objects, the$.extend() function. Let’s take a ...

  2. php命名空间如何引入一个变量类名?

    例子如下: $className = 'Test'; 正常 new \Require\allClass\Test(); 当然OK,但是 new \Require\allClass\$className ...

  3. apache虚拟目录设置

    <VirtualHost *:80> DocumentRoot "/xampp/htdocs/f" ServerName f.e-elitech.net</Vir ...

  4. FM收音机 RDS的强大功能

    FM收音机 RDS的强大功能 分类: MTK2011-04-26 16:06 14889人阅读 评论(6) 收藏 举报 交通公告体育音乐娱乐教育 前言 随着发展,会有越来越多的电台具有RDS广播功能, ...

  5. COCOS2DX遇到的问题

    1 新增类无法在别的类里面include到的问题: 去项目-> 配置属性-> C/C++-> 常规-> 附加包含目录中增加类的文件夹路径 2 新增类出现 extensions\ ...

  6. H3C inode for OSX 10.10 校园网客户端亲测可用

    1.打开终端 2.输入以下命令 sudo /library/StartupItems/iNodeAuthService/iNodeAuthService start 3.输入管理密码 4.打开客户端联 ...

  7. HDU 5621 KK's Point

    N个点中任意选取四个点,就能产生一个圆内的交点,所以圆内总共有C(N,4)个交点,圆上有N个,相加就可以了. 注意:组合数运算的时候会爆longlong,中间先除一下就可以了. #include &l ...

  8. LPC2478内存布局以及启动方式

    LPC2478 是NXP公司推出的一款基于APR7TDMI-S的工控型MCU,内置RAM与flash,同时提供外部扩展flash和ram接口,拥有LCD控制器,其内存布局如下所示 其中Flash高达5 ...

  9. Android.mk文件详解(转)

    源:Android.mk文件详解 从对Makefile一无所知开始,折腾了一个多星期,终于对Android.mk有了一个全面些的了解.了解了标准的Makefile后,发现Android.mk其实是把真 ...

  10. Java Web EL JSTL的用法

    1.导入包 fastjson-1.2.2.jar 2.JSP文件加入 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" p ...