IT相关 – 清风亦平凡 https://www.mlplus.net 关注IT世界,记录平凡生活 Thu, 31 Aug 2023 16:46:39 +0000 zh-CN hourly 1 https://wordpress.org/?v=6.4.3 迁移网站更改域名后一个可以使用的301跳转方案 https://www.mlplus.net/2023/08/31/website-migration-301/ https://www.mlplus.net/2023/08/31/website-migration-301/#respond Wed, 30 Aug 2023 16:36:00 +0000 https://www.mlplus.net/?p=4329 背景

最初,由于购买cc域名不支持备案,所以就使用了阿里云香港云空间。自从2016年网站应用由.net应用BlogEngine.NET改为WordPress至今都使用的阿里云香港云空间。稳定倒是挺稳定的,就是一直感觉访问速度比较慢,本以为是阿里云香港云空间本是这样,就没有研究其慢的真实原因,当然这已经是后话了。

今年云空间快要到期的时候,突然想将网站迁移到国内,为了不在备案期间停止域名访问,就更换了域名。当域名更换完成,空间迁移完毕,貌似一切准备就绪,发现原来空间即将到期,留给301跳转的时间非常不足。本想使用阿里云DNS解析进行301跳转,这个也是最优的解决方案,无奈的是域名必须进行备案且是两个域名都必须备案。如果原来的域名也参与备案的话,网站就需要停止访问了,为了避免这种情况,只能放弃使用此方法。

发现

续费原来空间或者购买腾讯云和百度云等在价格上是不划算的。为了保证以最低的代价进行301跳转,就开始找一些低价无需备案的空间来作为中转。经过两天的查找发现一款非常符合预期的服务商,支持多国语言 ,支持不同的支付方式,包括阿里的支付宝,从2006年成立至今已经17年的justhost。发现最经济的一种方式以存储空间使用多少来进行收费的,1兆每天0.001元,也就是说1兆每天1厘,如下图所示:

服务空间套餐选择

使用

首先,注册该网站并充值1.17美元,当时的最低充值金额。随后,订购所选择的服务计划(套餐),等待10分钟左右邮件通知相关信息。以下便是订购的服务,按天来进行续订,按天进行扣费。

计划订购列表

新建一个php文件index.php上传到根目录,其内容如下


<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: 需要301跳转到域名");
exit();
?>

完整示例如下:


<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: https://www.mlplus.net");
exit();
?>

完成以上内容后发现一个问题,只有访问首页才会跳转,访问其他页面是没有作用的。为了达到所有请求进行301跳转,需要进行额外的配置重定向。为了完成以上需求,需要在根目录下使用.htaccess配置文件进行,这个文件如果存在就编辑修改,不存在则新建上传。新增具体内容如下:


RewriteEngine On
RewriteRule ^(.*)$ 这里是具体域名/$1 [R=301,L]

完整示例如下:


RewriteEngine On
RewriteRule ^(.*)$ https://www.mlplus.net/$1 [R=301,L]
以上配置属于Apache服务器的配置

经过一段时间的观察,此服务商也比较稳定,每天0.001元,从2023年07月11日至2023年08月31日止,扣费0.06元。

最初扣费详情图
最新扣费详情

日志

使用的此服务是按照占用空间进行计算收费,网站访问产生的日志文件以及访问统计图表也是被计算在其中的。最初发现占用空间升高就手动清理一次,感觉手动清理太过繁琐,就是用程序自动清理一下。基于.net core使用FluentFTP库进行FTP登录清理操作。

空间暂用统计

使用最简单,最暴力的方式完成,不考虑什么设计与性能,以最快的速度实现目的。

实现代码:


using FluentFTP;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace JustHost.Ftp.ClearLog
{
    internal class CrontabFtpClear
    {
        System.Timers.Timer timer;
        List<string> paths = new List<string>() { "/domains/skyfinder.cc/logs/", "/domains/skyfinder.cc/stats/" };
        public CrontabFtpClear()
        {
            timer = new System.Timers.Timer();
            timer.Interval = TimeSpan.FromHours(5).TotalMilliseconds;
            //timer.Interval = TimeSpan.FromSeconds(5).TotalMilliseconds;
            timer.Elapsed += Timer_Elapsed;
            timer.Enabled = true;
            timer.AutoReset = true;
        }

        private void Timer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)
        {
            timer.Enabled = false;
            ClearProcess();
        }

        private void ClearProcess(){
            try
            {
                Console.WriteLine($"操作:执行指定清理命令 时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
                // 设置连接信息
                var ftpClient = new FtpClient("这里是服务器IP地址", "这里是用户名", "这里是密码");

                // 连接到FTP服务器
                ftpClient.Connect();
                foreach (var item in paths)
                {
                    if (!ftpClient.DirectoryExists(item))
                    {
                        continue;
                    }
                    ftpClient.DeleteDirectory(item, FtpListOption.ForceList);
                }

                ftpClient.Disconnect();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
            finally
            {
                timer.Enabled = true;
            }
        }


    }
}

调用运行:


using FluentFTP;

namespace JustHost.Ftp.ClearLog
{
    internal class Program
    {
        static void Main(string[] args)
        {
            CrontabFtpClear ftpClear = new CrontabFtpClear();
            Console.WriteLine($"FTP目录清理服务启动 {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
            while (true)
            {
                Thread.Sleep(1000);
            }
           
        }
    }
}

示例下载

justhost空间日志自动清理示例



转载请注明:清风亦平凡 » 迁移网站更改域名后一个可以使用的301跳转方案

]]>
https://www.mlplus.net/2023/08/31/website-migration-301/feed/ 0
安全架构设计基本原则 https://www.mlplus.net/2023/03/29/%e5%ae%89%e5%85%a8%e6%9e%b6%e6%9e%84%e8%ae%be%e8%ae%a1%e5%9f%ba%e6%9c%ac%e5%8e%9f%e5%88%99/ https://www.mlplus.net/2023/03/29/%e5%ae%89%e5%85%a8%e6%9e%b6%e6%9e%84%e8%ae%be%e8%ae%a1%e5%9f%ba%e6%9c%ac%e5%8e%9f%e5%88%99/#respond Wed, 29 Mar 2023 04:51:35 +0000 https://www.mlplus.net/?p=4176 安全原则

在应用系统软件开发设计的过程中,对应用系统的总体设计应当满足如下安全原则

原则说明
最小权限原则
Least Privilege
应用软件的每个模块如进程、用户只能访问当下所必需的信息或者资源。赋予每一个合法动作最小的权限,以保护数据以及功能避免受到错误或者恶意行为的破坏。
权限分离原则
Separation of Duties
对业务的操作、管理和审计权限应该由软件中的不同角色的用户分别承担;普通用户和管理员用户信息应该存放在不同的数据表中。
深度防御原则
Defense in Depth
在应用程序对业务数据进行处理的每个阶段都要考虑安全性问题,不能仅在某个阶段做安全防御,这样单点防御一旦被突破将造成安全风险。
容错保护原则
Fail Secure
当程序出现故障时或系统异常当系统失败时,可以进入到一个失败保护的状态。如果用户请求失败,系统仍可保障安全
单点异常终止原则
Single Point of Failure
当用户提交数据超出预期时,应立即终止程序的执行,不要试图加以修正并继续执行下去。
外来代码安全原则
Least Third Party Components
严格控制第三方函数与插件的使用,对外来代码必须进行详细的安全测试。
代码重用原则
Leveraging Existing Components
尽可能的重用软件已有的模块,这样可以降低引入新的漏洞和攻击界面的可能性。
数据保护原则
Data Protection
对用户数据的保护功能应涵盖用户数据存储的完整性、用户数据传输保密性、数据传输的访问控制、剩余信息的保护、数据反转操作等内容;应对系统中关键数据(如用户密码等)的存储和网络传输时应采用加密保护,实用加密加密算法应该符合国际标准、国家标准和业界标准。
可审计原则
Auditing
在应用系统中设计审计日志记录的功能,并对应用系统产生的日志增加完备的审计功能。
开放设计原则
Open Design
开放设计与“不开放即安全”的原则相对而言,认为设计本身不应具有神秘感。这一原则的具体表现可以参见应用于加密设计的Kerchoff定律,“系统不应单纯依赖私密性,若落入敌人手中则毫无优势可言”;开放设计以提高系统兼容性和可扩展性。
抗抵赖原则
Anti Repudiation
对于涉及支付交易等重要的业务场景,系统设计应有效地防止通信双方抵赖,如采用电子证书签名等方式。
规范性
Standardization
系统设计所采用的安全技术和安全产品应符合国际标准、国家标准和业界标准,为系统的扩展升级、与其他系统的互联提供良好的基础。
可扩展性
Scalability
以当前业务安全需求为基础,充分考虑发展的需要,安全功能模块子系统以插件或接口方式以方便未来的扩展。
实用性
Practicable
安全功能设计需要尽可能的考虑投入产出比,同时尽量控制对用户体验的影响。
符合性
Regulatory Compliance
安全功能的设计尽可能的要符合国家规范、行业规范以及业界的通用标准,如等级保护等规范。



转载请注明:清风亦平凡 » 安全架构设计基本原则

]]>
https://www.mlplus.net/2023/03/29/%e5%ae%89%e5%85%a8%e6%9e%b6%e6%9e%84%e8%ae%be%e8%ae%a1%e5%9f%ba%e6%9c%ac%e5%8e%9f%e5%88%99/feed/ 0
使用Fiddler进行移动端(手机)抓包 https://www.mlplus.net/2023/03/14/fiddler-mobile-setting/ https://www.mlplus.net/2023/03/14/fiddler-mobile-setting/#respond Tue, 14 Mar 2023 09:15:33 +0000 https://www.mlplus.net/?p=4156 背景

