IT评测·应用市场-qidao123.com

标题: 【知识点】web项目怎样写安全这块创建 [打印本页]

作者: 汕尾海湾    时间: 2024-12-28 13:35
标题: 【知识点】web项目怎样写安全这块创建
文章目次


服务器

1、更改服务器长途端口
更改默认端口,默认端口相对来说是不安全的,建议修改默认长途端口为随机5位数的端口。
2、设置防火墙并关闭不需要的服务和端口
防火墙是网络安全的一个紧张组成部门,通过过滤不安全的服务而低沉风险。安装服务器时,要选择绿色安全版的防护软件,以防有被入侵的可能性。对网站提供服务的服务器,软件防火墙的安全设置最高,防火墙只要开放服务器端口,其他的一律都关闭,你要访问网站时防火墙会提示您是否允许访问,在根据现实情况添加允许访问列表。如许至少给系统多一份安全。
3、把密码设置的复杂一点
一但服务器IP被扫描出来默认端口,非法分子就会对服务器举行暴力破解,利用第三方字典天生的密码来尝试破解服务器密码,如果您的密码足够复杂,非法分子就需要大量的时间来举行密码尝试,也许在密码未破解完成,服务器就已经进入保护模式,不允许登陆。
4、修补已知的毛病
如果网站出现毛病时不及时处理,网站就会出现一系列的安全隐患,这使得服务器很容易受到病毒入侵,导致网络瘫痪,所以,平时要养成精良的习惯,时刻关注是否有新的需修补的毛病。
5、定时为数据举行备份
定时为数据做好备份,即使服务器被破解,数据被粉碎,或者系统出现故障崩溃,你只需要举行重装系统,还原数据即可,不消担心数据彻底丢失或损坏。
XSS(跨脚本攻击)

XSS 是 Cross Site Scripting 跨站脚本攻击的意思,X是英文Cross的简称
什么叫做跨站,就是非自己网站,如果本网站运行了来自别的网站的东西就叫做XSS,举个例子,如下是前端页面代码
  1. <!-- pug模板引擎语法 -->
  2. if from
  3.     span -- 欢迎来自!{from}的朋友
复制代码
下面是后端逻辑代码
  1. // from 来源于get参数
  2. ctx.render('index', {posts, comments, from:ctx.query.from || ''});
复制代码
现在,如果我们在页面url上加上如下代码 ?from=<script>alert(1)</script>可以看到页面弹出1,这就是一段XSS攻击代码,为什么是跨站攻击呢?
我们可以做如下变通?from=<script src='其他网站的脚本.js'></script>这种跨站脚本可以执行任何形式的攻击,其攻击原理是:步伐+数据=效果
当我们的数据中包含一部门步伐的时间,原来我们步伐的逻辑就会被改变了
页面中的脚本可以干什么,XSS的脚本就可以看什么,好比

常见的XSS攻击案例

XSS攻击的分类
XSS攻击的种类很多,尤其是变种很多,我们可以按照攻击代码的来源分为两种

XSS攻击注入点

好比步伐是如许的:<div>#{content}</div>, 但是可能会变成如许:<div><script>...</script></div>
紧张是存储型XSS攻击,内容提交后注入

好比原先是如许的<img src="#{image}" />,效果却成了如许<img src="1" onerror="alert(1)" />
具体步伐步伐好比前端是如许做的
  1. <!-- pug模板引擎 -->
  2. if avatarId
  3.     <img src="/image/!{avatarId}" />
复制代码
后端是如许的
  1. // 同样是通过某种参数来引用的
  2. ctx.render('index', {avatarId:ctx.query.avatarId || ''});
复制代码
只需要在url中如许访问即可:?avatarId=1" onerror="alert(1) 此时产生一个onerror的新属性
这时间就会执行此中的脚本,这显着是一种反射型攻击,其原理是通过冒号提前关闭原属性,并产生一个新的属性

本来逻辑是如许的var data = "#{data}";, 效果却成了 var data = "hello";alert(1);"";
这里的data来自服务器的数据,这个数据很可能是之前用户输入的,也就是用户提前将这个变量举行了关闭
这时间本来的一句代码变成了3句代码,这种可以是反射型攻击,也可能是存储型攻击

以QQ邮箱为例,可以设置恣意的格式,本质上是一段复杂的html
富文本会保留HTML, 但是HTML具有XSS攻击的风险
XSS常见的防御方案

  1. var escapeHtml = function(str) {
  2.     if(!str) return '';
  3.     str = str.replace(/</g, '&lt;');
  4.     str = str.replace(/>/g, '&gt;');
  5.     return str;
  6. }
  7. ctx.render('index', {from: escapeHtml(ctx.query.from) || ''});
