Web 安全之内容安全策略CSP的用途及使用方法

内容安全策略(Content Security Policy,简称CSP)是一种以可信白名单作机制,来限制网站是否可以包含某些来源内容,缓解广泛的内容注入漏洞,比如 XSS。 简单来说,就是我们能够规定,我们的网站只接受我们指定的请求资源。默认配置下不允许执行内联代码(<script>块内容,内联事件,内联样式),以及禁止执行eval() , newFunction() , setTimeout([string], …) 和setInterval([string], …) 。

内容安全策略(Content Security Policy,简称CSP)还可以防护运营商内容劫持(广告)主要以白名单的形式配置可信任的内容来源,在网页中,能够使白名单中的内容正常执行(包含 JS,CSS,Image 等等),而非白名单的内容无法正常执行,从而减少跨站脚本攻击(XSS),当然,也能够减少运营商劫持的内容注入攻击。

CSP可以由两种方式指定: HTTP Header 和 HTML。

通过定义在HTTP header 中使用:

"Content-Security-Policy:" 策略集

通过定义在 HTML meta标签中使用:

<meta http-equiv="content-security-policy" content="策略集">

策略是指定义 CSP 的语法内容。

如果 HTTP 头 与 meta 标签同时定义了 CSP,则会优先采用 HTTP 头的 。

定义后,凡是不符合 CSP策略的外部资源都会被阻止加载。

由于暂时设置内容安全策略只是为了防止运营商的内容劫持,而非安全性的设置,所以只要限制script-src的白名单即可减少运营商劫持的内容注入攻击。HTTP Header头的设置如下:

Content-Security-Policy:script-src 'unsafe-inline' 'unsafe-eval' http://*.mydomin.net http://*.mydomin.com.cn http://*.baidu.com http://*.cnzz.com http://*.qq.com;

更详细的指令请参照:https://cloud.tencent.com/developer/section/1189856

发表在 服务器 | 标签为 | 评论关闭

pc安装linux系统(Linux Mint)