客户一个定制企业微信相关内容,其中自动登录成功某些功能不正常,手动登录的又未复现问题,程序都是相同的且问题确实存在。准备使用抓包看一下企业微信自动登录与非自动登录的行为区别,抓包工具选用了大名鼎鼎的Fiddler

Fiddler

Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据(指cookie,html,js,css等文件)。 Fiddler 要比其他的网络调试器要更加简单,因为它不仅仅暴露http通讯还提供了一个用户友好的格式。

Fiddler 是用C#写出来的,它包含一个简单却功能强大的基于JScript.NET 事件脚本子系统,它的灵活性非常棒,可以支持众多的http调试任务,并且能够使用.net框架语言进行扩展。

操作设置

设置允许远程电脑链接

依次选择Tools=>Options=>Connections=>勾选Allow remote computers to connect=>再点击OK

Fiddler tools
Fiddler connections
Fiddler的监听端口是8888,在远端设备上需要Fiddler所在设备的IP以及端口

查看本机IP

使用快捷键Windows+R调出运行小窗口,输入cmd回车即可。

运行
命令行显示本机IP

设置网络代理

打开移动设备Wlan,修改当前连接的网络。

移动设备WLAN

在以下页面进行代理设置,选择手动模式

移动设备WLAN代理设置页面

输入Fiddler所在设备的IP与端口后保存。

移动设备WLAN代理设置

手机打开浏览器进行测试,随便打开页面进行测试即可。

手机浏览移动页面

Fiddler可以看到在手机浏览的网页表示设置成功。

Fiddler查看抓取



转载请注明:清风亦平凡 » 使用Fiddler进行移动端(手机)抓包

]]>
https://www.mlplus.net/2023/03/14/fiddler-mobile-setting/feed/ 0
安全风险状况说明 https://www.mlplus.net/2023/02/24/%e5%ae%89%e5%85%a8%e9%a3%8e%e9%99%a9%e7%8a%b6%e5%86%b5%e8%af%b4%e6%98%8e/ https://www.mlplus.net/2023/02/24/%e5%ae%89%e5%85%a8%e9%a3%8e%e9%99%a9%e7%8a%b6%e5%86%b5%e8%af%b4%e6%98%8e/#respond Fri, 24 Feb 2023 10:02:25 +0000 https://www.mlplus.net/?p=4138 安全风险状况等级说明
良好状态   信息系统处于良好运行状态,没有发现或只存在零星的低风险安全问题,此时只要保持现有安全策略就满足了本系统的安全等级要求。
预警状态信息系统中存在一些漏洞或安全隐患,此时需根据评估中发现的网络、主机、应用和管理等方面的问题对进行有针对性的加固或改进。
严重状态信息系统中发现存在严重漏洞或可能严重威胁到系统正常运行的安全问题,此时需要立刻采取措施,例如安装补丁或重新部署安全系统进行防护等等。
紧急状态信息系统面临严峻的网络安全态势,对组织的重大经济利益或政治利益可能造成严重损害。此时需要与其他安全部门通力协作采取紧急防御措施。

漏洞等级状况说明

低危漏洞 对系统造成较小的影响,攻击成本高,攻击场景较为苛刻,不会直接影响到系统的正常运行,攻击者可能无法通过该漏洞获得权限。
中危漏洞对系统造成一般的影响,攻击成本一般,在特定场景下将可影响系统的正常运行,攻击者需要配合其他安全漏洞方可间接获得权限。
高危漏洞对系统造成严重的影响,攻击成本低,一般情况下可直接利用而无需特定场景和要求,攻击者可直接利用该漏洞获得权限。



转载请注明:清风亦平凡 » 安全风险状况说明

]]>
https://www.mlplus.net/2023/02/24/%e5%ae%89%e5%85%a8%e9%a3%8e%e9%99%a9%e7%8a%b6%e5%86%b5%e8%af%b4%e6%98%8e/feed/ 0
网站被恶意镜像的简单快速处理方法 https://www.mlplus.net/2021/05/02/mirror-site/ https://www.mlplus.net/2021/05/02/mirror-site/#respond Sun, 02 May 2021 15:08:28 +0000 https://www.mlplus.net/?p=3457 背景

站点网上飘,哪有不挨刀。总是遇到千奇百怪的问题,让人猝不及防。在51日的前一天,发现博客被人镜像了,这是一个非常糟心的问题,我非常肯定的是这次的镜像不怀好意。为什么我会这么说呢?因为镜像站点域名太不像话了,太长了,有没有特殊的含义,所以我认为这种镜像网站是非常有恶意的。如下图:

网站被恶意镜像的简单快速处理方法-第0张图片
镜像站点域名

JavaScript简单紧急处理

这种恶意的镜像站点无法绝对的杜绝,只能尽可能的减小影响。此次处理非常简单,直接使用Javascript对当前域名进行判断,与指定域名不符就跳转回指定的域名。

版本一


var local=window.location.host;
if(local.indexOf("skyfinder.cc")==-1){
   location.href = location.href.replace(local,"skyfinder.cc");
}

版本二

为了更好的预防其简单替换域名,将我们对比的域名的各个字符ASCII码保存起来,通过转换重新组合为域名后再与当前host进行对比,不同则需要跳转原站点,反之则不需要任何的操作。


var local=window.location.host;
var myHost=[115,107,121,102,105,110,100,101,114,46,99,99];
var myurl=[];
for(var item in myHost){
   myurl.push(String.fromCharCode(myHost[item]));
}
if(local.indexOf(myurl.join(""))==-1){
   location.href = location.href.replace(local,myurl.join(""));
}

版本三

这个版本是使用以上其他版本对Javascript代码进行混淆的,希望这种方式使他们的操作增加更多的工作量。



var I1=window['\x6c\x6f\x63\x61\x74\x69\x6f\x6e']['\x68\x6f\x73\x74'];var sRPPOUO2=[115,107,121,102,105,110,100,101,114,46,99,99];var dzhW$3=[];for(var tMYXRE4 in sRPPOUO2){dzhW$3['\x70\x75\x73\x68'](window["\x53\x74\x72\x69\x6e\x67"]['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](sRPPOUO2[tMYXRE4]))}if(I1['\x69\x6e\x64\x65\x78\x4f\x66'](dzhW$3['\x6a\x6f\x69\x6e'](""))==-1){window['\x6c\x6f\x63\x61\x74\x69\x6f\x6e']['\x68\x72\x65\x66']['\x72\x65\x70\x6c\x61\x63\x65']();location['\x68\x72\x65\x66']=location['\x68\x72\x65\x66']['\x72\x65\x70\x6c\x61\x63\x65'](I1,dzhW$3['\x6a\x6f\x69\x6e'](""))}

效果展示

网站被恶意镜像的简单快速处理方法-第1张图片

封禁IP

第一步 获取镜像站点的IP

新建一个php文件,将以下代码复制到文件中并命名为“ip.php”上传到网站根目录。


<?php
$file = "ip.txt";//保存的文件名
$ip = $_SERVER['REMOTE_ADDR'];
$handle =fopen($file,'a');
fwrite($handle,"IP Address:");
fwrite($handle,"$ip");
fwrite($handle,"\n");
fclose($handele);
?>

第二步 访问获取镜像站点地址

访问镜像站点,在镜像域名地址后面加ip.php,然后就会在自己网站根目录找到ip.txt文件了,打开复制里面的ip地址。

网站被恶意镜像的简单快速处理方法-第2张图片
网站被恶意镜像的简单快速处理方法-第3张图片

添加恶意镜像站点IP.htaccess

使用Deny from来将指定的IP加入黑名单,如下所示


#AIOWPS_IP_BLACKLIST_START
<IfModule !mod_authz_core.c>
Order allow,deny
Allow from all
Deny from 112.213.97.64
Deny from 37.187.78.50
Deny from 47.90.76.5
Deny from 5.188.0.0/16
Deny from 61.160.232.95
Deny from 61.160.232.94
Deny from 125.77.16.108
</IfModule>
<IfModule mod_authz_core.c>
<RequireAll>
Require all granted
Require not ip 112.213.97.64
Require not ip 37.187.78.50
Require not ip 47.90.76.5
Require not ip 5.188.0.0/16
Require not 61.160.232.95
Require not 61.160.232.94
Require not ip 125.77.16.108
</RequireAll>
</IfModule>
#AIOWPS_IP_BLACKLIST_END

将指定IP加入黑名单后,刷新镜像站点后显示403被禁止访问。使用这种方式需要维护黑名单列表,如果有新的镜像站点就继续要添加记录。

网站被恶意镜像的简单快速处理方法-第4张图片

结语

我个人十分难以理解这种行为,个人博客而已,只是记录点生活的一些琐事、工作中的一些问题处理以及学习中的一些疑问。镜像一个没有商业价值的个人博客,真的值得吗?

网站被恶意镜像的简单快速处理方法-第5张图片
关于其他解决恶意镜像站点的方法,以后在寻找。目前仅使用Javascript来做最简单快速的方法。



转载请注明:清风亦平凡 » 网站被恶意镜像的简单快速处理方法

]]>
https://www.mlplus.net/2021/05/02/mirror-site/feed/ 0
博客园整改 https://www.mlplus.net/2021/03/21/cnblogs-rectify/ https://www.mlplus.net/2021/03/21/cnblogs-rectify/#respond Sun, 21 Mar 2021 04:46:26 +0000 https://www.mlplus.net/?p=3391 博客园是国内最出名的IT从业者的技术交流社区。

博客园是一个面向开发者的知识分享社区。自创建以来,博客园一直致力并专注于为开发者打造一个纯净的技术交流社区,推动并帮助开发者通过互联网分享知识,从而让更多开发者从中受益。博客园的使命是帮助开发者用代码改变世界。

不知为何,浏览博客园任何帖子都会跳转到整改公告,具体整改原因不详!也不晓得哪里违规了!不管怎么样,希望尽快完成整改,合规合法运营!

为了遵守相关法律法规,合法合规运营,网站进行全面整改,整改工作于2021年3月18日12:00开始,预计于3月25日11:59结束,整改期间全站无法发布任何内容,之前发布的内容重新审核后才能访问,由此给您带来很大的麻烦,请您谅解。

博客园整改-第0张图片



转载请注明:清风亦平凡 » 博客园整改

]]>
https://www.mlplus.net/2021/03/21/cnblogs-rectify/feed/ 0
关于HOST文件中出现不明网址记录 https://www.mlplus.net/2021/03/15/microdone-cn/ https://www.mlplus.net/2021/03/15/microdone-cn/#respond Mon, 15 Mar 2021 04:33:11 +0000 https://www.mlplus.net/?p=3376 因局域网源代码管理服务器地址做了变更,所以就重新更改下HOST文件中的IP地址。意外发现HOST文件中多了一条记录,而我对这条记录竟然没有一点印象。好奇怪!!!!哪来的呢?172.17.187.161 windows10.microdone.cn,其中IP172.17.187.161又是本地局域网。然后就通过浏览器尝试访问域名windows10.microdone.cn,结果根本无法连接,最后尝试了顶级域microdone.cn,这下就出现了内容。如下图所示:

关于HOST文件中出现不明网址记录-第0张图片
关于HOST文件中出现不明网址记录-第1张图片

我仔细回忆一下,自己最近几天究竟做了什么,好像也没有做什么呀!于是,我就在控制面板中打开程序和功能查看一下。最近几个月的程序安装记录,由安装时间来看,也没有太多内容。如下图所示:

关于HOST文件中出现不明网址记录-第2张图片

我结合之前打开域名microdone.cn来看,这条HOST记录必然和中国邮政储蓄银行网上银行安全控件有关。看到了此记录,也逐渐想起自己的确安装过这个控件。既然现在用不到这个网上银行,就索性把它给卸载吧。最后,把HOST文件的那条记录也删除。我很疑惑为什么会有这种行为,一些开发人员总是搞些千奇百怪的事情,也不晓得意图是什么。

关于HOST文件中出现不明网址记录-第3张图片



转载请注明:清风亦平凡 » 关于HOST文件中出现不明网址记录

]]>
https://www.mlplus.net/2021/03/15/microdone-cn/feed/ 0
可以在线浏览PDF的一个WEB标准插件PDF.js https://www.mlplus.net/2021/03/01/pdfwebpdf-js/ https://www.mlplus.net/2021/03/01/pdfwebpdf-js/#respond Mon, 01 Mar 2021 07:08:00 +0000 https://www.mlplus.net/?p=3359 背景

因有一个需求,需要在线浏览PDF文件。所以,需要找一个满足需求的解决方案。经过一些列资料搜寻,最终确定使用PDF.js插件。目前来说此插件完美满足需求。

PDF.js

一个通用的、基于web标准的、用于解析和呈现pdf的平台。

PDF.js项目在线预览效果

可以在线浏览PDF的一个WEB标准插件PDF.js-第0张图片



转载请注明:清风亦平凡 » 可以在线浏览PDF的一个WEB标准插件PDF.js

]]>
https://www.mlplus.net/2021/03/01/pdfwebpdf-js/feed/ 0
Visual Studio(VS) Code提示php.executablePath配置问题 https://www.mlplus.net/2021/01/07/vs-code-php-executablepath-setting/ https://www.mlplus.net/2021/01/07/vs-code-php-executablepath-setting/#respond Thu, 07 Jan 2021 03:22:29 +0000 https://www.mlplus.net/?p=3334 Visual Studio Code 安装php插件后提示:

PHP executable not found. Install PHP 7 and add it to your PATH or set the php.executablePath setting

Visual Studio(VS) Code提示php.executablePath配置问题-第0张图片

打开VS Code设置查找到php.validate.executablePath进行修改,其值是php安装目录。

Visual Studio(VS) Code提示php.executablePath配置问题-第1张图片

{
    "editor.suggestSelection": "first",
    "vsintellicode.modify.editor.suggestSelection": "automaticallyOverrodeDefaultValue",
    "java.semanticHighlighting.enabled": true,
    "php.validate.executablePath": "F:\\phpstudy_pro\\Extensions\\php\\php7.3.4nts"
}
Visual Studio(VS) Code提示php.executablePath配置问题-第2张图片
Visual Studio(VS) Code提示php.executablePath配置问题-第3张图片



转载请注明:清风亦平凡 » Visual Studio(VS) Code提示php.executablePath配置问题

]]>
https://www.mlplus.net/2021/01/07/vs-code-php-executablepath-setting/feed/ 0
Windows 10 安装Apache https://www.mlplus.net/2020/08/14/windows10installapacheserver/ https://www.mlplus.net/2020/08/14/windows10installapacheserver/#respond Fri, 14 Aug 2020 02:39:06 +0000 https://www.mlplus.net/?p=3046 Windows 10 安装Apache-第0张图片

HTTP服务器Apache

Apache HTTP Server Project是一项协作软件开发工作,旨在创建HTTP(Web)服务器的健壮,商业级,功能强大且可免费使用的源代码实现。该项目由世界各地的一组志愿者共同管理,使用Internet和Web进行通信,计划和开发服务器及其相关文档。该项目是Apache Software Foundation的一部分。另外,成百上千的用户为该项目贡献了想法,代码和文档。

Apache HTTP Server 下载

打开Apache HTTP Server官网:http://httpd.apache.org

Windows 10 安装Apache-第1张图片

点击Download

Windows 10 安装Apache-第2张图片

点击Files for Microsoft Windows链接

Windows 10 安装Apache-第3张图片

点击ApacheHaus

Windows 10 安装Apache-第4张图片

点击下载完成。

Apache HTTP Server 安装

将下载完成的安装包移到将要安装的目录并解压。

例如:将解压后的文件夹移动到目录D:\Program Files\httpd

Windows 10 安装Apache-第5张图片

Apache HTTP Server 配置

 打开httpd.conf文件。例如:D:\Program Files\httpd\Apache24\conf\httpd.conf

修改Apache实际绝对安装目录Define SRVROOT。其中D:/Program Files/httpd/Apache24就是实际的安装目录。如果本机80端口被占用,就需要更改默认端口Listen,因为本机端口被占用,所以改为8098作为新端口。

Windows 10 安装Apache-第6张图片

检查配置文件是否合法,打开cmd切换目录到D:\Program Files\httpd\Apache24\bin下,输入一下命令并执行


httpd -t
Windows 10 安装Apache-第7张图片

安装Apache的主服务,以管理员身份打开cmd并切换目录到D:\Program Files\httpd\Apache24\bin,输入以下命令进行执行安装:


httpd -k install -n Apache
Windows 10 安装Apache-第8张图片

安装成功如上图所示,其中-n后面参数是自定义Windows服务名称,例如:Apache

Apache服务器的启动

Windows下Apache服务器的启动方式有以下几种

利用WIndows服务管理启动。

同时按下win+r键,在运行窗口中输入services.msc,即可打开服务

Windows 10 安装Apache-第9张图片
Windows 10 安装Apache-第10张图片

利用命令行启动

Windows系统自带命令


net start Apache
Windows 10 安装Apache-第11张图片

Apache HTTP Server 自带命令

httpd -k start

利用Apache服务器自身的视窗打开

Windows 10 安装Apache-第12张图片

打开目录D:\Program Files\httpd\Apache24\bin并打开ApacheMonitor.exe

Windows 10 安装Apache-第13张图片

打开浏览器,输入访问http://localhost:8098,若出现如下图所示界面,则Apache服务器的基本配置完毕,此时apache服务器已经可以运行。 

Windows 10 安装Apache-第14张图片

Apache HTTP Server 卸载

如果不在需要使用Apache HTTP Server,可以删除服务再删除文件夹。以管理员身份打开cmd,并切换目录到D:\Program Files\httpd\Apache24\bin,执行以下命令


httpd -k stop
httpd -k uninstall

或者使用Windows系统自带的命令sc delete 服务名进行删除


sc delete Apache

结束

Apache HTTP Server的下载、安装、启动以及卸载就全部结束。



转载请注明:清风亦平凡 » Windows 10 安装Apache

]]>
https://www.mlplus.net/2020/08/14/windows10installapacheserver/feed/ 0
网页被人恶意嵌入框架(iframe)的处理办法 https://www.mlplus.net/2020/06/24/websiteembediframe/ https://www.mlplus.net/2020/06/24/websiteembediframe/#respond Wed, 24 Jun 2020 04:00:00 +0000 https://www.mlplus.net/?p=2905 网页被人恶意嵌入框架(iframe)的处理办法-第0张图片

背景

人生在世,都会遇到各种问题,就连写个博客也不得安宁。突然发现自己的博客被别人恶意的以框架(iframe/object)形式嵌入了, 这种网页被嵌入框架的情况很常见,只是这次是我罢了。其实我不太明白,为什么要选择个人博客嵌入。不管怎么样自己还是得做出点响应,要不然自己总是觉得缺了一些什么。

发现

这次发现也算一次偶然,突然想看看统计数据,所以就登录到了百度统计查看记录,结果就发现了一些比较奇怪的来源,所以就尝试访问看了看。大致如下:

网页被人恶意嵌入框架(iframe)的处理办法-第1张图片

打开来源后就晓得博客被人恶意嵌入了框架或者被恶意镜像了,经过查看网页代码,确认博客是被恶意嵌入了框架(iframe)。如下图:

网页被人恶意嵌入框架(iframe)的处理办法-第2张图片
网页被人恶意嵌入框架(iframe)的处理办法-第3张图片

观点

这是2008年开始在国内流行另一种流氓行为:使用框架(Frame),将你的网页嵌入它的网页中。只是现在改为了object,其实也是框架了。

其实用框架抓取他人的网页,然后在上面加上自己的广告和站标,这与盗版书商并没有任何不同!

我个人极其讨厌这种行为且反对这种做事方法。

  • 嵌入的真是网址对一般用户是不可见的,欺骗了用户并且侵犯原作者所提供的内容
  • 使用这类框架技术展示别人网站页面视觉效果上完全一样,有着极其高的欺骗性
  • 恶意嵌入者可能在嵌入页面上方附加广告(更严重的是进行木马或者病毒传播),这种行为严重的破坏原作者的形象与意图。
  • 访问者通过框架展示的内容点击链接跳转另外一个链接,其外部的网址是不变的,这种体验效果非常差并且访问者会认为是原作者提供。

点击劫持

点击劫持(ClickJacking)是一种视觉上的欺骗手段。攻击者使用一个透明的iframe,覆盖在一个网页上,然后诱使用户在网页上进行操作,此时用户将在不知情的情况下点击透明的iframe/object页面。通过调整iframe/object页面的位置,可以诱使用户恰好点击在iframe页面的一些功能性按钮上。

应对

前端代码

恶意嵌入网页的人,是不会理会其他人的想法的。为了应对这种恶意的行为,所以就寻求了一种以Javascript脚本代码来防止这种行为继续作恶。将以下代码放入网页源码的头部,即可解决这种恶意行为。


<script type="text/javascript">
// 判断当前的window对象是否是top对象
if (window!=top){ 
    // 如果不是,将top对象的网址自动导向被嵌入网页的网址
	top.location.href =window.location.href; 
}
</script>

其他方式处理

X-Frame-Options HTTP 响应头是用来给浏览器 指示允许一个页面 可否在 <frame><iframe><embed> 或者 <object> 中展现的标记。站点可以通过确保网站没有被嵌入到别人的站点里面,从而避免 clickjacking 攻击

语法

X-Frame-Options 有三个可能的值:


X-Frame-Options: deny
X-Frame-Options: sameorigin
X-Frame-Options: allow-from https://example.com/

说明

如果设置为 deny,不光在别人的网站 frame 嵌入时会无法加载,在同域名页面中同样会无法加载。另一方面,如果设置为sameorigin,那么页面就可以在同域名页面的 frame 中嵌套。

deny表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。

sameorigin表示该页面可以在相同域名页面的 frame 中展示。

allow-from uri表示该页面可以在指定来源的 frame 中展示。

 Apache配置

配置 Apache 在所有页面上发送 X-Frame-Options 响应头,需要把下面这行添加到 ‘site’ 的配置中:


Header always set X-Frame-Options "sameorigin"

要将 Apache 的配置 X-Frame-Options 设置成 deny , 按如下配置去设置你的站点:


Header set X-Frame-Options "deny"

要将 Apache 的配置 X-Frame-Options 设置成 allow-from,在配置这样添加:


Header set X-Frame-Options "allow-from https://example.com/"

nginx配置

配置 nginx 发送 X-Frame-Options 响应头,把下面这行添加到 http, server或者 location 的配置中:


add_header X-Frame-Options sameorigin always;
IIS配置

配置 IIS 发送 X-Frame-Options 响应头,添加下面的配置到 Web.config 文件中:


<system.webServer>
  ...

  <httpProtocol>
    <customHeaders>
      <add name="X-Frame-Options" value="sameorigin" />
    </customHeaders>
  </httpProtocol>

  ...
</system.webServer>

HAProxy配置

配置 HAProxy 发送 X-Frame-Options 头,添加这些到你的前端、监听 listen,或者后端的配置里面:


rspadd X-Frame-Options:\ sameorigin

或者,在更加新的版本中:


http-response set-header X-Frame-Options sameorigin

X-Frame-Options设置后的效果,如下图所示:

网页被人恶意嵌入框架(iframe)的处理办法-第4张图片
设置 meta 标签是无效的!例如 没有任何效果。不要这样用!只有当像上面示例那样设置 HTTP 头 X-Frame-Options 才会生效。

浏览器兼容性

网页被人恶意嵌入框架(iframe)的处理办法-第5张图片

结语

网页被人恶意嵌入框架(iframe)的处理办法-第6张图片



转载请注明:清风亦平凡 » 网页被人恶意嵌入框架(iframe)的处理办法

]]>
https://www.mlplus.net/2020/06/24/websiteembediframe/feed/ 0
使用frp搭建内网穿透 https://www.mlplus.net/2020/06/06/frp/ https://www.mlplus.net/2020/06/06/frp/#respond Sat, 06 Jun 2020 12:56:11 +0000 https://www.mlplus.net/?p=2453 使用frp搭建内网穿透-第0张图片
背景 由于某些原因需要临时处理一些问题,所以可能需要远程处理。最初使用的是TeamViewer远程控制软件,但是使用频繁会被限制。最后寻找了一个新的解决方案,就是使用内网穿透,而内网穿透的工具选择了FRP。本次内容最终目的是利用FRP可以使用微软系统自带的远程工具进行远程操作。

内网穿透

内网穿透,即NAT穿透,网络连接时术语,计算机是局域网内时,外网与内网的计算机节点需要连接通信,有时就会出现不支持内网穿透。就是说映射端口,能让外网的电脑找到处于内网的电脑,提高下载速度。不管是内网穿透还是其他类型的网络穿透,都是网络穿透的统一方法来研究和解决。

内网穿透应用场景

  • 提供内网穿透服务
  • 连接内网服务器,在外网演示内网web站点
  • 无需服务器部署,快速调试本地程序,方便快速开发微信公众号和微信小程序
  • 支持http、https协议站点,省去证书中间件复杂配置,http协议站点直接升级为https站点
  • 支持TCP,UDP协议端口转发。支持数据库、SSH、远程桌面、网络摄像头等等开放到外网

frp

frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透。

frp项目地址

frp开源项目

资源准备

  • 公网服务器一台
  • 个人电脑一台

Frp服务端安装

公网服务器使用的是Linux Centos 7.7,需要下载Frp的Linux版本。

下载地址:https://github.com/fatedier/frp/releases

使用frp搭建内网穿透-第1张图片
FRP下载的版本,请根据系统架构类型来选择。

准备将frp放到Linux系统根目录下,所以我先创建一个名为frps的文件夹并下载文件。

cd / && mkdir frps && cd frps && wget  https://github.com/fatedier/frp/releases/download/v0.33.0/frp_0.33.0_linux_amd64.tar.gz

下载完成后,对文件进行解压操作。

tar -xzvf frp_0.33.0_linux_amd64.tar.gz

进入解压后的文件夹

cd frp_0.33.0_linux_amd64

因为使用Linux作为服务端,在这里我们使用的是frps这个文件,所以需要修改frps的配置文件frps.ini.

[common]
# 地址
bind_addr = ip
# frps 服务端端口
bind_port = 端口
# 仪表面板地址
dashboard_addr = ip
# 仪表面板端口
dashboard_port = 端口
# 仪表面板登录用户名
dashboard_user = 用户
# 仪表面板登录用户密码
dashboard_pwd = 密码
# 授权验证方式
authentication_method = token
#  授权验证密钥
token = 密钥
# 最大线程数量
max_pool_count = 5

示例如下:

[common]
bind_addr = 0.0.0.0
bind_port = 5443
dashboard_addr = 0.0.0.0
dashboard_port = 7500
dashboard_user = skyfinder
dashboard_pwd = skyfinderdotcc
authentication_method = token
token = 9ab8b258-8cef-4b12-89d7-2e0c38c2b543
max_pool_count = 5

前台运行frps

./frps -c frps.ini
此种方式运行终端断开,frps服务也同时终止。
使用frp搭建内网穿透-第2张图片

设置开机启动和后台运行

在服务器端使用 Systemd 管理 frps。在解压后的目录下有一个名为systemd文件夹,此文件夹下frps.service文件就是我们需要编辑的文件。

cd /frps/frp_0.33.0_linux_amd64/systemd
[Unit]
Description=Frp Server Service
After=network.target

