转自: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. 原创:LoadTest系列之参数时,设置提取参数的方式

    在对脚本进行参数化后,可以通过设置Data source最底层节点的属性Access Method来控制提取数据的方式. 1. 选中Data source的tables下的节点 2. 打开该节点的Pr ...

  2. Python3基础 函数 默认值参数示例

    镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...

  3. php后门屌炸天

    fputs(fopen('a.php','w'),'<?php eval($_POST[cc])?>'); php后门有很多,包子也见多了和玩多了,但是在一次帮助朋友检查服务器的时候,竟然 ...

  4. FatMouse and Cheese 动态化搜索

    FatMouse and Cheese Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  5. OleDB连接字符串很基础却很重要

    --Oracle<add name="HISConnectionString" connectionString=" Server=127.0.0.1;Provid ...

  6. python 一遍式四则运算

    #!/usr/bin/python #coding: utf-8 INTEGER = 'INTEGER' PLUS = '+' MINUS = '-' MUL = '*' DIV = '/' LC = ...

  7. The 2014 ACM-ICPC Asia Regional Anshan

    继续复盘下一场Regional! [A]-_-/// [B]模拟(之前每次遇到模拟.暴搜都直接跳了,题目太长也是一个原因...下次是在不行可以尝试一下) [C]数论 互质.容斥? [D]数学推导(方差 ...

  8. Mysql update语句赋值嵌套与在表列中数据后面增加数据

    1.Mysql update语句赋值嵌套select  点击(此处)折叠或打开 update a set col=(select col from a where id='5') where id&g ...

  9. SpringMVC轻松学习-其他常用(四)

    Spring MVC 3.0 深入 核心原理 1.      用户发送请求给服务器.url:user.do 2.      服务器收到请求.发现DispatchServlet可以处理.于是调用Disp ...

  10. Linux如何正确关机

    其实,在Linux领域内大多用在服务器上,很少遇到关机的操作.毕竟服务器上跑一个服务是永无止境的,除非特殊情况下,不得已才会关机. Linux和windows不同,在 Linux 底下,由于每个程序( ...