凭空想象的应用中的数据加密方案

限制单用户单位时间内最大请求频次

(如每日最多请求50次内容页){仅稍微增加了采集难度,延缓被脱库时间}

对于请求频率异常的设备,封禁若干长时间(如10分钟)

技术方案参考:

  • App在请求接口时,带上设备惟一编号、当前版本号
  • 请求异常时,将设备惟一编号列入黑名单。
  • 设备惟一编号。可以使用友盟统计的 Device Token。<Tips:惟一编号方案不要与苹果的隐私规范冲突>(注意:Android可以通过清空应用数据重置该惟一编号,iOS可通过卸载后重装重置该编号)

加密数据输,请求及响应双向加密。

至少要包括:接口名,参数名,参数值。可以考虑如下加密方案:

  • 使用AES加密算法,AES密文是二进制的,最好再做一次BASE64编码。
  • 通过接口分发密钥,密钥本身也是加密传递,真实密钥需要是经过事先约定的算法计算得到。
  • 不要通过单独的接口分发密钥,而是放在其他接口中,可以放在最低允许的版本号的接口中。响应数据中,增加适量无意义的干扰信息,增加猜解难度。
  • 密钥定期修改,在服务器端更改,App启动时加密分发给App。
  • 在做协议分析时很容易猜解接口名,因此接口名可以采用另外的密钥加密,与数据传输密钥不同。可以是硬编码到App内部的固定密钥。
  • 参数名、参数值放在一起加密,即通过GET请求字符串整体加密。
  • 服务器端响应数据,也是加密后base64编码后返回密文。
  • 固定密钥不要直接出现在App的字符串资源中。

一个接口格式参考

也可以将接口地址格式改成这个形式:

host.domain.ext/interface?model=news&action=list&class=123
host.domain.ext/interface?model=news&action=detail&class=9876

将get参数加密传输后格式示例(下面只是简单的base64,没做加密)

host.domain.ext/interface?bW9kZWw9bmV3cyZhY3Rpb249bGlzdCZjbGFzcz0xMjM
host.domain.ext/interface?bW9kZWw9bmV3cyZhY3Rpb249ZGV0YWlsJmNsYXNzPTk4NzY

甚至把interface一段也重写隐藏掉,形式如

host.domain.ext/bW9kZWw9bm3cyZhY3Rpb249bGlzdCZjbGFzcz0xMjM

对于POST请求,将post包与做类似的加密封装

其它杂项

一个接口:最低允许的版本号。作用:App启动时,检查版本号,如果App版本号过低,强制用户更新。(类似网络游戏启动时检查版本补丁的方式)

如果有在线接口文档,其地址(目录命名、目录层级等)要有一定复杂度,避免被猜到。最好是授权查阅(口令、账号、IP段等)

凭空想象的web功能开发标准(性能,负载,可用性,安全,审计等多侧面)

重要数据的变动记录,及保留历史版本

对重要数据变动,做日志记录,必要的保留历史版本。可选技术方案:将所有历史版本数据存储在k-v表中,允许随时丢失部分或全部

缓存、临时文件及日志

允许这类数据存储在易失性设备上,如内存缓存。允许随时丢失部分或全部,程序不得崩溃(鲁棒性)

自己擦屁股,自动归档旧数据,尤其是存储到数据库中的旧数据,如日志表,临时文件等。至少要有相关文档,指明哪些是此类数据,如何清理,清理是否会带来后遗症(理想 状态是可以任意删除,程序本身健壮工作)

用户行为记录

uv, pv, 类似GA ,或者直接使用第三方服务

单个用户的足迹,按用户、回话划分。登陆用户的记录很自然;非登陆用户,也要有区分方案,可以类似于app中device token的实现原理。负载均衡下要按session划分。

关键步骤的记录。

分别对待:

不产生服务器上数据变更的行为,注意是浏览、搜索等行为,类似HTTP get方法的约定。选特定行为,做记录

产生服务器上数据变更的行为。无条件记录:数据产生人,时间,源IP等必要信息。数据更改及删除,还需要记录原始数据,目标:可快捷低成本的追溯历史。

 

统计类数据

统计类数据,如文章点击量,定期快照(如按月、天、小时),或者记录一定粒度(如小时,天)时间段的统计量

防范资源滥用

高资源消化的操作做qps限制

关键请求上,针对单用户限制授权额度。这里的“用户”是宽泛概念,可以是用户账号,session, ip等多种

信息分级(信息安全层面)

防止重要信息被批量采集,将这些信息分级,对不同用户级别用户展示相应部分。初级用户只能看到极少部分。