[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/frps/frp_0.33.0_linux_amd64/frps -c /frps/frp_0.33.0_linux_amd64/frps.ini

[Install]
WantedBy=multi-user.target

ExecStart 是要执行文件的路径,调整为我们frps实际的路径。复制到/usr/lib/systemd/system目录。

cp frps.service /usr/lib/systemd/system

启动 frp 并设置开机启动

 
//  frps开机启动
systemctl enable frps
//  启动frps服务
systemctl start frps 
//  frps服务状态  
systemctl status frps 

在某些服务器上可能需要加 .service 后缀,如下


systemctl enable frps.service
systemctl start frps.service
systemctl status frps.service
使用frp搭建内网穿透-第3张图片

FRP服务停止与取消开机启动


// 停止frps开机启动
systemctl disable  frps
 
// 停止frps服务
systemctl stop frps  

Windows客户端配置

首先,下载Windows版本的frp,下载完成之后解。

使用frp搭建内网穿透-第4张图片

由于我们使用WIndows作为客户端,所以修改frpc.ini配置文件并保存。

[common]
# 服务端IP或域名
server_addr = bj.mlplus.net
# 服务端对应端口
server_port = 5443
# token 要与服务端一致
token =9ab8b258-8cef-4b12-89d7-2e0c38c2b543

# 添加一个远程链接节点 
[mstsc]
# 类型tcp
type = tcp
# 本地IP
local_ip = 127.0.0.1
# 远程链接端口
local_port = 3389
# 此端口和服务端IP或者域名来访问本地电脑
remote_port = 7000
# 是否使用加密
use_encryption = true

在当前目录下打开命令行cmd,输入frpc.exe来运行客户端。

使用frp搭建内网穿透-第5张图片

使用远程桌面连接测试是否可用。

使用frp搭建内网穿透-第6张图片
使用frp搭建内网穿透-第7张图片



转载请注明:清风亦平凡 » 使用frp搭建内网穿透

]]>
https://www.mlplus.net/2020/06/06/frp/feed/ 0
GitHub 现在对团队免费 https://www.mlplus.net/2020/05/02/github-is-now-free-for-teams/ https://www.mlplus.net/2020/05/02/github-is-now-free-for-teams/#respond Sat, 02 May 2020 05:30:00 +0000 https://www.mlplus.net/?p=2809 GitHub 现在对团队免费-第0张图片

我们很高兴地宣布,我们将为所有 GitHub 帐户提供具有无限协作功能的私人存储库。所有核心 GitHub 功能现在对每个人都是免费的。

到目前为止,如果您的组织希望将 GitHub 用于私人开发,您必须订阅我们的付费计划之一。但是地球上的每个开发人员都应该能够访问 GitHub。价格不应该是一个障碍。

这意味着团队现在可以在一个地方一起管理他们的工作:CI/CD、项目管理、代码评审、包等等。我们希望每个人都能在开发者喜欢的平台上发布优秀的软件。

需要高级功能(如代码所有者)、企业功能(如 SAML)或个性化支持的 eams 可以升级到我们的付费计划之一。

我们还将付费团队计划的价格从每个用户每月9美元降低到每个用户每月4美元,立即生效。现有客户的账单将自动减少。

在常见问题解答中了解更多信息,或在定价页面上比较计划。

原文地址:https://github.blog/2020-04-14-github-is-now-free-for-teams/



转载请注明:清风亦平凡 » GitHub 现在对团队免费

]]>
https://www.mlplus.net/2020/05/02/github-is-now-free-for-teams/feed/ 0
Linux Centos 7更换国内源 https://www.mlplus.net/2020/02/27/linux-centos-7-update-yum/ https://www.mlplus.net/2020/02/27/linux-centos-7-update-yum/#respond Thu, 27 Feb 2020 01:00:00 +0000 https://www.mlplus.net/?p=2539 由于Linux Centos 官方的源在国外服务器, 使用官方源速度慢的出奇,所以要更换为国内的源,于是有了以下内容。

Linux Centos 7更换国内源-第0张图片

首先备份原有Linux Centos 7的源/etc/yum.repos.d/CentOS-Base.repo

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

某些Centos镜像安装后可能没有wget,可以尝试curl 进行操作,如下

curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo



转载请注明:清风亦平凡 » Linux Centos 7更换国内源

]]>
https://www.mlplus.net/2020/02/27/linux-centos-7-update-yum/feed/ 0
hyper-v虚拟机安装Linux Centos 7 网络配置 https://www.mlplus.net/2020/02/26/hyper-v-linux-centos-7-network-setting/ https://www.mlplus.net/2020/02/26/hyper-v-linux-centos-7-network-setting/#respond Wed, 26 Feb 2020 01:00:00 +0000 https://www.mlplus.net/?p=2510 hyper-v虚拟机安装了centos7之后并不能上网,有些测试就无法继续进行,接下来就需要进行一些配置。

新建虚拟交换机

hyper-v虚拟机安装Linux Centos 7 网络配置-第0张图片

下图紧接着2、3、4步。

hyper-v虚拟机安装Linux Centos 7 网络配置-第1张图片

设置名称并设置连接类型。

hyper-v虚拟机安装Linux Centos 7 网络配置-第2张图片

设置网络适配器。

hyper-v虚拟机安装Linux Centos 7 网络配置-第3张图片
hyper-v虚拟机安装Linux Centos 7 网络配置-第4张图片

启动虚拟机系统Centos并登录, 进入到network-scripts目录 。

cd /etc/sysconfig/network-scripts
hyper-v虚拟机安装Linux Centos 7 网络配置-第5张图片
hyper-v虚拟机安装Linux Centos 7 网络配置-第6张图片
vi ifcfg-eth0
hyper-v虚拟机安装Linux Centos 7 网络配置-第7张图片

ONBOOT=no改为 ONBOOT=yes保存后重启网络。

systemctl restart network
hyper-v虚拟机安装Linux Centos 7 网络配置-第8张图片



转载请注明:清风亦平凡 » hyper-v虚拟机安装Linux Centos 7 网络配置

]]>
https://www.mlplus.net/2020/02/26/hyper-v-linux-centos-7-network-setting/feed/ 0
下载Linux CentOS系统镜像 https://www.mlplus.net/2020/02/23/downlinux-centos-system-image/ https://www.mlplus.net/2020/02/23/downlinux-centos-system-image/#respond Sun, 23 Feb 2020 13:00:00 +0000 https://www.mlplus.net/?p=2462 在学习或者工作当中,很大机率用到CentOS系统。在此之前使用centos基本上都是阿里、腾讯云的虚拟机,并没有下载镜像到本地进行安装部署。由于某些需求,需要下载centos系统镜像,之后要在虚拟机上进行安装测试一些内容,所以就找了下镜像。

CentOS

CentOS(Community Enterprise Operating System,中文意思是社区企业操作系统)是Linux发行版之一,它是来自于Red Hat Enterprise Linux依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定性的服务器以CentOS替代商业版的Red Hat Enterprise Linux使用。两者的不同,在于CentOS完全开源。

官网下载

Centos官网地址
下载Linux  CentOS系统镜像-第0张图片
下载Linux  CentOS系统镜像-第1张图片

官方网站下载的确可行,但不建议在官方网站进行下载,因为下载速度的确太慢了,速度简直无法忍受。

国内镜像网站下载

163镜像站点阿里云镜像站点

这里使用163的镜像站点,首先打开镜像站点并选择Centos

下载Linux  CentOS系统镜像-第2张图片
下载Linux  CentOS系统镜像-第3张图片
下载Linux  CentOS系统镜像-第4张图片

这里下载Centos7的最新版本7.7.1908

下载Linux  CentOS系统镜像-第5张图片
下载Linux  CentOS系统镜像-第6张图片
下载Linux  CentOS系统镜像-第7张图片

Centos版本区别

  • CentOS-7-DVD版本:DVD是标准安装盘,一般下载这个就可以了。
  • CentOS-7-NetInstall版本:网络安装镜像。
  • CentOS-7-Everything版本:对完整版安装盘的软件进行补充,集成所有软件。
  • CentOS-7-GnomeLive版本:GNOME桌面版。
  • CentOS-7-KdeLive版本:KDE桌面版。
  • CentOS-7-Minimal版本:最小安装盘,只有必要的软件,自带的软件最少
  • CentOS-7.0-livecd版本:光盘上运行的系统,类拟于winpe

本次测试使用的就是Centos-7-x86_64-Minimal-1908.iso

历史版本下载

centos历史版本下载



转载请注明:清风亦平凡 » 下载Linux CentOS系统镜像

]]>
https://www.mlplus.net/2020/02/23/downlinux-centos-system-image/feed/ 0
基于缓存系统的描述 https://www.mlplus.net/2020/01/16/rediscache/ https://www.mlplus.net/2020/01/16/rediscache/#respond Thu, 16 Jan 2020 02:00:00 +0000 https://www.mlplus.net/?p=2312 简介

缓存的工作机制是先从缓存中读取数据,如果没有,再从慢速设备上读取实际数据并同步到缓存。计算机系统里天然就存在多级缓存系统,这是由于不同的硬件设备的访问速度以及容量大小不一致引起的一个选择。比如,CPU到L1/L2/L3到内存到磁盘的访问方式就是一个典型的多级缓存的例子。当CPU需要数据的时候,它首先到L1里找,如果没有找到,则查找L2/L3,如果还是没有找到,则再到内存里找,如果还没有,再到磁盘里查找。不同层级的缓存的访问速度和容量大小各不相同,简要对比如下所示:

名称 访问速度 通常容量大小
L1 1.3纳秒 12组每组32KB数据加32KB代码
L2 3.92纳秒 32组每组256KB
L3 11.11纳秒 30MB
DDR4 内存 100纳秒 8GB,16GB,32GB,64GB,128GB
NVMe SSD磁盘 120000纳秒 1TB, 2TB
SATA SSD磁盘 400000纳秒 1TB,2TB
机械磁盘 6毫秒 1TB,2TB

缓存命中率

缓存命中率是从缓存中读取数据的次数与总读取次数的比率,命中率越高越好。这是一个非常重要的监控指标,它能反映缓存系统是否工作良好。

缓存回收策略

  1. 基于存储空间
    基于存储空间的回收策略是指缓存设置了最大的存储空间,比如设500MB,当达到存储空间上限时,按照一定的回收算法移除旧数据。
  2. 基于容量大小
    基于容量大小的回收策略是指缓存设置了最大的数据条目数大小,当缓存的条目超过最大值后,按照一定的回收算法移除旧数据。
  3. 基于时间
    有两种典型的衡量时间的方式,如下:
    TTL(Time To Live)即存活期,意思是缓存数据从创建开始直到到期的一个时间段(不管在这个时间内有没有被访问,缓存数据都将过期)。
    TTI(Time To Idle)即空闲期,意思是缓存数据多久没被访问后移除缓存的时间。

