solr入门

第一部分:了解solr

一、solr是什么?
Solr 是一个开源的企业级搜索服务器,底层使用易于扩展和修改的Java 来实现。服务器通信使用标准的HTTP 和XML,所以如果使用Solr 了解Java 技术会有用却不是必须的要求。
二、lucene是什么?

Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta 家族中的一个开源项目。也是目前最为流行的基于 Java 开源全文检索工具包。

目前已经有很多应用程序的搜索功能是基于 Lucene ,比如 Eclipse 帮助系统的搜索功能。Lucene 能够为文本类型的数据建立索引,所以你只要把你要索引的数据格式转化的文本格式,Lucene 就能对你的文档进行索引和搜索。

三、Solr VS Lucene

Solr 与Lucene 并不是竞争对立关系,恰恰相反Solr 依存于Lucene ,因为Solr 底层的核心技术是使用Apache Lucene 来实现的,简单的说Solr 是Lucene 的服务器化。需要注意的是Solr 并不是简单的对Lucene 进行封装,它所提供的大部分功能都区别于Lucene 。

第二部分:教程

一、从网站上下载

http://lucene.apache.org/solr/

我找的版本是5.3.1,最新版本是5.5

二、安装与运行

1、安装环境要求:

java的版本大于 1.7(利用java -version查看)

php接口是 >=5.2.11

 

2、启动:

bin/solr start -e cloud -noprompt

默认是8983端口
http://localhost:8983/solr/
快速入门solr002oYysygy70MbNH8XLf1&690
 
图片中各项的具体含义:
快速入门solr
002oYysygy70MbQv8Voee&690
002oYysygy70MbSpB5o1a&690
说明:这里是使用给好的例子,所以是有索引的。
使用 bin/solr start 是看不到索引。
其他命令
bin/solr start -p 8984(指定为8984端口)
bin/solr create -c 指定一个实例
bin/solr create -help 帮助
 
三、建立一个实例:
bin/post -c gettingstarted docs/

    -c gettingstarted:索引的名字(后期获取结果时用到)
    docs/:数据
快速入门solr002oYysygy70MbTPRJm48&690
在界面中可以看到,建立了实例。
并且也是有数据的。
 也是可以通过命令去查看的
http://localhost:8983/solr/admin/cores?action=STATUS
 
四、数据说明:
1、数据类型:索引不同类型的文档
官方文档中说:
Solr can be queried via REST clients, cURL, wget, Chrome POSTMAN, etc., as well as via the native clients available for many programming languages.

可以看出,可以建立不同形式的索引,包括json,xml,以及word

功能:添加,更新,删除等
如xml数据:
<add>
<doc>
  <field name="id">USD</field>
  <field name="name">One Dollar</field>
  <field name="manu">Bank of America</field>
  <field name="manu_id_s">boa</field>
  <field name="cat">currency</field>
  <field name="features">Coins and notes</field>
  <field name="price_c">1,USD</field>
  <field name="inStock">true</field>
</doc>
</add>
conf/schema.xml配置文件中规定好的。
 
五、怎么搜索?
1、界面搜索
http://localhost:8983/solr/#/gettingstarted_shard1_replica1/query
快速入门solr002oYysygy70Mc05TGz83&690
 

2、页面访问:

http://localhost:8983/solr/gettingstarted/select?wt=json&indent=true&q=foundation
 
六、思考:通过curl就可以获取,缺点就是不太安全吧?

如5.3上管理用户界面没有用户限制,所以任何人都可以访问管理员的用户界面将可以做任何事情与您的系统。

解决方案:基本认证和授权插件/设置防火墙
 
 
以上就是一个简单的索引的建立和搜索功能,有问题欢迎留言。

http到https的过渡

最近https有点火,搜索一下“运商商 流劫持持”,应该能看到好多运营商向网页中强制插入广告的新闻,运营商能这做一是因为流量都要从运营商过路,二是因为http传输的是明文。如果换成https传输数据,数据的安全性可以提高一个档次。

看下文之前请先看《https的使用注意事项》

http到https的切换,道理是很简单的,主要是修改对网址的解析(包括主域名和资源文件的CDN),项目里把“http://”改为“https://”或“//”(自适应协议)。下面是比较详细的改造过程:

1、改配置文件。
配置文件一般存放了项目域名、资源文件域名,所以第一步从这里下手改。
如果开启了https,$_SERVER['HTTPS']非空,一般为on(非https时,在IIS上使用ISAPI方式,该值为off)。
所以,判断是否是https访问的判断条件是 $_SERVER['HTTPS']=='on',我们用 $protocal 表示当前协议,然后把配置里的 http:// 改成 $protocal 。

2、修改项目中的绝对路径。
主要关注几个,jquery路径,二维码路径,微信js地址,轮播图地址,轮播图的点击地址,登录页面的地址。

3、外网资源文件。
如果资源文件很少,可以抓取过来放到自己网站。
如果资源文件很多,可以强制跳转到http页面。(百度图片就是强制跳转到http)

4、统计JS。
百度统计、腾讯统计均支持https,CNZZ现在也支持https(以前的cnzz统计代码不支持https)。
量子统计不支持https。

5、切换到https后可能出现的问题。
a.访问出现502错误;
b.网页打不开,加载时间非常长;
首先看是否是cdn解析问题,如果不能快速解决就切换回http。

总结:
刚始始切换后问题很多,主要特点就是“打不开”、“变慢”。多和运维做些沟通,持续优化https的体验。
https不是绝对安全,如果项目牵扯很多,改造起来难度也很大,量力而行。
记得要保证可以随时切回http。

UEditor 独立图片上传功能

一、下载使用ueditor

1、从官网上下载UEditor富文本编辑器

2、学会部署使用ueditor。

二、实现方法

1、在html中放置UEditor编辑器,为了不使独立上传图片功能影响到正常的编辑器,这里要多设置一个UEditor编辑器并且需要隐藏。如下代码,myEditor是正常使用的编辑器,upload_ue为隐藏的编辑器。

<script id="myEditor" type="text/plain"></script>
<script id="upload_ue" type="text/plain" style="display:none"></script>

2、实例化编辑器,并侦听图片上传,实现图片预览

<script type="text/javascript">
    var _editor;
    $(function() {
        //实例化一个编辑器,防止在上面的editor编辑器中显示上传的图片或者文件
        _editor = UE.getEditor('upload_ue');
        _editor.ready(function () {
            //侦听图片上传
            _editor.addListener('beforeInsertImage', function (t, arg) {
                //单图预览
                $("#pic_lsit").attr("src", arg[0].src); 
                //多图预览
                for (var i = 0; i < arg.length; i++) {
                    $("#pic_list").append('<div id="photos'+i+'" style="float:left;"><input type="hidden" name="photos[]" value="'+arg[i].src+'" /><img src="'+arg[i].src+'" width="150" height="150" /><a onclick="removePhoto('+i+')">删除</a></div>');
                }
            });
        });
    });
</script>

ps:实例化编辑器之后,一定要确保编辑器上传图片功能能够实现。

3、添加一个按钮,并绑定onclick事件,用于触发编辑器中的上传图片功能。

<button onclick="upImage()">上传图片</button>
<script>
function upImage() {
    var myImage = _editor.getDialog("insertimage");
    myImage.open();
}
</script>

三、参数配置

1、在/ueditor/php/config.json中修改相关配置