由于老式电脑安装windows系统会明显感觉越来越卡,在加上为了尝试Linux系统,所以选择一款入门级的Linux系统,最后经多方查证,选择安装Linux mint,Linux Mint 是一款基于 Ubuntu 与 Debian 开发的 Linux 操作系统发行版,被很多爱好者誉为“最好的桌面应用系统”,就像是 Linux 世界中的 macOS,非常适合个人日常办公或开发电脑使用。Linux Mint 的目标是为个人和企业客户提供免费/高效/优雅且真正「易于上手」的开源桌面操作系统,它继承了 Ubuntu 众多优点,集成大量可让用户「开箱即用」的软件包,加上良好的人机交互体验,使其自 2006 年发行以来人气持续狂飙,目前已稳居 Distrowatch 发行版排行榜的第一名,势头相当凶猛。
Linux Mint版本的区别
Linux Mint 9默认是GNOME桌面,和KDE一样都是重量级桌面,样式和功能都比较全面;XFCE、LXDE是轻量级桌面环境,快速、简洁,而LXDE更是比较简陋,尤其适于老配置机器由于电脑配置比较低,
最后选择安装了Linux Mint XFCE版本(下载地址:https://mirrors.shu.edu.cn/linuxmint-cd/stable/19.1/linuxmint-19.1-xfce-32bit.iso)。下面讲一下笔记本上安装Linux Mint的具体步骤【操作之前记得备份电脑里的重要资料,以免引起不必要的数据丢失】:
1,去官网下载一款适合自己电脑的Linux Mint ISO安装包。
2,制作U盘启动盘,虽然笔记本基本上都带有光驱,但是从U盘启动安装系统越来越流行了。制作U盘启动的软件还是比较多的(如:ultraiso,老毛桃)等工具,不过windows系统用的比较多,制作Linux启动盘网上说容易出问题,并没有尝试。本人使用的是Rufus工具制作的U盘启动盘,ufus 是一个开源免费的快速制作 U 盘系统启动盘和格式化 USB 的实用小工具,它可以快速把 ISO 格式的系统镜像文件快速制作成可引导的 USB 启动安装盘,支持 Windows 或 Linux 启动。Rufus 小巧玲珑,软件体积仅几百多 KB,然而麻雀虽小,它却五脏俱全,而且速度极快。官网地址:https://rufus.ie/en_IE.html 下载地址:https://github.com/pbatard/rufus/releases/download/v3.4/rufus-3.4.exe。
3,安装Linux Mint,电脑重启从U盘进入系统,直接选择 Install linux mint 快捷方式进行安装系统.注意事项:

不要联网:如果联网安装是会下载语言包,巨慢。
选择英文:安装时选择英文。到时候自己下载语言包就可以。如果选择中文的话会有字体问题。
(字体是楷体的非常不好看。还有桌面,下载等文件夹都是中文的非常受不了。)

4,安装完成之后,将软件包的源选择为国内源【装完机器第一件事就是换国内源,Linux mint是以Ubuntu为基础的。所以mint可以使用Ubuntu的国内源。】

路径:Menu->Software Scoures
双击就可以选择源了。  可以根据网速选择快的源。更改完之后记得点击确定按钮。
换完源后 可以执行 sudo apt update 和 sudo apt upgrade 命令了,进行更新。


5,安装中文语言包

sudo apt-get install language-pack-zh-hans language-pack-gnome-zh-hans
libreoffice-l10n-zh-cn thunderbird-locale-zh-hans firefox-locale-zh-hans


安装完语言包后 进入 Menu->Language设置语言为中文重新启机后就变成中文了。
重启之后会提示将标准文件夹更新到当前语言吗?一定要选保留旧的名称。
6,安装搜狗输入法去搜狗官网下载linux版的.deb文件直接双击就好了,重新启动
7,系统默认安装的是Firefox,如果没有vpn的话安装Chorme是很麻烦的,不过软件包里有Chromium,可以通过软件管理器里进行安装。安装之后是英文,如果想使用中文,可以执行:

sudo apt-get install chromium-browser-l10n

至此一个完整的可以使用的Linux系统安装完毕。

发表在 开源 | 评论关闭

nginx在windows服务器下使用的正确姿势(使nginx在windows下突破1024的限制)

Nginx是一款轻量级的web服务器/反向代理服务器,更详细的释义自己百度了。目前国内像新浪、网易等都在使用它。对于Linux不熟悉或者没有运维的情况下,如何在生产环境的Windows服务器将Nginx搭建起来。一般小流量的站点直接去官网下载window的安装包即可。对于大流量的站点,直接官网的windows安装包部署在生产环境里,将会频繁出现如下错误:

maximum number of descriptors supported by select() is 1024 while waiting for request

这是因为文件访问句柄数被限制为1024了,当访问量大时就会无法响应。如果要想在windows下保持nginx的高性能,可以通过下方的链接进行下载。

nginx for windows官网:http://nginx-win.ecsds.eu/

nginx for windows下载载地址: http://nginx-win.ecsds.eu/download/

找到conf文件夹中的nginx-win.conf,把它复制一份更名为nginx.conf,然后在此文件中做配置.

特别要注意的是:linux版的nginx 头文件为include fastcgi.conf; 而windows版的nginx 头文件为include fastcgi_params;

附一个可以将nginx设置为windows服务的小工具nssm(NSSM是一个服务封装程序)

官网地址:http://www.nssm.cc/

注:由于nginx自身没有提供windows服务的安装,使用nssm虽然可以将nginx作为windows服务进行运行,将无法使用nginx -s reload是更改的配置文件生效,只能使用net stop nginx net start nginx是更改的配置文件生效。如果配置不需要实时生效,完全可以将nginx作为windows服务运行。

发表在 开源, 服务器 | 标签为 , , | 评论关闭

windows下使用cygwin安装goaccess实时日志分析工具

GoAccess 简介

简单来说呢 GoAccess 是一个专门用来分析日志的工具,既可以在终端中展示结果,也可以生成 HTML 报表在浏览器中查看。GoAccess 最吸引人的一点就是它生成的 HTML 足够炫酷。

1、下载goaccess安装包



https://goaccess.io/

goaccess-1.2.tar.gz

2、安装cygwin

1、下载cygwin



http://www.cygwin.com/

2、Cygwin国内镜像地址



http://mirrors.sohu.com/cygwin/

3、在cygwin中需要安装的包



https://goaccess.io/faq#installation

先安装cygwin,然后cmd切换到cygwin安装应用程序目录下含有setup-x86_64.exe的文件夹里执行安装goaccess需要的安装包


setup-x86_64.exe -q -P libGeoIP-devel -P libncurses-devel -P libncursesw10 -P gcc-core
-P make -P automake -P gettext -P "automake wrapper scripts"

在cygwin环境里安装 goaccess


$ wget http://tar.goaccess.io/goaccess-1.2.tar.gz
$ tar -xzvf goaccess-1.2.tar.gz $ cd goaccess-1.2/
$ ./configure --enable-utf8 --enable-geoip=legacy
$ make
$ make install

make出错的话,最好设置一下path环境变量  去usr下看(h-i686-pc-cygwin)含有cygwin字符的文件夹对应的文件夹名字。


PATH=/usr/h-i686-pc-cygwin/bin:$PATH

注:由于Cygwin的PATH和Windows的PATH用的是同一个变量
在往PATH里面加路径的时候,尽可能将Cygwin的路径写在Windows之前。

4、报告输出

1、交互模式报告

goaccess access.log

2、html报告

goaccess access.log -a -o report.html

3、指定多个日志文件

goaccess access.log access.log.1
goaccess access*.log

5 交互式菜单

F1 主帮助页面
F5 重绘主窗口
q 退出程序或者当前{详细视图}(窗口)
打开当前激活模块的详细视图
c 设置或改变配色方案
TAB 向前迭代模块。从当前激活模块开始。
SHIFT + TAB 向后迭代模块。从当前激活模块开始。
RIGHT ARROW 打开当前激活模块的详细视图
0-9 激活模块,这样用户就可以使用^o^或^RIGHT ARROW^打开{详细视图}
SHIFT + 0-9 激活超过10的模块
s 根据日期进行独立访客排序。仅在独立访客模块(1)有效。
S 根据点击数进行独立访客排序。仅在独立访客模块(1)有效。
/ 向前在任意{详细视图}窗口搜索输入模式(pattern)。
n 在任意{详细视图}窗口中找到下一次出现的位置。
t 跳到第一个条目或屏幕顶端
b 跳到最后一个条目或者屏幕底部

6 日期格式(date_format)

空格之后的date_format变量指定了包含常规字符和特殊格式说明符的任意组合。这些字符都以百分号(%)开始。详见:man strftime

%a    星期几的简写形式
%A   星期几的全称
%b   月份的简写形式
%B   月份的全称
%c    日期和时间
%d   月份中的日期,0-31
%H   小时,00-23
%I     12进制小时钟点,01-12
%j     年份中的日期,001-366
%m  年份中的月份,01-12
%M  分,00-59
%p   上午或下午
%S    秒,00-60
%u   星期几,1-7
%w   星期几,0-6
%x    当地格式的日期
%X   当地格式的时间
%y    年份中的最后两位数,00-99
%Y   年
%Z   地理时区名称

7 日志格式(log_format)

日志格式(log_format)

空格之后的date_format变量指定了日志格式字符串。

%x 与时间格式和日期格式变量匹配的日期和时间字段。当使用时间戳而不是日期和时间在两个单独的变量中时使用这个。
%t 时间字段匹配time_format变量。
%d 匹配date_format变量的日期域。
%D 服务请求所用的时间,以微秒为单位。
%e 这是通过HTTP认证确定请求文档的人的用户ID。
%h 主机(客户端IP地址,IPv4或IPv6)。
%r 来自客户端的请求行。这需要围绕请求的特定分隔符(单引号,双引号等)可解析。否则,请使用特殊格式说明符(如%m,%U,%q和%H)的组合来解析各个字段。
%m 请求方式。
%U请求的URL路径。
%q查询字符串。
%H请求协议。
%s 服务器返回给客户端的状态码。
%b 返回给客户端的对象大小。
%R RefererHTTP请求头。
%u 用户代理HTTP请求头。
%^ 忽略该域。
%T 服务请求所需的时间,以秒为单位,以毫秒为单位。
%L 服务请求所需的时间,以毫秒为单位,为十进制数。
%~ 向前移动日志字符串,直到找到一个非空格(!isspace)字符
~h X-Forwarded-For(XFF)字段中的主机(客户端IP地址,IPv4或IPv6)。

发表在 开源, 服务器 | 评论关闭

网站静态资源迁移到阿里OSS的方法,不需要更改网站源代码

随着网站的运行,网站里的静态资源越来越多,网站不仅包含自身的脚本,样式,配图等静态资源,还包括网站内容的需要上传的图片。图片一多,就需要考虑将图片单独分离出去来减轻服务器的IO读写。自建图片服务器虽然没有技术难度,但是考虑到时间,冗余,备份,性能等成本,最后放弃了自建图片服务器,选择使用阿里的OSS+CDN来做网站的静态资源存储。具体方法如下:

1,首先需要准备一个域名或者已有域名的二级域名来引用站点里的静态资源,单独域名做静态资源的引用的好处网上很多,可以根据需要来处理。

2,根据需要购买阿里的OSS和CDN服务,【阿里的OSS和CDN对域名只需要备案,并不要求必须接入阿里云,简化了许多流程】

3,在oss控制台创建Bucket,用来存储自己的静态资源。由于是通过CDN进行访问,不单独进行访问所以读写权限设置成了私有。在CDN里开启私有Bucket回源即可。

4,将服务器上现有的静态资源同步到阿里OSS创建的Bucket里。阿里针对OSS提供了很多可用的工具,根据需要进行选择即可。【阿里OSS工具汇总页面:https://help.aliyun.com/document_detail/44075.html?spm=5176.doc32204.6.1025.IMy0ZG】最后选择了ossutil这个命令行工具进行数据同步,之所以选择这个工具一是没有依赖,二是本身静态资源也就几百G,没必要使用ossimport2这类的工具进行同步。下载工具后,记得将ossutil的路径添加到Windows的系统环境变量里,方便使用。

在CMD里执行同步命令:


x: 切换盘符。
cd x:\files 进入到files文件夹
ossutil64.exe config -e EndPoint -i AccessKeyID -k AccessKeySecret  配置工具替换成自己的id和key
ossutil64.exe cp uploads/ oss://bucket/uploads/ -r -f -u  --snapshot-path=log/
 将uploads文件夹下的内容全部上传到bucket里的uploads文件夹下【oss其实没有文件夹概念的】.
更多ossutil用法可以使用ossutil64.exe help cp进行查看。

5,就是将上传的图片自动同步到阿里的oss里面。为了不修改网站代码,只能从服务器上保存图片的文件夹入手。对服务器上保存图片的文件夹进行监控,有文件创建就提交到oss上。需要用到一个小工具inotifywait 地址:https://github.com/thekid/inotify-win,需要写一个命令行程序通过管道接收inotifywait的文件地址。
syncfileOSS.exe主要代码


namespace syncfileOSS
{
class Program
{
private static Queue ossuploadqueue = new Queue();
static void Main(string[] args)
{
Task.Factory.StartNew(()=>{
while(true)
{
while(ossuploadqueue.Count>0)
{
string path=ossuploadqueue.Dequeue();
foreach (string localdir in appConfig.GetLocalDire())
{
if (path.ToLower().StartsWith(localdir.ToLower()))
{
try
{
//Console.WriteLine("正在向阿里OSS提交文件:" + filepath);
//Console.WriteLine("oss路径:" + appConfig.Ossprefix(s) + filepath.Replace(s, "").Replace("\\", "/"));
log.Info("正在向阿里OSS提交文件:" + path);
appConfig.PutObject(appConfig.Ossprefix(localdir) + path.Replace(localdir, "").Replace("\\", "/"), path);
}
catch(Exception ex)
{
string msg = ex.Message;
if (msg.IndexOf("because it is being used by another process") != -1)
{
ossuploadqueue.Enqueue(path);
Thread.Sleep(300);
}
log.Info("提交失败:" + path + ";错误信息:" + msg);
//Console.WriteLine("提交失败:" + filepath);
}
break;
}
}
}
Thread.Sleep(appConfig.delaytime);
}
});
string line;
while ((line = Console.ReadLine()) != null)
{
string[] lineArr = line.Split(' ');
string eventtag = lineArr[0];
if (eventtag.IndexOf("ISDIR") != -1)
{
continue;
}
string filepath = lineArr[1];
log.Info("正在提交文件:" + filepath);
if (!ossuploadqueue.Contains(filepath))
{
ossuploadqueue.Enqueue(filepath);
}
//Console.WriteLine("正在提交文件:"+filepath);

}
}
}
}

appConfig.cs


namespace syncfileOSS
{
public class appConfig
{
private static string accessKeyId = ConfigurationManager.AppSettings["accessKeyId"].ToString();
private static string accessKeySecret = ConfigurationManager.AppSettings["accessKeySecret"].ToString();
private static string endpoint = ConfigurationManager.AppSettings["endpoint"].ToString();
private static string localmaposs = ConfigurationManager.AppSettings["localmaposs"].ToString();
private static string bucketname = ConfigurationManager.AppSettings["bucketName"].ToString();
///
/// 延迟多少毫秒执行
///
public static int delaytime = Convert.ToInt32(ConfigurationManager.AppSettings["delaytime"].ToString());
private static List locallist =new List();
private static Dictionary maposs = IntiDic();

private static Dictionary IntiDic()
{
Dictionary dict = new Dictionary();
if (string.IsNullOrEmpty(localmaposs)) return dict;
string [] localArr = localmaposs.Split(';');
foreach (string str in localArr)
{
string[] strArr = str.Split('|');
locallist.Add(strArr[0]);
dict[strArr[0]] = strArr[1];
}
return dict;
}
///
/// 获取oss存储的prefix
///
///
 ///
public static string Ossprefix(string localpath)
{
if (maposs.ContainsKey(localpath))
{
return maposs[localpath];
}
return "other/";
}

public static string[] GetLocalDire()
{
return locallist.ToArray();
}

private static OssClient client = new OssClient(endpoint, accessKeyId, accessKeySecret);
public static void PutObject(string key, string fileupload)
{
client.PutObject(bucketname, key, fileupload);
}
}
}

配置文件信息:


<configuration>
<appSettings>
<add key="accessKeyId" value="AccessKeyID"/>
<add key="accessKeySecret" value="AccessKeySecret"/>
<add key="endpoint" value="EndPoint"/>
<add key="bucketName" value="bucket名字"/>

<!-- localmaposs本地文件夹与阿里oss prefix对应关系,用|分隔,多个对应关系用;分隔,本地文件夹以\结尾-->
<add key="localmaposs" value="x:\pic\test\|news/test/"/>

<!--delaytime 延迟多少毫秒提交 默认为300毫秒  如果不需要实时提交图片,可以设置的时间稍微长一些。-->
<add key="delaytime" value="300"/>
</appSettings>
</configuration>

批处理执行方法


inotifywait.exe -rmq -e create --format "%%e %%w\%%f %%T" x:\pic\test | syncfileOSS.exe
即可监控指定文件夹下文件的创建。

附阿里oss迁移工具程序含源码

发表在 Net | 评论关闭