缓存回收算法

使用基于存储空间和基于容量大小的缓存方式需要借助一定的回收算法策略去移除旧数据,常见的缓存回收算法有以下三种:

  1. FIFO(First In First Out)即先进先出算法,意思是先放入缓存的数据会被先移除。
  2. LRU(Least Recently Used)即最近最少使用算法,意思是使用时间距离现在最久的那个缓存数据会被移除。
  3. LFU(Least Frequently Used)即最不常用算法,意思是一定时间段内使用次数最少的那个缓存数据会被移除。

在实践中,使用LRU算法的缓存居多。

缓存的类型

按照缓存的可访问范围划分缓存数据的类型,系统内具有以下两类缓存:

  1. 全局共享缓存,系统内所有微服务应用均能访问的缓存数据。
  2. 本地专属缓存,只能被各个微服务应用自己访问的缓存数据。

缓存更新策略

系统采用先更新数据库,成功后,再让缓存失效的更新策略。采用这个策略,而不是采用“先删除缓存,再更新数据库”的策略,是为了避免并发操作下引发的访问脏数据的问题。即,当有两个并发操作,一个是更新操作,另一个是查询操作,当更新操作删除缓存后,查询操作没有命中缓存,它去将旧数据读取出来并放到缓存中去,然后更新操作更新了数据库。于是,在缓存中的数据还是 旧 的数据,导致缓存中的数据是脏的,而且还一直这样脏下去。

你可能已经注意到了,这里只是让缓存失效,并没有更新缓存,为什么不是写完数据库后更新缓存?这个选择主要是怕两个并发的写操作导致脏数据。这个策略有没有并发的问题?答案是有的。只是出现的概率比较低。比如,一个是读操作,但是没有命中缓存,然后就到数据库中取出数据,这时,来了一个写操作,写完数据库后,让缓存失效之后,之前的读操作再将旧的数据写入缓存,于是,造成了脏数据。说这个情况的出现概率比较小,是因为,它需要同时满足以下条件:需要发生在读缓存时缓存失效,并且并发着有一个写操作。而且读操作必须在写操作前进入数据库操作,且又要晚于写操作更新缓存。对一个数据库的操作来说,写操作会比读操作慢得多,而且还要锁表,要满足前述条件概率并不大。

缓存需要注意的场景

  1. 缓存穿透
    缓存穿透是指查询的数据在数据库里是不存,那么在缓存中自然也没有,所以,在缓存中查不到就会回到数据库中做查询,如果此类并发请求很多,那么对数据库压力势必很大,很容易跑满数据库连接,进而使得系统性能急剧下降。
  2. 缓存击穿
    缓存击穿是指对于某些热点的数据设置了过期时间,在缓存到期失效后,大量的并发请求会直接回数据库查询,进而引起很大的数据库访问压力。
  3. 缓存雪崩
    缓存雪崩只指缓存不可用或者大量缓存数据由于超时时间相同在同一时间段失效,使得大量并发请求回数据库查询,数据库压力过大引起系统雪崩。



转载请注明:清风亦平凡 » 基于缓存系统的描述

]]>
https://www.mlplus.net/2020/01/16/rediscache/feed/ 0
Windows 7 SP1安装.net core2.1无法安装问题 https://www.mlplus.net/2020/01/04/windows7-sp1-install-netcore21-error/ https://www.mlplus.net/2020/01/04/windows7-sp1-install-netcore21-error/#respond Fri, 03 Jan 2020 17:06:14 +0000 https://www.mlplus.net/?p=2219 因某些情况需要在测试人员机器上安装.net core 2.1,系统为Windows 7 SP1。安装.net core2.1,出现 sfx x64.cab has an invalid digital signature错误,安装不成功。错误信息如下:

A file that is required cannot be installed becquse the cabinet file
C:\ProgramData\Package Cache\{3551F085-7544-3527-84BA-9706CB1379A1}v2.1.14.0\sfx x64.cab
has an invalid digital signature. This may indicate that the cabinet file is
corrupt.

Windows 7 SP1安装.net core2.1无法安装问题-第0张图片

根据错误信息得知应该是证书相关问题,也没有详细探查原因。有可能安装程序访问微软相关证书出了问题,又或者网络链接不通的问题吧。不管如何,装个证书吧!

下载证书文件

MicrosoftRootCertificateAuthority2011

证书安装

  • 开始→运行→MMC
  • 文件→添加删除管理单元 (Ctrl+M)
  • 证书→计算机账户(其他的都保持默认,其他下一步)
  • 展开证书→受信任的根证书颁发机构→证书
  • 右击展开菜单,所有任务→导入
  • 选择下载好的cer证书文件,然后一直下一步就好了

完成以上操作后重新安装,net core2.1顺利安装成功。



转载请注明:清风亦平凡 » Windows 7 SP1安装.net core2.1无法安装问题

]]>
https://www.mlplus.net/2020/01/04/windows7-sp1-install-netcore21-error/feed/ 0
使用Windows API向指定窗口发送模拟键盘消息 https://www.mlplus.net/2019/12/30/windows-api-keybord-event/ https://www.mlplus.net/2019/12/30/windows-api-keybord-event/#respond Sun, 29 Dec 2019 16:55:53 +0000 https://www.mlplus.net/?p=2182 上周五在QQ群遇到群友提问的一个问题。问题是这样的:文字识别之后,当点击Excel单元格识别内容自动出现当前单元格中。我提供相关实现思路,使用相关Windows API来实现操作,其中基本思路就是:获取当前鼠标位置=>获取当前位置窗口句柄=>获得当前句柄类=>模拟键盘消息。但遗憾的是他一直没有搞定还一直问,无奈我就直接给他了简单的示例代码。其中使用的Windows API 接口为以下几个:

GetCursorPos

WindowFromPoint

GetClassName

keybd_event

使用Windows API向指定窗口发送模拟键盘消息-第0张图片

using MouseKeyboardActivityMonitor;
using MouseKeyboardActivityMonitor.WinApi;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WinApi;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {

        MouseHookListener mh;
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            //安装鼠标钩子
            mh = new MouseHookListener(new GlobalHooker());
            mh.Enabled = true;
            mh.MouseDoubleClick += mh_MouseMoveEvent;
            this.textBox1.Text = "Windows API实现键盘粘贴事件";
        }

        void mh_MouseMoveEvent(object sender, MouseEventArgs e)
        {
            try
            {
                Point p = new Point();
                WindowsAPI.GetCursorPos(ref p);
                IntPtr houseWindow = WindowsAPI.WindowFromPoint(p);
                if (houseWindow == IntPtr.Zero)
                {
                    return;
                }
                StringBuilder sb = new StringBuilder();
                WindowsAPI.GetClassName(houseWindow, sb, 255);
                if (sb.Length == 0)
                {
                    return;
                }
                if (!sb.ToString().ToLower().Contains("excel"))
                {
                    return;
                }
                Clipboard.SetText(string.IsNullOrWhiteSpace(this.textBox1.Text)?"Windows Api": this.textBox1.Text);
                System.Threading.Thread.Sleep(100);
                WindowsAPI.keybd_event((byte)Keys.ControlKey, 0, 0, 0);//按下
                WindowsAPI.keybd_event((byte)Keys.V, 0, 0, 0);
                WindowsAPI.keybd_event((byte)Keys.ControlKey, 0, 0x2, 0);//松开
                WindowsAPI.keybd_event((byte)Keys.V, 0, 0x2, 0);

            }
            catch (Exception ex)
            {
                this.textBox1.Text = ex.Message;
                GC.Collect();
            }
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            mh.Enabled = false;
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }
    }
}


示例下载

示例下载



转载请注明:清风亦平凡 » 使用Windows API向指定窗口发送模拟键盘消息

]]>
https://www.mlplus.net/2019/12/30/windows-api-keybord-event/feed/ 0
Visual Studio (VS)2017/2019安装Spy++工具 https://www.mlplus.net/2019/12/29/visual-studio-2017-2019-spy-plus-plus/ https://www.mlplus.net/2019/12/29/visual-studio-2017-2019-spy-plus-plus/#respond Sun, 29 Dec 2019 02:31:25 +0000 https://www.mlplus.net/?p=2168 最近因为某些原因需要用到spy++工具, 在Visual Studio中找不到Spy++工具,在系统中也没有找到。经过了解需要重新下载Spy++工具.在Visual Studio通过以下进行安装。

工具=>获取工具和功能=》单个组件=》Visual Studio C++核心功能

然后,勾选《 Visual Studio C++核心功能 》后修改完成,工具Spy++就此安装完成。如下图:

Visual Studio (VS)2017/2019安装Spy++工具-第0张图片
Visual Studio (VS)2017/2019安装Spy++工具-第1张图片
Visual Studio (VS)2017/2019安装Spy++工具-第2张图片



转载请注明:清风亦平凡 » Visual Studio (VS)2017/2019安装Spy++工具

]]>
https://www.mlplus.net/2019/12/29/visual-studio-2017-2019-spy-plus-plus/feed/ 0
常见的开源协议 https://www.mlplus.net/2019/10/29/how-to-choose-free-software-licenses/ https://www.mlplus.net/2019/10/29/how-to-choose-free-software-licenses/#respond Tue, 29 Oct 2019 06:00:42 +0000 https://www.mlplus.net/?p=1931 简介