严格限制列表页:不得查询未授权的内容,防止越权读取。

信息分级(业务层面)

不同级别的信息,有差异的对待,保证信息准确性,可追溯性等。

从生命周期对信息分类,尤其是对主体信息。这里的“主体信息”,是一个模糊概念,暂时简单的理解为:在数据库里以单独表形式存储的信息,每条信息对应一条记录。划分方式相对个人化、主观化:

  • 长期有效信息:知识,规范手册,等
  • 中长有效期:,
  • 短有效期:,
  • 即时有效期:

按信息对业务重要程度划分,

  • 重要信息
  • 次重要信息
  • 不重要信息
  • ...

 

 

账号密码管理

传统的用户名密码方式,在实际使用过程中,使用人员一定会共享账号,且密码修改非常不及时。(通常是将账号密码放在文件里,如果有工作交接,直接将文件转发,或者直接在QQ里发送账号密码。因为这比“找相关人员新开设账号、设置权限”简单太多了为了。为了不影响别人使用,所以几乎都不会改密码)然而这都是重大的安全隐患。

邮箱作账号,登录后通过邮箱做验证,避免账号共享,强迫通过管理人员赋权限。企业邮箱是第三方服务,一般有较好的密码策略。

用户在同ip段登录只验证一次,若干时间内不需要重复验证。

如果多个用户在某ip段成功验证,其他人员也可以在该ip上通免验证。

超过一定时间不登录的账号,禁止登录,需要重新邮箱激活才可。

超过一定时间不使用的权限,自动撤销。这样,通常就不需要管理员取消授权。

用户管理

对用户按权限分级,如果需要的话(普通用户登录,超级用户)。权限可以查阅、发布来划分;对于管理员,则按增删改查划分。

用户状态,在登录时有相应提示,减少用户登录时提示信息异常造成的困惑,即使对已封禁用户(制定一系列状态,如:临时拒绝登录,禁言,封禁,异常锁定等)

保护用户隐私

关于请求数据

post/get之辨

请求参数格式,url简洁,事先评估是否实现rewrite兼容性

针对移动设备的http接口请求,要实现类似user-agent信息,在请求中传递,可以在http协议头中传递

功能设计原则(底线)

不希望用户操作、不希望用户看到的东西,不要列出来

必要的说明:正确,简明,有效,隐藏

不挑战用户习惯

一致性(提示文案的一致性,同类功能操作方式一致性,UI元素摆放位置一致性,etc)

功能设计原则(价值点)

有转化,可转化

有用的参考资料

  • 信息安全标准目录 http://www.cnblogs.com/merray/p/5315066.html

 

有意思的东西-GIS方面

OpenStreetMap

OpenStreetMap是一个可供自由编辑的世界地图,它是由像您这样的用户创造的。OpenStreetMap允许您查看,编辑或者使用世界各地的地理数据来帮助您。web: http://www.openstreetmap.org/

CGIAR-CSI

CGIAR-CSI, 90m精度的全球GIS数据 Free SRTM 90m Data for the entire world - FREE GIS   web: http://srtm.csi.cgiar.org/SELECTION/inputCoord.asp

 

 

纯文本数据处理的实用脚本(bash,awk)

计算最大字段长度

典型用途:csv文件导入到数据库时,用于规划字段长度

$ cat file.csv |awk -F "," -v fields_count=10 'BEGIN{for(i=1;i<=fields_count;i++){xcount[i]=0}} {for(i=1;i<=fields_count;i++){if(xcount[i]<length($i) ){xcount[i]=length($i)}}} END{for(i=1;i<=fields_count;i++){print i,xcount[i]}}'

合并将当前目录下所有.csv文件,只保留惟一的首行

典型用途:一系列csv文件,列完全一致,首行是列名;需要将它们合并后做后期处理,通常我们只要保留一个列名行即可。

要求:1) 所有csv文件结尾是空行,否则接合处坏掉;标准的csv文件结尾会有个空行的。 2) 不能有字段内换行符;即字符内换行符需要转义,而不是excel生成的csv文件那样操蛋的转义规则(不转义换行符;用两个并列双引号转义双引号)

head -1 `ls *.csv |grep -v "all.csv" |head -1` >all.csv; total=0;for file in `ls -d *.csv|grep -v 'all.csv'`; do echo -n $file '    '; n=`wc -l $file |awk '{print $1}' `;n=$((n-1));total=$((total+n));echo -n $n 'lines...    ';tail -$n $file >>all.csv;echo ' done'; done; echo 'total lines:    ' $total