复制代码
通过步伐处理HTML节点属性
对应的策略是转义引号,即:" &quto;也是定义一种转义函数
  1. var escapeHtmlProperty = function(str) {
  2.     if(!str) return '';
  3.     // 处理单引号和双引号
  4.     str = str.replace(/"/g, '&quto;');
  5.     str = str.replace(/'/g, '&#39;');
  6.     // 属性可以没有引号,处理没有引号的情况,即空格
  7.     str = str.replace(/ /g, '&#32;');
  8.     return str;
  9. }
  10. ctx.render('index', {avatarId: escapeHtmlProperty(ctx.query.avatarId) || ''});
复制代码
其实这两种HTML的过滤,过滤内容和属性是没有冲突的,我们可以把两者合并,如下, 有两种方式
方式1
  1. var escapeHtml = function(str) {
  2.     if(!str) return '';
  3.     str = str.replace(/</g, '&lt;');
  4.     str = str.replace(/>/g, '&gt;');
  5.     str = str.replace(/"/g, '&quto;');
  6.     str = str.replace(/'/g, '&#39;');
  7.     str = str.replace(/ /g, '&#32;');
  8.     return str;
  9. }
  10. ctx.render('index', {from: escapeHtml(ctx.query.from) || '', avatarId: escapeHtml(ctx.query.avatarId) || ''});
复制代码
方式2
  1. // type 0 过滤内容,type 1过滤属性
  2. var escapeHtml = function(str, type) {
  3.     if(!str) return '';
  4.     if(type === 0) {
  5.         str = str.replace(/</g, '&lt;');
  6.         str = str.replace(/>/g, '&gt;');
  7.     }
  8.     if(type === 1) {
  9.         str = str.replace(/"/g, '&quto;');
  10.         str = str.replace(/'/g, '&#39;');
  11.         str = str.replace(/ /g, '&#32;');
  12.     }
  13.     return str;
  14. }
  15. ctx.render('index', {from: escapeHtml(ctx.query.from, 0) || '', avatarId: escapeHtml(ctx.query.avatarId, 1) || ''});
复制代码
如许其实还是存在题目的
在html中多个连续空格,在渲染时间只会产生一个空格,如果将空格全部转换为html实体的时间,页面上的表现可能会有题目
一般来说,我们对空格不做任何转义,如许的话,我们要约定:属性一定要带上引号,按照html的规范,在html5之前,&也是需要举行转义的,在html5之后不需要了,按照惯例,一般还是会做一下转义,如许我们的转义步伐,就变成了
  1. var escapeHtml = function(str) {
  2.     if(!str) return '';
  3.     str = str.replace(/&/g, '&amp;'); // 这个只能放在最前面,否则会转义下面被转义过的含有&的转义字符
  4.     str = str.replace(/</g, '&lt;');
  5.     str = str.replace(/>/g, '&gt;');
  6.     str = str.replace(/"/g, '&quto;');
  7.     str = str.replace(/'/g, '&#39;');
  8.     return str;
  9. }
复制代码

在js中会插入来自背景或用户直接输入的数据,这个数据可能突破我们的引号界限添加新的脚本语句
就像上面案例url中:?from=sina";alert(1);" 这个alert(1)会被执行
我们开端的办理方案将数据中的引号转义,如果用到上面的escapeHtml方法会有题目,就会把这个变量变成一串含有转义字符的东西,如sina&quto;;alert(1)&quto;
其实这个在js中对变量来说是不对的,即使仅仅是一个字符串,也是很难看的,这里包含html实体,而js并不能剖析html实体,其实转义的html实体它不应该出现在js变量中,我们进一步思量将js用到的变量和html中的变量举行区分处理,如果用处理html的方法来处理一般数据,可能就会在数据中
  1. var escapeJs = function(str) {
  2.     if(!str) return '';
  3.     str = str.replace(/"/g, '\"'); // 此处转义: 将 " 转义为 "
  4.     return str;
  5. }
  6. ctx.render('index', {from: escapeJs(ctx.query.from) || ''});
复制代码
通过这种方式,我们就可以得到如许一串js变量sina";alert(1);" 也就是原汁原味的东西,但不会受到攻击
但是,如果访问的url是如许的:?from=sina\";alert(1);" 就会被转义成如许:sina\\";alert(1);\""
此时剖析上来说,添加的一个\,会继续转义被转义成的", 其实转义的只是前面的, 此时"还是被添加进去了
这时间sina"其着实变量的概念中就已经闭合了,剩下的;alert(1);"会存在语法错误
报错:Uncaught SyntaxError: Invalid or unexpected token
如果我们输入的url是如许的,?from=sina\";alert(1);//, 背面的//被当成注释,屏蔽了背面默认闭合引号产生语法错误的源头
此时,还是会执行alert(1),依然存在XSS攻击的可能,其缘故原由是输入的\在页面渲染的时间被当成了转义符
这时间,我们可以把\也处理了,如下重写escapeJs函数
  1. var escapeJs = function(str) {
  2.     if(!str) return '';
  3.     str = str.replace(/\\/g, '\\\\'); // 注意这里的4个\,2个为转义一个,即:\本身是个转义符,表达\本身,需要使用\\
  4.     str = str.replace(/"/g, '\"'); // 此处转义: 将 " 转义为 "
  5.     return str;
  6. }
复制代码
此时就不会报错,或者被攻击了,但是如许也不彻底,由于我们的字符串可能被单引号包裹
  1. var escapeJs = function(str) {
  2.     if(!str) return '';
  3.     str = str.replace(/\\/g, '\\\\'); // 注意这里的4个\,2个为转义一个,即:\本身是个转义符,表达\本身,需要使用\\
  4.     str = str.replace(/"/g, '\"'); // 此处转义: 将 " 转义为 "
  5.     str = str.replace(/'/g, "\\'"); // 此处转义: 将 " 转义为 "
  6.     return str;
  7. }
复制代码
如果再处理了单引号,会不会有其他情况呢?也不排除有其他情况,最保险的办法是对我们的数据举行json转义,所以,我们不通过escapeJs这个函数了,而是通过JSON.stringify来处理即可,即
ctx.render('index', {from: JSON.stringify(ctx.query.from) || ''});, 这是最好的处理方式

所谓富文本就是一大段的HTML,这段HTML可能会包含非常多的格式,我们需要保留这些格式
没办法把全部HTML转义,同样面临着XSS攻击, 一般的思路是做过滤,过滤又有两种
1 ) 按照黑名单举行过滤,如script标签,onerror属性等去除它们
相对简朴,但稍不留心就会留下毛病
2 ) 按照白名单举行过滤,如只允许部门标签和属性
实现较为麻烦,需要将HTML完全剖析成数据结构,对其举行过滤,再重组成HTML
通过利用黑名单来过滤,我们可以提供下面一个过滤函数,针对输入的内容举行过滤
  1. var xssFilter = function(html) {
  2.     if(!html) return '';
  3.     html = html.replace(/<\s*\/?script\s*>/g, '');
  4.     html = html.replace(/javascript:[^'"]*/g, '');
  5.     html = html.replace(/onerror\s*=\s*['"]?[^'"]*['"]?/g, '');
  6.     // ...继续处理其他 svg, object等可以运行脚本,稍不留神少一个就会造成漏洞隐患
  7.     // 所以并不推荐这种
  8.     return html;
  9. }
复制代码
通过白名单来过滤,保留部门标签和属性,首先需要把一大段的HTML剖析成树状结构,Dom树
这个和浏览器剖析HTML过程是类似的,针对这颗树,一个一个的遍历,去除不允许的,保留允许的
我们可以通过一个cheerio库来剖析html, 就是爬虫中利用到的,返回出一个类似Dom的结构,其特色是利用JQuery的API,上手很快,可以在npmjs官网找到
一般而言,我们在入库的时间处理富文本,如许比查询渲染页面时性能会更高
具体用法如下,我们提供一个xssFilter函数和白名单,对富文本数据举行过滤
  1. var xssFilter = function(html) {
  2.     if(!html) return '';
  3.     var cheerio = require('cheerio');
  4.     var $ = cheerio.load(html);
  5.     // 白名单
  6.     var whiteList = {
  7.         'img': ['src'],
  8.         'font': ['color', 'size'],
  9.         'a': ['href']
  10.     };
  11.     $('*').each(function(index, ele) {
  12.         if(!whiteList[ele.name]) {
  13.             // 这里一般直接移除
  14.             $(ele).remove();
  15.             // 如果想要保留script中的内容,也可以在remove之前保留其内容
  16.             return true; // true 相当于 continue,return false 相当于 break;
  17.         }
  18.         // 在白名单中
  19.         for(var attr in ele.attribs) {
  20.             if(whiteList[ele.name].indexOf(attr) === -1) {
  21.                 $(ele).attr(attr, null); // 过滤其他不允许属性
  22.             }
  23.         }
  24.         return $.html();
  25.     })
  26.     return html;
  27. }
复制代码
白名单是一个比力好的方案,但是其计划比力复杂,如果定的欠好,可能会影响业务,一般保举白名单库,也就是别人写好的XSS过滤库,好比github上的js-xss库js-xss 地址:https://github.com/leizongmin/js-xss,我们可以直接如许利用
  1. var xssFilter = function(html) {
  2.     if(!html) return '';
  3.     var xss = require('xss');
  4.     var ret = xss(html, {
  5.         // 也可以自行指定
  6.         whiteList: {
  7.             img: ['src'],
  8.             a: ['href'],
  9.             font: ['size'],
  10.         },
  11.         onIgnoreTag() {
  12.             return '';
  13.         }
  14.     });
  15.     return ret;
  16. }
复制代码
利用第三方库可能会有一些意料之外的局限,但是安全一般是可以保障的,如果轻便开辟建议选择第三方库,如果要高度定制,就要自己来写白名单
CSRF(跨站请求伪造)

CSRF(Cross-Site Request Forgery),中文名称:跨站请求伪造,缩写为:CSRF或XSRF,它是一种对网站的恶意利用,和XSS不同的是,XSS是利用站点内的信任用户,而CSRF则是通过伪装来自受信任用户的请求来利用受信任的网站。
可以这么理解:攻击者盗用了你的身份,以你的名义向第三方网站发送恶意请求。
CSRF能做的事变包括利用你的身份发短信、邮件,举行转账交易,乃至盗取你的账号等。

XSS攻击原理/过程:
假设某银行网站A以GET请求来发起转账握作,转账的地址为www.xxx.com/transfer.do?account={你的账号}&money={转账金额}
而某论坛B上,一个恶意用户上传了一张图片,而图片的地址栏中填的并不是图片的地址,而是上面这个转账地址。
  1. <img src="http://www.xxx.com/transfer.do?accountNum=123&money=100000000">
复制代码
当你登录网站A后,没有及时登出,这时你访问了论坛B,并点击了这张图片,不幸的事变发生了,你会发现账户内里少了1个小目标……
为什么会如许呢?在你登录银行A时,你的浏览器端会天生银行A的cookie,而当你访问论坛B中这张恶意图片时,页面上的<img>标签需要浏览器发起一个新的HTTP请求,以获得图片资源,当浏览器发起请求时,请求的却是银行A的转账接口,而且会带上银行A的cookie信息,效果银行的服务器收到这个请求后,会认为是你发起的一次转账操作,因此接口请求乐成。
当然,绝大多数网站都不会利用GET请求来举行数据更新,因此,攻击者又改进方案:
假设银行将其转账方式改成POST提交,而论坛B恰恰又存在一个XSS毛病,恶意用户在它的页面上植入如下代码:
  1. <form id="aaa" action="http://www.xxx.com/transfer.do" method=“POST" display="none">
  2.   <input type="text" name="account" value="123"/>
  3.   <input type="text" name="money" value="100000000"/>
  4. </form>
  5. <script>var form = document.forms['aaa’];   form.submit();</script>
复制代码
CSRF防御措施:
response.setHeader(“Set-Cookie”, “cookiename=cookievalue;HttpOnly”);
HTTP请求头中有一个属性叫Refer,记录了该HTTP请求的来源地址。背景获取请求头中的Refer的值,判断是否是本网站域名,如果不是就有可能是CSRF攻击,则拒绝该请求。
SQL注入

原理:
所谓SQL注入,就是通过把SQL命令伪装成正常的HTTP请求参数通报到服务端,款骗服务器终极执行恶意的SQL命令,达到入侵目的。攻击者可以利用SQL注入毛病,查询非授权信息,修改数据库服务器的数据,改变表结构,乃至是获取服务器root权限。总而言之,SQL注入毛病的危害极大,攻击者采用的SQL指令决定了攻击的威力。现在涉及的大批量数据泄漏的攻击事件,大部门都是通过SQL注入来实施的。
示例:
假设某个存在毛病的网站登录页需要输入用户名和密码,背景吸收到参数后是直接拼接SQL查数据库,如:
String sql = “select * from t_user where username = ‘” + name + ”’ and password = ‘” + pwd + ”’”;
正常情况下,如果密码不正确是查询不到数据的,现在某恶意用户输入的密码为:’ or ‘1’ = ’1
此时拼接的语句就成了:
String sql = “select * from t_user where username = ‘test’ and password = ‘’ or ‘1’ = ‘1’ ”;
显然此时可以查到数据,由于直接可以无需密码这个条件。
这只是最简朴的示例,真实情况中黑客会想尽一切办法钻SQL的毛病。一旦被攻击者找到毛病,轻则盗取数据、欺骗网站举行登录,重则直接加入drop/delete等语句删库跑。
防御措施:
感谢现在很多实用的持久层框架,不仅提高编码服从,而且很多题目在框架层面办理了。好比框架一般会利用占位符/变量的方式代替拼接SQL,如许的话引号这种敏感字符会被转义,不会当成SQL来执行。在开辟过程中尽量不要随意拼接原生SQL语句。
对存储的密码举行单向Hash,如利用MD5对密码举行择要。不外近年来MD5也可能被彩虹表法举行破解,因此安全起见还可以利用哈希加盐法(Hash + Salt),即给密码末端加点料(一串私有key)然后再举行Hash,如许就很难破解了。
劫持攻击

一、怎么防御网页劫持?
1、通例防护措施
利用建站系统的站点,常常会遇到一些大规模爆发式通例毛病,这类毛病影响大,修补措施官方更新较快,巨细站点都需要及时关注于更新,特别是利用开源步伐的站点。
当然了大家都不可能时时刻刻的关注信息,但又拍错失修复机会怎么办?
建议站点利用第三方的安全观测平台,可以非打仗式检测,另外还带有短信和邮件通知功能,特别得当站长利用,这里我保举百度云观测和百度安全指数这2款产物,当然还有其他的检测平台,这里大家自行选择即可。
但是这里要特别注意的是不要利用太多监测平台,监测平台会定期去检测测试会给服务器带去一定的压力。
2、云服务防护
现在较为火的几个云主机平台都提供了一些安全防护软件,究竟毛病的爆发肯定是早于修补,而部门厂商也不会一下子就能够出补丁来修复,这时间利用比方安骑士这类产物,通过云服务商的技能团队第一时间无缝或屏蔽毛病,至少可以支撑到厂商发布毛病为止。
云服务除了上述安全防护组件外,大家应该还看到过一个叫做安全组的东西,浅易的来说就是防火墙端口策略,可以直接在云面板举行端口控制,好比近期爆出的方程式多个0DAY,如果你只开了必要的端口,现实上都无需修补。一般来说我们打开长途端口、HTTP/HTTPS端口、FTP端口基本上足矣,如无特别服务可以关闭,可以省事很多。
3、服务器端防护
在服务器端大家可以安装第三方的杀毒、防护软件,这些软件带有大部门常见的防护机制,对付一般小白足矣。
现在市面上安全狗和云盾算是较为优秀的服务器防护软件。
4、网页防护
一般我都建议那些敏感站点,动静态分离、读取存储分离,我们都知道网页被劫持最常见的就是被提权,如果设置好权限可以最洪流平上就可以制止被提权。
网页被劫持怎么办?怎样处理?
二、网页被劫持怎么办?网页劫持修复思路方法
当你网页遇到劫持时,可以参考以下修复思路举行处理:
1、举行隔离止损。
2、通过日记和行为分析找到毛病点。
3、通过补丁修复毛病或暂时修补毛病。
4、 查抄系统权限打扫后门。
5、 大部门劫持都是带有恶意的,一般都会植入非法违规内容,针对这类内容,我们要第一时间删除,去平台提死链。
6、 观察搜索引擎表现,若有未清数据继续处理。
web安全学习导图


保举阅读

多少道防线才华挡住顶尖黑客?

来源

怎么做好web服务器安全措施
Web渗透测试----1、Web安全学习导图
关于XSS攻击及其防御
CSRF攻击原理与防御措施
网页劫持防御方法,网页被劫持怎么办?
SQL注入攻击原理与防御措施
本文转自 https://blog.csdn.net/weixin_44231544/article/details/126524309?ops_request_misc=&request_id=&biz_id=102&utm_term=web%E5%AE%89%E5%85%A8&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-8-126524309.142v100pc_search_result_base4&spm=1018.2226.3001.4187,如有侵权,请接洽删除。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4