开源软件(Open source software)对我们来说越来越不陌生,开源软件一方面让我们享用到了“免费的午餐”,另一方面有效的利用和学习开源软件,也能促进我们开发软件时的效率、提升软件质量。但是在使用和借鉴开源软件的时候,我们不得不关心一下它对使用者的诸多限制,比较常见的方式即协议授权(licence),这些协议中明确说明了使用者应该遵循的原则。

现在开源协议众多,通过Open Source Initiative组织批准的开源协议有50多种,本文介绍其中一些常见的协议。

常见的协议介绍

BSD协议

BSD开源协议是一个给予使用者很大自由的协议。开发者可以自由使用和修改源代码,也可以讲修改后的源代码作为开源或者专有软件再发布。但是有一下几个要求:

  • 如果再发布的产品中含有源代码,则在源代码中必须带有原来代码中的BSD协议。
  • 如果再发布的只是二进制类库/软件,则需要再类库/软件的文档和版权申明中包含原有代码中的BSD协议。
  • 不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。

BSD 代码鼓励代码共享,但需要尊重代码作者的著作权。BSD由于允许使用者修改和重新发布代码,也允许使用或在BSD代码上开发商业软件发布和销售,因此是对商业集成很友好的协议。而很多的公司企业在选用开源产品的时候都首选BSD协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或者二次开发。

Apache Licence 2.0(Apache-2.0)

Apache Licence是著名的非盈利开源组织Apache采用的协议。该协议和BSD类似,同样鼓励代码共享和最终原作者的著作权,同样允许源代码修改和再发布。但是也需要遵循以下条件:

  • 需要给代码的用户一份Apache Licence。
  • 如果修改了代码,需要再被修改的文件中说明。
  • 在衍生的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。
  • 如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache Licence。你可以再Notice中增加自己的许可,但是不可以表现为对Apache Licence构成更改。

使用这个协议的好处是:

  • 永久权利 一旦被授权,永久拥有。
  • 全球范围的权利 在一个国家获得授权,适用于所有国家。假如你在美国,许可是从印度授权的,也没有问题。
  • 授权免费 无版税, 前期、后期均无任何费用。
  • 授权无排他性 任何人都可以获得授权
  • 授权不可撤消 一旦获得授权,没有任何人可以取消。比如,你基于该产品代码开发了衍生产品,你不用担心会在某一天被禁止使用该代码

Apache Licence也是对商业应用友好的许可。使用者也可以再需要的时候修改代码来满足并作为开源或商业产品发布/销售。

GPL

我们很熟悉的Linux就是采用了GPL。GPL协议和BSD, Apache Licence等鼓励代码重用的许可很不一样。GPL的出发点是代码的开源/免费使用和引用/修改/衍生代码的开源/免费使用,但不允许修改后和衍生的代码做为闭源的商业软件发布和销售。这也就是为什么我们能用免费的各种linux,包括商业公司的linux和linux上各种各样的由个人,组织,以及商业软件公司开发的免费软件了。

GPL协议的主要内容是只要在一个软件中使用(“使用”指类库引用,修改后的代码或者衍生代码)GPL 协议的产品,则该软件产品必须也采用GPL协议,既必须也是开源和免费。这就是所谓的”传染性”。GPL协议的产品作为一个单独的产品使用没有任何问题,还可以享受免费的优势。

由于GPL严格要求使用了GPL类库的软件产品必须使用GPL协议,对于使用GPL协议的开源代码,商业软件或者对代码有保密要求的部门就不适合集成/采用作为类库和二次开发的基础。

其它细节如再发布的时候需要伴随GPL协议等和BSD/Apache等类似。

LGPL

LGPL是GPL的一个为主要为类库使用设计的开源协议。和GPL要求任何使用/修改/衍生之GPL类库的的软件必须采用GPL协议不同。LGPL允许商业软件通过类库引用(link)方式使用LGPL类库而不需要开源商业软件的代码。这使得采用LGPL协议的开源代码可以被商业软件作为类库引用并发布和销售。

但是如果修改LGPL协议的代码或者衍生,则所有修改的代码,涉及修改部分的额外代码和衍生的代码都必须采用LGPL协议。因此LGPL协议的开源代码很适合作为第三方类库被商业软件引用,但不适合希望以LGPL协议代码为基础,通过修改和衍生的方式做二次开发的商业软件采用。

GPL/LGPL都保障原作者的知识产权,避免有人利用开源代码复制并开发类似的产品

MIT

MIT是和BSD一样宽范的许可协议,源自麻省理工学院(Massachusetts Institute of Technology, MIT),又称X11协议。作者只想保留版权,而无任何其他了限制。MIT与BSD类似,但是比BSD协议更加宽松,是目前最少限制的协议。这个协议唯一的条件就是在修改后的代码或者发行包包含原作者的许可信息。适用商业软件。使用MIT的软件项目有:jquery、Node.js。
MIT与BSD类似,但是比BSD协议更加宽松,是目前最少限制的协议。这个协议唯一的条件就是在修改后的代码或者发行包包含原作者的许可信息。适用商业软件。使用MIT的软件项目有:jquery、Node.js。

MPL (Mozilla Public License 1.1)

MPL协议允许免费重发布、免费修改,但要求修改后的代码版权归软件的发起者 。这种授权维护了商业软件的利益,它要求基于这种软件的修改无偿贡献版权给该软件。这样,围绕该软件的所有代码的版权都集中在发起开发人的手中。但MPL是允许修改,无偿使用得。MPL软件对链接没有要求。

EPL (Eclipse Public License 1.0)

EPL允许Recipients任意使用、复制、分发、传播、展示、修改以及改后闭源的二次商业发布。使用EPL协议,需要遵守以下规则:

  • 当一个Contributors将源码的整体或部分再次开源发布的时候,必须继续遵循EPL开源协议来发布,而不能改用其他协议发布.除非你得到了原“源码”Owner 的授权
  • EPL协议下,你可以将源码不做任何修改来商业发布.但如果你要发布修改后的源码,或者当你再发布的是Object Code的时候,你必须声明它的Source Code是可以获取的,而且要告知获取方法;
  • 当你需要将EPL下的源码作为一部分跟其他私有的源码混和着成为一个Project发布的时候,你可以将整个Project/Product以私人的协议发布,但要声明哪一部分代码是EPL下的,而且声明那部分代码继续遵循EPL;
  • 独立的模块(Separate Module),不需要开源。

乌克兰程序员Paul Bagwell,画了一张分析图,说明应该怎么选择。阮一峰对图进行了汉化,如下图:

常见的开源协议-第0张图片



转载请注明:清风亦平凡 » 常见的开源协议

]]>
https://www.mlplus.net/2019/10/29/how-to-choose-free-software-licenses/feed/ 0
.NET Core api部署在IIS上405-Method Not Allowed https://www.mlplus.net/2019/06/12/netcoreapiiis405/ https://www.mlplus.net/2019/06/12/netcoreapiiis405/#respond Wed, 12 Jun 2019 01:00:06 +0000 https://www.mlplus.net/?p=1756 使用.net core api作为接口对外提供数据,在IIS Express上测试没有发现问题,部署到IIS后出现了405-Method Not Allowed。( 请求方式为DELETE ) .如下图:

.NET Core api部署在IIS上405-Method Not Allowed-第0张图片

由上图的错误得知,此问题应该是IIS未允许当前请求方式。首先查看aspNetCore在IIS中是否限制了请求方式,经过查看并未发现不被允许的请求方式。处理程序映射=>aspNetCore

.NET Core api部署在IIS上405-Method Not Allowed-第1张图片

通过了解 IIS拒绝PUT和DELETE请求是由默认注册的一个名为WebDAVModule的自定义HttpModule导致的。WebDAV的全称为Web-based Distributed Authoring and Versioning,它是一个在多用户之间辅助协同编辑和管理在线文档的HTTP扩展。该扩展使应用程序可以直接将文件写到Web Server上,同时支持文件的加锁和版本控制。微软是推动WebDAV成为一个标准的主导力量,它自己利用自定义的HttpModule实现了IIS针对WebDAV的支持。但是这个默认注册(注册名称为WebDAVModule)会拒绝HTTP方法为PUT和DELETE的请求,如果我们的站点不需要提供针对WebDAV的支持,解决这个问题最为直接的方式就是利用如下配置将注册的HttpModule移除即可


 <system.webServer>
 <modules runAllManagedModulesForAllRequests="true">
 <remove name="WebDAVModule" />
 </modules>
 </system.webServer>

或者


 <modules runAllManagedModulesForAllRequests="true" runManagedModulesForWebDavRequests="true" >
   <remove name="WebDAVModule" />
 </modules>

.NET Core下dev下是没有web.config,只有发布后才生成,这就导致每次发布都要修改。 这样非常不方便。如果没有使用到WebDAV ,可以直接移除这个模块。卸载程序=》启用或关闭Windows功能=>Internet Information Service=>万维网服务=>常见HTTP功能=>WEBDAV发布。

.NET Core api部署在IIS上405-Method Not Allowed-第2张图片

目前为止还没有找到更加合适的解决方案,以后有时间在看吧!



转载请注明:清风亦平凡 » .NET Core api部署在IIS上405-Method Not Allowed

]]>
https://www.mlplus.net/2019/06/12/netcoreapiiis405/feed/ 0
如何在Visual Studio中关闭垂直滚动条的缩略图模式 https://www.mlplus.net/2019/06/11/visualstudioscrollbar/ https://www.mlplus.net/2019/06/11/visualstudioscrollbar/#respond Tue, 11 Jun 2019 01:00:20 +0000 https://www.mlplus.net/?p=1747 Visual Studio编码窗口左侧垂直滚动条的缩略图模式,可以快速预览代码。不过个人特别不喜欢这种模式,我也不记得什么时候 Visual Studio 进行了设置,也许是我忘记了吧!如下图:

如何在Visual Studio中关闭垂直滚动条的缩略图模式-第0张图片

恢复原来简约模式(垂直滚动的条状模式)其实也很简单,但是Visual Studio和Visual Studio Code 是不太一样的。工具=》选项=》所有语言=》滚动条=》行为。这样可以对滚动条模式进行设置。如下图:

如何在Visual Studio中关闭垂直滚动条的缩略图模式-第1张图片



转载请注明:清风亦平凡 » 如何在Visual Studio中关闭垂直滚动条的缩略图模式

]]>
https://www.mlplus.net/2019/06/11/visualstudioscrollbar/feed/ 0
网页加速插件Decentraleyes https://www.mlplus.net/2019/06/05/decentraleyes/ https://www.mlplus.net/2019/06/05/decentraleyes/#respond Wed, 05 Jun 2019 01:00:54 +0000 https://www.mlplus.net/?p=1730 网页加速插件Decentraleyes-第0张图片
背景在开发或者学习过程中,会遇到相关问题需要解决。很多时候要去stackoverflow找前人的一些解决方案或者方法。但访问这个网站出奇的慢而且还很卡,最后会给出相关提示:“Stack Overflow requires external JavaScript from another domain, which is blocked or failed to load.”原因是该网站引用了一些google js资源,google 在中国大陆是被墙的,所有导致引用它的库的网页访问很慢。解决这问题有两个方法,一使用国外一些代理进行访问,二使用本地资源代替网站中的CND。本次记录的就是第二种方法。

Decentraleyes简介

Decentraleyes插件都是事先将一些第三方库文件在本地加载,当打开网页遇到使用其他第三方库文件时,马上进行拦截并从本地进行加载,这样就可以大大地提高网页的加载速度。

目前已经支持 Google Hosted Libraries, Microsoft Ajax CDN, CDNJS (Cloudflare), jQuery CDN (MaxCDN), jsDelivr (MaxCDN), Yandex CDN, Baidu CDN, Sina Public Resources, 及 UpYun Libraries,有不少国内的 CDN。而支持的库更是包括了 AngularJS, Backbone.js, Dojo, Ember.js, Ext Core, jQuery, jQuery UI, Modernizr, MooTools, Prototype, Scriptaculous, SWFObject, Underscore.js 及 Web Font Loader,基本上主流使用的第三方库都包含在内了。

Decentraleyes for chrome 插件

此插件需要先到github进行下载: https://github.com/Synzvato/decentraleyes .不过由于微软收购了github,这个作者把项目迁移到了其他地方。最新版可以到这个地方下载:https://git.synz.io/Synzvato/decentraleyes

下载源码解压后放到任何一个盘符,进入谷歌浏览器“扩展程序”功能后并开启开发者模式。通过“加载已解压的扩展程序”功能选择之前下载的源码并开启。

网页加速插件Decentraleyes-第1张图片

这样就完成了关于Decentraleyes for chrome的设置。因为不能访问谷歌浏览器应用市场,所以使用这种折中的方案。至于为什么不使用已经打包的插件,因为未经过谷歌认真的打包插件不受信任,谷歌浏览器新版本已经不支持了,所以使用了源文件方式达到这一目标。

网页加速插件Decentraleyes-第2张图片

Decentraleyes for Firefox 插件

网页加速插件Decentraleyes-第3张图片

下载地址:https://addons.mozilla.org/zh-CN/firefox/addon/decentraleyes/

使用火狐浏览器访问此地址并点击“添加到Firefox”等待完成即可。



转载请注明:清风亦平凡 » 网页加速插件Decentraleyes

]]>
https://www.mlplus.net/2019/06/05/decentraleyes/feed/ 0
Markdown基本语法 https://www.mlplus.net/2019/06/01/markdown/ https://www.mlplus.net/2019/06/01/markdown/#respond Sat, 01 Jun 2019 08:32:03 +0000 https://www.mlplus.net/?p=1677 Markdown基本语法-第0张图片

Markdown

Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档。

Markdown 语言在 2004 由约翰·格鲁伯(英语:John Gruber)创建。

Markdown 编写的文档可以导出 HTML 、Word、图像、PDF、Epub 等多种格式的文档。

Markdown 编写的文档后缀为 .md.markdown

Markdown 应用

当前许多网站都广泛使用 Markdown 来撰写帮助文档或是用于论坛上发表消息。例如:GitHub、简书、reddit、Diaspora、Stack Exchange、OpenStreetMap 、SourceForge等。

Markdown 语法

标题

Markdown 标题有两种格式。

第一种

使用 = 和 – 标记一级和二级标题。此种方式只能表示一级标题和二级标题,=和-的数量没有限制,只要大于一个就行 。


这是一级标题
========== 
这是二级标题 
---------

Markdown基本语法-第1张图片

第二种

使用 # 号可表示 1-6 级标题,一级标题对应一个 # 号,二级标题对应两个 # 号,以此类推。


# 这是一级标题
## 这是二级标题
### 这是三级标题
#### 这是四级标题
##### 这是五级标题
###### 这是六级标题

Markdown基本语法-第2张图片

列表

Markdown 支持有序列表和无序列表。

无序列表

无序列表使用星号(*)、加号(+)或是减号()作为列表标记 .


# -号
- 这是无序列表
- 这是无序列表
- 这是无序列表

# +号

+ 这是无序列表
+ 这是无序列表
+ 这是无序列表

# *号

* 这是无序列表
* 这是无序列表
* 这是无序列表


Markdown基本语法-第3张图片

有序列表

有序列表使用数字并加上 . 号来表示 。符号是英文状态下的。


# 有序列表

1. 这是有序列表
2. 这是有序列表
3. 这是有序列表
4. 这是有序列表

Markdown基本语法-第4张图片
有序列表的序号是根据第一行列表的数字按顺序排的。

列表嵌套

列表嵌套只需在子列表中的选项添加四个空格即可


1. 第一项:
    - 第一项嵌套的第一个元素
    - 第一项嵌套的第二个元素
2. 第二项:
    - 第二项嵌套的第一个元素
    - 第二项嵌套的第一个元素

Markdown基本语法-第5张图片

区块

Markdown 区块引用是在段落开头使用 > 符号 ,然后后面紧跟一个空格符号:


> 这是块引用
> 这是块引用

Markdown基本语法-第6张图片

另外区块是可以嵌套的,一个 > 符号是最外层,两个 > 符号是第一层嵌套,以此类推退:


> 这是块引用
> > 这是第二嵌套的引用
> > > 这是第三嵌套的引用

Markdown基本语法-第7张图片

代码

如果是段落上的一个函数或片段的代码可以用反引号把它包起来(`)。


`alert("Code");`

Markdown基本语法-第8张图片

代码区块

代码区块使用 4 个空格或者一个制表符(Tab 键)


	
	function Load(){
	 //etc
	}
	

Markdown基本语法-第9张图片

也可以用 “` 包裹一段代码,并指定一种语言(也可以不指定)


```json
{
	"name": "姓名",
	"age": 20
}
```

Markdown基本语法-第10张图片

链接

链接支持以下方式:


[链接名称](链接地址)

<链接地址>


这是一个链接[百度](https://www.baidu.com)

Markdown基本语法-第11张图片

图片


![alt 属性文本](图片地址)
![alt 属性文本](图片地址 "可选标题")

  • 开头一个感叹号 !
  • 接着一个方括号,里面放上图片的替代文字
  • 接着一个普通括号,里面放上图片的网址,最后还可以用引号包住并加上选择性的 ‘title’ 属性的文字。

![二维码](http://www.skyfinder.cc/wp-content/uploads/2018/11/weixin.gif)

Markdown基本语法-第12张图片

表格

制作表格使用 | 来分隔不同的单元格,使用  来分隔表头和其他行。

语法格式如下:


|  表头   | 表头  |
|  ----  | ----  |
| 单元格  | 单元格 |
| 单元格  | 单元格 |

Markdown基本语法-第13张图片

可以设置表格的对齐方式:

  • -: 设置内容和标题栏居右对齐。
  • :- 设置内容和标题栏居左对齐。
  • :-: 设置内容和标题栏居中对齐。

| 左对齐 | 右对齐 | 居中对齐 |
| :-----| ----: | :----: |
| 单元格 | 单元格 | 单元格 |
| 单元格 | 单元格 | 单元格 |

Markdown基本语法-第14张图片
注意:表格对齐方式一些编辑器是不支持的。

字体

Markdown 可以使用以下几种字体:


*斜体文本*
_斜体文本_
**粗体文本**
__粗体文本__
***粗斜体文本***
___粗斜体文本___

Markdown基本语法-第15张图片

分隔线

在一行中用三个以上的星号、减号、底线来建立一个分隔线,行内不能有其他东西。你也可以在星号或是减号中间插入空格


***

* * *

*****

- - -

----------

Markdown基本语法-第16张图片

删除线

文字要添加删除线,只需要在文字的两端加上两个波浪线 ~~ 即可 。


我没有删除线
我没有删除线
~~我有删除线~~

Markdown基本语法-第17张图片

特殊符号处理

Markdown使用反斜杠\插入语法中用到的特殊符号。在Markdown中,主要有以下几种特殊符号需要处理:


\   反斜线
`   反引号
*   星号
_   底线
{}  花括号
[]  方括号
()  括弧
#   井字号
+   加号
-   减号
.   英文句点
!   惊叹号

注意:在内容中输入以上特殊符号的时候一定要注意转义,否则将导致内容显示不全,甚至排版混乱。



转载请注明:清风亦平凡 » Markdown基本语法

]]>
https://www.mlplus.net/2019/06/01/markdown/feed/ 0