实现方法简述:找一个csv文件,将第首行写到all.csv中,然后遍历所有csv文件(除all.csv外),计算行数,将行数减1,将结尾的这么多行追加到all.csv中

cygwin:生存指南(简介,安装,使用,技巧)

前言

cygwin是让windows获得unix/linux部分功能的一个神器,本文是个人的一些经验,推荐初学者参考。有一经验的读者也可参阅斧正。

cygwin是什么?

cygwin是运行在windows下的GNU/linux环境,包含了几乎所有的常用Linux软件,使用上跟linux高度一致。由RedHat主导开发。cygwin官网

cygwin安装

到cygwin官网上下载安装程序: setup-x86.exe (32-bit ) or setup-x86_64.exe (64-bit )。双击运行,有安装向导,照做即行。

其中有两个路径一个url,有必要关注一下:

Root Directory, cygwin将安装到这个目录,推荐装到 D:\cygwin  (原因:重装windows通常不影响D盘;目录层级浅,找起来方便)

Local Package Directory, 安装向导下载的安装包存储路径,放到 F:\cygwin_download  或你希望的目录,cygwin安装后其中的文件就可以删除了,不过如果硬盘有空间,留着也不多,毕竟下次添加/更新安装包时,有可能还用得着。另外安装程序 setup-x86.exe 或 setup-x86_64.exe 也推荐放到这个目录里,cygwin里添加/删除包时还要用它(它相当于yum/apt-get,不过是gui版的,不是cli)

Choose A Download Site, 为了更快的下载安装包,推荐选择国内的镜像站点,自行添加镜像url也是可以的,比如下面这几个:

  • http://mirrors.neusoft.edu.cn/
  • http://mirrors.ustc.edu.cn/
  • http://mirrors.aliyun.com/
  • http://mirrors.163.com/

安装后,默认会在桌面放一个图标,可以将该快捷方式复制到你习惯的地方,比如快速启动栏。

默认情况下,cygwin只安装要最小化的环境,需要装哪些软件,使用 setup-x86.exe 或 setup-x86_64.exe安装器另外安装。

cygwin使用

点桌面图标快捷方式,进入cygwin命令行窗口,假装你在linux下,尽情使用吧,因为绝大多数操作都是兼容的。

cygwin文件系统与windows目录之间的对应

  • cygwin的根目录,其实就是cygwin安装目录,按前面的目录就是 D:\cygwin.
  • windows下的盘符,已被挂载到 /cygdrive/c, /cygdrive/d, /cygdrive/x ...

实用技巧

  • cygwin窗口里,鼠标圈选的,就自动复制到windows剪贴板。
  • Shift + Insert,从windows剪贴板粘贴。
  • 双击自动选择连续内容,很方便。
  • 单引号括起来的windows风格的路径。举例快速进入目录 F:\software\tools 可以这样  cd 'F:\software\tools'
  • Ctrl + 鼠标滚轮,调整字体大小。
  • 窗口标题栏点右键 - Option, 还有一系列选项。

一些事实

  • 需要注意的是,cygwin下的软件,都是.exe格式的,原生的linux二进制文件是不能运行的。如果cygwin里没有要用的软件,可以尝试在cygwin下从源码编译。

一些经验

  • cygwin本身是支持x-window的,不过效果实在不怎么样,使用还很烦琐;我想你肯定看不下去、而且用不下去的。所以,不推荐安装图形化的工具了,占磁盘空间而用又没用。如果你使用gitk以图形化查git历史的话,参考 在cygwin里调用windows版git-scm的gitk/git-scm与cygwin协同工作
  • 网上有些文章建议把cygwin目录加入到windows环境变量,不推荐修改,毕竟cygwin与windows的cmd是不同的东西,混用会有些乱,有可能带来莫名其妙的问题。
  • 可以通过 cd c: 进入windows的c盘,甚至可以通过 cd C:\tools 进入子目录;但列强反对这么用,使用windows风格的路径,请一定用单引号括起来。原因 反斜线在bash里当作转义符使用。这样 cd C:\tools 事实上相当于 cd C:tools,这样写cygwin认可。而cd c:\tools\disk相当于cd: c:toolsdisk,自然是错误的。

 

 

 

MySQL(csv,text)导入mssql方法参考

分两步处理,第一步是将csv导入到mysql。没有使用mssql自带客户端的导入功能,因为这个功能太坑,尝试N多种方法仍然是报错,因此选择先转换成mysql做中间步骤。

csv/text导入MySQL

一批很大的csv数据(其实并非csv,而是制表符分隔字段),要导入到mssql数据库里。