/* 上传图片配置项 */
"imageActionName": "uploadimage", /* 执行上传图片的action名称 */
"imageFieldName": "upfile", /* 提交的图片表单名称 */
"imageMaxSize": 2048000, /* 上传大小限制,单位B */
"imageAllowFiles": [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 上传图片格式显示 */
"imageCompressEnable": true, /* 是否压缩图片,默认是true */
"imageCompressBorder": 1600, /* 图片压缩最长边限制 */
"imageInsertAlign": "none", /* 插入的图片浮动方式 */
"imageUrlPrefix": "", /* 图片访问路径前缀 */
"imagePathFormat": "/test2/ueditor/php/upload/image/{yyyy}{mm}{dd}/{time}{rand:6}", /* 上传保存路径,可以自定义保存路径和文件名格式 */

下载测试代码ueditor 独立图片上传

svn管理流程实践

整 理:吴万利
时 间:2015-01-08
说 明:svn管理流程实践

svn目录结构

trunk 主干:存储最新稳定的版本
tags 标记:主要保存比较完整的版本标记,类似里程碑
branches 分支:用于分工操作,以开发分支、用户名、日期为目录存储

svn工作模式

常用的两种工作模式

基础结构准备

选定trunk为主要开发文件夹
tag为发布版本的地方(可能也有紧急的bug修复,之后要将代码合并回主干)
branch为分支目录(bug修复、模块独立开发等)

现有的文件结构

trunk/ 主要开发的目录

*.php

tag/ 版本发布目录(发布tag一定要标记信息!)

release_1.0 已经发布的一个版本(1版本号,0修订号)

branch/ bug修复,独立模块开发等

问题应对流程

  1. 日常的开发怎么办?
    答:日常可以在trunk里面进行开发,周期不长开发测试完成可以打包出来进行测试。

    • 开发完成之后由管理人员操作打包得到
      http://svnxxx.xxx.com/svn/vshop2_trade_module/tag/release_2.0
    • 在测试机上测试稳定之后就可以准备上线
      上线:可以在对应项目目录下面执行svn switch命令(我的方案)
  2. 线上的项目出现问题怎么办?
    • 紧急而且简单
      1. 直接在release里面修改(其实不推荐,而且测试机的配置,同样用switch命令?),然后测试提交,在线上更新。
      2. 通知trunk、branch里面的dev进行merge(merge前提交所有改动!)
    • 不紧急而且较复杂
      1. 在branch里面copy一个release_1.0版本为dev_1.0_bugfix进行修改
      2. 测试通过之后发布为tags/patch_1.1 通知trunk等进行合并操作
  3. 开发新的独立模块怎么办?
    答:可以考虑在branch下复制一个当前稳定版本的dev_2.0_yilucaifu出来进行修改,测试完成之后可以独立上线,但是不要忘记合并。

情景模拟

0. 情景准备

svn仓库结构:

branches
tags

release_1.0

trunk

服务器上代码结构:

正式版

tvshop2_online(svn:tags/release_1.0)

测试机

tvshop2_online_dev(svn:trunk)

1. 上线的东西出问题,需要调试

  1. 对于tag版本出一个bugfix分支

    svn cp
    http://svnxxx.xxxx.com/svn/tvshop2/tags/release_1.0http://svnxxx.xxxx.com/svn/tvshop2/branches/dev_1.0_bugfix
    -m '1.0bug修复'

  2. 测试版切换到分支

    tvshop2_online_dev:
    svn switch http://svnxxx.xxxx.com/svn/tvshop2/branches/dev_1.0_bugfix

  3. 测试版debug,测试提交

    tvshop2_online_dev:
    svn ci -m 'debug message'

  4. 发布一个新的版本

    svn cp
    http://svnxxx.xxxx.com/svn/tvshop2/branches/dev_1.0_bugfixhttp://svnxxx.xxxx.com/svn/tvshop2/tags/patch_1.1
    -m 'bug修复'

  5. 改动上线

    tvshop2_online:
    svn switch http://svnxxx.xxxx.com/svn/tvshop2/tags/patch_1.1

  6. 清理无用分支dev_1.0_bugfix

    svn del http://svnxxx.xxxx.com/svn/tvshop2/branches/dev_1.0_bugfix -m '已经上线'

  7. 合并改动到主分支
    tip:一般线上的紧急调试都不会太大,所以合并一般问题都不会很多

    1. 切换测试机为主分支
      tvshop2_online_dev:
      svn switch http://svnxxx.xxxx.com/svn/tvshop2/trunk
    2. 合并改动到主分支(推荐在windows下用工具辅助做)
      svn merge http://svnxxx.xxxx.com/svn/tvshop2/tags/patch_1.1/ ./
    3. 下次提交将改动一起提交即可

2. 新的模块的开发

  1. 开发之前先大致确定一下可能的改动,是否跟原来的开发改动了同一块地方。
  2. 对于需要共同修改的地方在合并的时候必须小心处理,可以跟原来的开发一起查看改动是否合理。

3. 优点:

  1. 线上代码稳定,可靠性高(除非有人故意删除release)
  2. 回退方便,能够很清楚的知道上个版本是哪个

4. 缺点:

  1. 操作复杂,繁琐,比较容易搞混当前的版本是哪个
  2. merge回当前开发分支的时候可能会引起冲突(无法避免)
  3. 线上如果有人修改可能会引起树冲突,所以切换之前需要提交所有改动

5. 原则总结:

  1. 在执行switch的之前一定要提交所有的改动。
  2. 每次发布新版本之后其他分支需要从trunk上merge来获取最新的版本(冲突的话需要协商解决)。

仓库迁移记录

  1. 准备好即将使用的svn仓库
  2. 在线上先co出两个文件夹备用(svnshop2+svnshop2_dev)
  3. 将线上的代码export一份作为一个基础版本,并发布一个tag(release_1.0)
  4. 将本地开发的所有改动提交到之前的仓库
  5. 将之前的仓库文件导入到现在的svn里面的trunk中
  6. 在线上测试机co trunk,测试各项功能是否ok(测试一起购、一路财富改动都没有问题)
  7. 以后上线:trunk发布新的tag,线上执行switch操作(确保线上svn里面的文件没有M状态!)

可能的问题

  1. crontab怎么办?(直接在服务器上做的alias,没有影响原结构)
  2. 静态文件上线?(只能针对静态文件单独做合并、上线)
  3. 以后数据库的改动怎么同步?

 

VIM PHP IDE的安装步骤

前言

操作文档的链接

文件包所在

\\192.168.0.18\运维网络硬盘\y袁亮\vim-php-ide
  • php-vim-fool.tgz是fool式安装
  • php-vim-full.tgz是full式安装

其实就是相差一个YCM插件,YCM插件需要clang编译,所以比较烦。

FOOL安装

最好要求php5.3.9以上版本,也最好安装php-xml

yum install php-xml

关于自动补全

  • 最好,也至少安装一下ctags不然很多东西用不起了。
  • yum install ctags
  • 如果没有权限安装,那也只能作罢。

fool版的代价是不太友好的自动补全,当然也没有路径补全了=_=

安装步骤:

  • 使用winscpphp-vim-fool.tgz上传到工作用户目录下。
  • 执行指令tar xzvf php-vim-fool.tgz -C ~/
  • 然后就ok了

关于配置文件

  • 位置在~/.vimrc
  • 打开vim ~/.vimrc,先使用zM折叠所有方便查找,za单独打开和关闭折叠。

full安装(其实就是自动补全的差距)

需要安装的外部依赖:

  • git是必须的yum install git
  • gcc gcc-c++ yum install gcc gcc-c++
  • clang 
    • 先添加epel源, yum install epel-release
    • yum install clang
  • python-devel yum install python-devel
  • cmake yum install cmake
  • ctags yum install ctags
  • 可能需要php5.3.9以上的版本,不然需要关闭phpmd检查

安装vim-php

  • 使用winscpphp-vim-full.tgz上传到工作用户的目录下,即~/下面,github太慢,还是直接压缩包来得好。
  • tar xzvf php-vim-full.tgz -C ~/
  • vim ~/.vimrc 查看有没有报错(一般没有),然后:PluginUpdate,时间可能有点久,这不是必要的,可以直接下一步。
  • 进入~/.vim/bundle/YouCompleteMe/, 执行./install.py编译一下,可能比较久。 
    • 提示缺少argparse 安装pip install argparse
    • 如果没有pip,安装yum install python-pip
  • 如果编译失败,请查看依赖有没有安装成功
  • 安装成功后可以在vim下键入:PluginUpdate vim-shippets更新模块。

VIM PHP IDE的基本操作

前言

 安装步骤的链接

关于安装步骤:

  • 分full和fool两个版本,版本差距在自动补全的插件。
  • 最好安装ctags,如果不安装ctags自动补全将不完善,tagbar也无法工作。
  • 可以考虑一下vim的练级攻略

语法检查

文件在保存时会检查语法错误和规范

一共有三种警告:

  • p> php的语法错误, 可以使用:Php主动检查
  • s> 不符合prs2规范, 可以使用:Phpcs主动检查
  • m> 质量检验, 可以使用:Phpmd主动检查

格式修复

vim-php-cs-fixer

nnoremap <silent><F7> :call PhpCsFixerFixDirectory()<CR>
nnoremap <silent><F8> :call PhpCsFixerFixFile()<CR>

F8可以修复一些不符合psr2的规范,但是存在一些问题,如果只是定义了函数名或是类名的一些没有实际作用的代码可能会被删除,安全性有待评估。

自动补全

YCM

full基本操作:

  • 两个字符后开始自动补全
  • tab键选择,shift-tab逆向选择
  • 可以使用ctrl-n向下,或是ctrl-p向上选择

如果是fool版:

  • 不能自动开启补全,不能像图中那样方便。
  • 必须使用<ctrl-x><ctrl-o>开启补全
  • ctrl-nctrl-p无法选择, tab可以使用
  • 其他相同

一般只支持系统函数补全,如果要支持自己编写的函数补全,需要如此:

  1. 在项目顶层目录下执行指令 ctags -R
  2. 必需在项目顶层目录,即ctags文件所在的目录打开vim
  3. 打开文件,不要退出vim,使用NERDTreectrl-p查找和打开文件,如果需要创建文件,可以使用ctrl-p打开文件。
  4. 如果创建了新的类,将必须在项目顶层目录执行ctags -R的指令,当然可以在vim执行:!ctags -R,在不退出vim的情况下更新ctags文件

可以通过tags来实现require的补全

对于composer的补全,默认composer是全局安装的,好像失败了。

代码块

u

已经将php的模板文件软连接到用户主目录下,可以自行查看修改 
vim ~/php.shippets

?-tab 可以生成这样的代码 <?php ?>

f-tab可以生成这样的代码

function ()
{

}

pub-tab可以生成

/*
 * undocumented function
 * @return void
 * /
public function name($param)
{
    return null;
}

c-tab

class filename
{

}

class-tab可以生成一个带注释的class

文件目录和代码浏览

NERDTree 
NERDTree

F2 打开文件目录 
在NERDTree中按?呼出帮助文档

tagbar

需要安装ctags 
tagbar
F3 打开代码浏览

模糊搜索

ctrl-p 
ctrl-p
基本不需要设置

ctrl-p 打开模糊搜索

ctrl-k  ctrl-j 可以在搜索结果中上下选择 
ctrl-t 在新标签页打开 
ctrl-v 分割打开 
ctrl-y 新建文件, 需要先敲入路径和文件名

html tag跳转

在一个html tag上使用%可以跳转与之匹配的tag

官方文档

将光标移动到需要查看的函数上,使用shift-k,就可以查看官方文档a。

符号补全

在使用', ", (, [, {时,会自动补全另一半,同时如果再按各个匹配的另一半,则会跳出。

 

全局搜索

可以使用命令

:CtrlSF param

也可以设置

nmap <leader><leader>f <Plug>CtrlSFPrompt

<leader>默认是\,所以快捷就是 \\f

因为是全局搜索,所以不要在太顶层目录使用,具体请查看CtrlSF

多光标

ctrl-n 开启选择/选择下一个 
下面操作需要在ctrl-n执行后 
ctrl-p 取消一个选择 
ctrl-x 跳过一个选择 
详细vim-multiple-cursor

PS: 可以通过结合全局搜索实现重构

注释

\cc 注释当前行 
\cu 反注释当前行 
可以通过shift-v实现多行操作

撤销树

此处输入图片的描述 
gundo

F4呼出撤销树,查看之前的撤销修改

其它一些插件

php.vim

更好的代码高亮

PHP-Indenting-for-vim

在php 和 html代码混杂在一起时提供更好的缩进

vim-airline

状态栏美化

vim-trailing-whitespace

显示多余的空格

 

[PHP]PSR-1/2 育网修订版介绍以及推广

整    理:吴万利

时    间:2015-11-23

说    明:代码规范

关于PSR-1/2

国内靠谱翻译psr-1
国内靠谱翻译psr-2

补充规定

如下的这些都是基于上面规定来的,只是将一些规定明确化

psr-1部分

1 概览

  • 不准使用<\?=短标签

4.2 属性

  • 属性明确规定必须按照"下划线分隔式"
  • 常用变量名
  1. $sql: sql语句
  2. $page: 分页页码
  3. $limit: 每页显示多少条
  4. $ip: 用户ip地址
  5. $dated: 当前时间
  6. $ms: mysqls操作类实例
  7. $pager: 存放分页的html代码
  8. $data: 当前页面主要的数据
  9. $user_id: 用户id
  10. $username: 用户名
  11. $nickname: 用户昵称

psr-2部分

8. [补充]字符串单引号、双引号

  • 纯字符串的时候,使用单引号
  • 字符串中有变量时,使用双引号,变量用{}包含起来。
  1. $show = "你好,{$nickname}!";

9. [补充]用die不用exit

关于CodeSniffer

Github-PHP_CodeSniffer

关于如何操作?

检查我改动的代码

  1. phpcs --standard=PSR2 [files you\'ve changed]

结果展示

  1. FILE: /opt/ci123/www/html/vshop2_dev/svn/lab/src/entity/Product.php
  2. ----------------------------------------------------------------------
  3. FOUND 2 ERRORS AFFECTING 2 LINES
  4. ----------------------------------------------------------------------
  5. 74 | ERROR | Method name "Product::get_discount" is not in camel
  6. | | caps format
  7. 84 | ERROR | Method name "Product::get_photo_url" is not in camel
  8. | | caps format
  9. ----------------------------------------------------------------------

如果没有错误就没有提示

自动修复

  1. phpcbf --standard=PSR1 --standard=PSR2 Slider.php

结果展示

  1. Changing into directory /opt/ci123/www/html/vshop2_dev/svn/lab/src/entity
  2. Processing Slider.php [PHP => 379 tokens in 45 lines]... DONE in 23ms (1 fixable violations)
  3. => Fixing file: 0/1 violations remaining [made 2 passes]... DONE in 49ms
  4. Patched 1 file
  5. Time: 124ms; Memory: 6.75Mb

实际操作步骤说明

【web安全规范】 – 2、基本安全防御


编	写:袁	亮
时	间:2015-10-09
说	明:web安全规范 - 2、基本安全防御

一、外部输入过滤
	1、所有外部参数,必须经过处理过滤
		get参数、post参数($_REQUEST)、cookie数据,$_SERVER中的referer,ua,ip等数据
	2、所有过滤,以服务端验证为准,js客户端验证仅仅是为了增强用户体验
		不允许仅仅是在js加了判断验证,服务端没有
	3、只允许使用过滤后的数据,不允许在后面再使用过滤前的原始参数
		$p = isset($_GET['p'])?intval($_GET['p']):1; //过滤参数
		后面只允许只用$p,不允许出现任何直接调用$_GET['p']的地方
	4、过滤方法
		4.1 整型参数,一律采用intval转换
		4.2 短字符串,采用正则验证,常用正则百度,或者参考统一类库
			比如手机号、用户名、邮箱、邮编等等
		4.3 长字符串,非富文本
			比如个人介绍等,过滤html标签(strip_tags),再加过滤sql注入函数(stripSql)
			如果没有验证完全,或者不确定,可以使用mysql_escape_string()进行转义
		4.4 富文本编辑器的长字符串内容
			htmlspecialchars
			采用统一函数或者类库验证过滤
		4.5 这块详见附件 web安全规范 - 参数过滤
	5、严禁使用register_global、extract函数,php配置中也不允许开启register_global
		也不允许自己写代码,将外部变量全部变成内部变量,很多旧项目中就有
		也不要开启magic_quotes,在需要的时候使用addslashes转义

二、报错信息
	1、错误信息只能显示我们定义的对用户友好的内容,不允许显示与实际错误相关的内容
	2、线上不允许开启报错,包括php.ini和程序中的display_errors
	3、特别要注意,类似mysql_error等,只允许记log,不允许输出到页面
	4、必须要记录日志,这是之后排查的唯一依据
	5、日志不允许web直接访问到
	6、更多报错相关信息,请参考内部博客
		http://blog.geekman.vip/archives/27

三、数据存储
	1、log文件不允许存储在web能访问的地方
	2、cookie记录
		2.1 必须设置httponly属性,防止js读取
		2.2 cookie中不允许存储敏感数据,比如用户密码或者邮箱,手机号等
		2.3 cookie内容必须添加签名,并存储,验证cookie的时候必须比对签名是否正确
	3、数据库存储用户密码
		3.1 不允许存储明文密码
		3.2 必须添加盐值做散列
	4、cookie、session等用户登录凭证,需要设置过期时间,防止被劫持之后,一直有效
	5、注意加密算法和编码、散列的区别
		不要误拿编码做加密(base64、urlencode等等)
		不要使用自己编写的加密算法,采用成熟的高安全性算法
	6、日志文件中,不允许记录密码、银行账号等敏感数据

四、数据签名
	1、签名做法可以参考内部博客
		http://blog.geekman.vip/archives/46
	2、cookie存储需要签名
	3、写接口必须加签名
	4、敏感的读数据接口也必须添加签名验证,比如用户邮寄地址等

五、防暴力破解
	1、用户登录等危险操作必须考虑暴力破解的情况
	2、连续错误次数达到一定次数,则需要一个封禁时间
	3、同一个ip同时对多个账号多次尝试也需要处理
	4、发现有人暴力破解的时候,需要有报警机制,比如邮件、短信等

六、业务逻辑bug
	1、发布的时候,进行了相应的过滤,但是编辑的时候未处理,也会导致bug
	2、修改密码的时候,不进行验证,直接修改
	3、购买商品的时候,价格直接通过参数传递结算
	4、找回密码的时候,通过安全问题来验证,但是安全问题可以在登陆的时候直接修改
	5、这些业务逻辑的bug,需要在需求、开发阶段就要多想想,特别是一些比较危险的操作

七、越权访问
	1、所有后台、管理员操作的地方必须要经过权限验证
	2、所有验证必须是通过服务端验证,不允许采用js隐藏,不显示按钮等来完成
	3、每次都必须验证,不要指望在入口那边验证过了,操作的时候就可以不验证
	4、权限验证,不要寄希望与链接、入口别人不知道,浏览器插件、搜索引擎,都有可能泄露
	5、特别要注意调用接口的地方,不要遗漏
	6、所有操作,都必须想想,这是不是一个所有人都可以任意访问的资源,如果不是,都需要权限验证

八、服务器安全
	1、mysql资源
		1.1 除非特殊申请,否则主库增删改查权限,从库查权限
		1.2 给定权限的时候,必须限制ip,一般是内网固定某台
	2、web服务
		不允许使用root账号启动,比如apache等(我们的云主机上有见过root启动的)
		不要安装不用的扩展,很多扩展是有高危漏洞的
	3、redis、memcache资源
		需要绑定ip,一般是内网
		也可设置加账号密码访问
	4、严禁rm -rf命令,同学的同事有过rm -rf之后,损失一个亿的教训
	5、程序源码被直接显示出来
		解析不当+程序员操作不当,导致.bak文件等直接源码显示出来
	6、.svn文件夹等,直接可以遍历扫描
	7、web访问目录层级,web不允许直接访问到项目代码根目录
		/项目代码根目录/webroot/

九、文件上传
	1、上传文件的存储目录,不允许给执行权限【最重要】
	2、上传图片采用其他域名访问,与web服务域名分开
	3、文件扩展名白名单过滤
	4、存储文件名必须系统生成,不允许用户自定义
	5、想了解更多,可以参考内部博客
		http://blog.geekman.vip/archives/301

十、不要调用系统命令
	1、不要在web服务中调用shell命令,比如exec,system,eval之类的
	2、实在要用,shell命令的参数不要是通过web参数带过来的,否则很容易导致系统被攻破

十一、测试环境
	1、重要项目,必须有搭建测试环境(可以在本地搭建)
	2、测试环境的数据库、memcache等资源也必须是用的测试的
	3、不要把调试后门给上传到了线上,因为不知道哪天调试后门就会被人非法访问了
		不要觉得你这个链接从来没公布出去别人不知道,有个东西叫浏览器插件,还有个东西叫抓包

十二、跳转链接
	1、登陆等callback页面,必须要对callback后的链接进行验证
		否则给用户发了一个育儿网的链接,结果用户登陆之后跳到一个恶意网站,在恶意网站提示用户账户密码错误,请重新输入,然后就会导致用户账户密码被盗
	2、进行有根据用户的referer来进行跳转的,referer中的链接也需要验证,可以随意伪造

http协议基础:内网、外网

编	写:袁	亮
时	间:2015-07-17
说	明:http协议基础:内网、外网

一、前言:
	1、适合于计算机网络基本没学的同学
	2、了解为主
	
二、什么是内网ip,什么是外网ip
	1、广域网(WAN):
		Internet,这是一个世界通用的网络,这边可识别的ip就是我们常说的外网ip
		我们平时上的网络都是这个
		家里连接宽带等,其实就是连接到Internet上
	2、局域网(LAN):
		找了几台计算机,我们互相能识别,那么我们就组成了一个局域网
		我们互相之间能识别,但是其他人并不知道我们是谁是谁
		一般需要通过一台能连接到Internet的设备去上网,比如我们公司的内部网络,对其他人来说,我们公司的这些电脑都是同一个人
	3、为什么需要内网ip
		ipv4的ip地址,只能描述256*256*256*256台独立设备,而现在不够用了,因此需要内网ip
	
三、简单说明
	1、外网地址
		1.1 相当于绝对地址,比如中国,江苏,南京大学
		1.2 跟任何人说这个地址,都是唯一指向同一个
		1.3 外网ip,分3类:
			A类地址:0-127.***.***.***
			B类地址:128-191.***.***.***
			C类地址:192-223.***.***.***
	2、内网地址
		2.1 是一个相当地址,比如说4院3专业2班17号
		2.2 在不同的情况下,代表的是不同的
		2.3 因此不要出现在公司这边,直接连机房那边的局域网地址,完全是牛头不对马嘴
		2.4 内网地址分类,针对外网地址,每一类外网,都有其对应的内网地址格式:
			A类:10.***.***.***
			B类:172.16.***.***
			C类:192.168.***.***
			
四、内网中,也可以再嵌套内网
	1、我们公司,外网地址为:218.94.95.52
	2、内网192.168.0.***
	3、其中某台路由器的内网ip为192.168.0.8
		可以再设置一个内网,192.168.8.***的内网,可以连接256台各设备

五、程序获取ip地址
	function getIp(){//获取IP函数
		$ip = false;
		if(!empty($_SERVER["HTTP_CLIENT_IP"])){
			$ip = $_SERVER["HTTP_CLIENT_IP"];
		}
		if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
			$ips = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']);
			if ($ip) {
				array_unshift($ips, $ip);
				$ip = FALSE;
			}
			for ($i = 0; $i < count($ips); $i++) {
				if (!preg_match("/^(10|172\.16|192\.168)\./", $ips[$i])) { // 判断是否内网的IP
					$ip = $ips[$i];
					break;
				}
			}
		}
		return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);
	}

winscp的简单使用

编 写:袁 亮
时 间:2015-07-17
说 明:winscp的简单使用

一、简单介绍
1、作用:在本地和远程服务器之间安全地复制文件(所有文件操作基本都支持)
2、Windows下使用

二、配置使用
1、下载软件,没什么好说的
2、配置基本和putty差不多,下个中文版的,看看就会了,如果不会,翻看putty设置
3、传文件等的时候,就是在两边拖拽,看一下就会

三、隧道介绍
1、问题背景
当我们需要向一台不能直接连接的服务器传输文件的时候,就会遇到大问题,连不上,比如内网虚拟机,比如隐藏在跳板机之后的服务器

2、什么是隧道技术
本来是登陆A服务器,但是因为没有权限或者其他原因,导致登陆不上去,但是通过B服务器是可以上A服务器的,而我们本地可以登陆B服务器,因此采用先登陆B服务器,作为隧道,再登陆A服务器

3、设置

图片1 图片2 图片3

4、保存设置,登陆即可