转自: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. Posix消息队列实现机制

    本文是对<Unix 网络编程 卷2:进程通信>的笔记. 引言 消息队列是进程间通信的一种方式,可是如果不理解他的实现原理,会有众多不理解之处,下面就结合本书中的例子,对posix消息队列来 ...

  2. js 编码问题

    //字符转换为UTF-8编码 function encutf8(s1) { var stringArray = new Array(); for(var j=0; j<s1.length;j++ ...

  3. Android Studio的使用(三)--包不分级、修改包名

    1.如果不喜欢将包逐级展开的话,可以将每一个包名都完整展现出来,只需要勾选Flatten Packages. 2.修改包名 3.填写新的包名 4.点击确认

  4. strace 分析 跟踪 进程错误

    strace是什么? 按照strace官网的描述, strace是一个可用于诊断.调试和教学的Linux用户空间跟踪器.我们用它来监控用户空间进程和内核的交互,比如系统调用.信号传递.进程状态变更等. ...

  5. MOS管常识

    http://anlx27.iteye.com/blog/1583089 学过模拟电路,但都忘得差不多了.重新学习MOS管相关知识,大多数是整理得来并非原创.如有错误还请多多指点! 先上一张图 一. ...

  6. 在nltk中调用stanfordparser处理中文

    出现unicode decode error 解决办法是修改nltk包internals.py的java()下增加cmd的参数,cmd = ["-Dfile.encoding=UTF-8&q ...

  7. Hibernate查询之API查询

    Hibernate在检索数据上,可以使用SQL.HQL和官方API进行查询,本人主要利用API进行相关查询的小demo. 话不多少直接上demo. demo1:基本查询 /** * 默认不加任何条件的 ...

  8. ArcEngine 关于缩放至一定比例显示地图的问题

    有这一句就行了.axMapControl.get_Layer(i).MinimumScale=j;i为该图层的indexj为比例尺的分母

  9. location下的属性集锦

    location.protocol="http:"//即,协议 location.hostname="zhidao.baidu.com"//即,主机域名

  10. Jsoup使用教程

    一.解析和遍历一个HTML文档1.解析Html及Url链接 String html = "<html><head><title>First parse&l ...