首先在cygwin下使用awk对数据做预处理,只筛选出字符数正确的行。并且在首行加入列名,以便导入工具自动做列对应。

然后计算各字段最大长度;因为字段数太多(63个),所以计算一下,用于构造create table语句。对于最大长度在255以下的字段使用varchar(n)型,255以上使用longtext类型。

#参考下面语句
$ awk -F "\t" 'NF==63 {print $0}' all.csv >all_63f.txt
$ head -1 origin_text_file.txt >h.txt
$ dos2unix h.txt       #注意最好不要带BOM,否则自行另存一下,避免麻烦
$ cat h.txt all_63f.txt >a63_with_head.txt

#最大计算字符长度,本身并不复杂,只是写在一行里,阅读不太方便
$ awk -F "\t" 'BEGIN{for(i=1;i<=63;i++){xcount[i]=0}} {for(i=1;i<=63;i++){if(xcount[i]<length($i) ){xcount[i]=length($i)}}} END{for(i=1;i<=63;i++){print i,xcount[i]}}' all_63f.txt

接下来使用Navicat for MySQL将导入csv。navcate可以试用,功能足够用;如果使用频繁,建议购买授权。

MySQL导入mssql

以下win2008 x64下的mssql 2012为例。

安装mysql的.net驱动 http://dev.mysql.com/downloads/connector/

create table,建表,与mysql结构一致。

使用mssql自带导入功能导入数据,导入数据源选择 .Net Framework Data Provider for MySQL,填写必要的主机名、登录名、口令,如下

mysql_import_into_mssql_via_nf

不能选择源数据表,必须写select 语句,如: select f1,f2,f3... from `db`.`table` where 1

后面应该没有什么难度了。

phpmyadmin3.x版在windows下的新版本php里日期显示乱码的补丁方案

现象:

一直使用的phpmyadmin3.5版本(RELEASE-DATE-3.5.0,一个做了配置优化的版本 phpMyAdmin_3.5_path8.net),这个版本比较简洁,更新的pma有些臃肿。然而,在windows下使用php5.5, 及php7.0,都发现日期显示成乱码

phpmyadmin_35_date_string_bad

方案:

文件 libraries/common.lib.php , 行1648行

        $format = __('%B %d, %Y at %I:%M %p');

改成

        $format = '%Y-%m-%d %H:%M:%S';

即可,日期格式显示格式示例 2016-01-27 11:49:07

phpmyadmin_35_date_string_fixed

原因:

PMA_localisedDate函数使用了strftime()函数,该strftime函数第一个参数为日期格式,phpmyadmin源程序使用了带中文的格式字符串;而在windows下的php版本,在做格式化时会转成乱码。经确认linux下没有这个问题,pma是正常的。

 

mac osx下apache下的坑: you don't have permission to access / on this server

max osx下的apache实在别扭,配置文件被拆得支离破碎(虽然有点拆分还是有道理的),这倒可以慢慢适应。无语的是竟然报403错:

apache you don't have permission to access / on this server. mac

Apache/2.4.16 (Unix) PHP/5.5.29

google后,得知,要在Directory指令里,增加一条 Require all granted,如下示:

<Directory "/Users/jnovack/Sites/">
  Options Indexes MultiViews
  AllowOverride All
  # OSX 10.10 / Apache 2.4
  Require all granted
</Directory>

参考http://stackoverflow.com/questions/25250566/apache-localhost-403-error-with-yosemite

被mac osx坑死了。。。。

一些wordpress插件兼容php7.x后的一些修改

不知算不算手贱,把VPS服务器上的php升级到7.0, 虽然7.x与之前的兼容性是很高的,但移除了一大堆过时用法,而某些老应用仍然在使用。对个人wordpress站点里出现的错误,修正记录如下。全部是插件,wordpress官方程序,是没有问题的。

mysql_escape_string() 函数改为addslashes()

wp-thread-comment插件 wp-content/plugins/wordpress-thread-comment/wp-thread-comment.php  有多处

mysql_* 系列函数在php7里全部移除了,所以建议在所有文件里搜索一下 mysql_query, mysql_escape_, mysql_real_eacape 等函数,如:  grep -r mysql_query /path/to/your/site

split()函数改为explode()

auto-save-image插件 wp-content/plugins/auto-save-image/auto-save-image.php  122行

语法兼容

Configure SMTP插件  wp-content/plugins/configure-smtp/configure-smtp.php  171行,为函数定义添加默认值

public function options_page_description( $localized_heading_text = '' ) {
Pages: Prev 1 2 3 4 5 6 7 8 9 10 ... 46 47 48 Next