从后端角度看安全

Posted TheBlindM

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从后端角度看安全相关的知识,希望对你有一定的参考价值。

跨站脚本攻击(XSS)

什么是XSS

跨站脚本工具,全程是Cross Site Script,为了和CSS 区分,所以叫XSS。
XSS 攻击,通常指黑客通过html注入,来纂改了网页,插入恶意脚本。
人话就是把用户的数据当成了html代码的一部分来运行了
在线练习

反射型XSS
反射型XSS又称非持久型XSS,只是简单把用户输入的数据反射给浏览器

存储型XSS
存储型XSS又称持久型XSS

为什么注入了就能运行

url?name=<script>alert(1)</script>

<h2 align="center">欢迎用户:name</h2>

在jsp或者asp这类后端渲染的会出现xss
因为 后端会把值直接渲染,返回给浏览器

<h2 align="center">欢迎用户:<script>alert(1)</script></h2>

为什么现在vue或者现代化的前端框架中xss会很困难?

<h2 align="center">欢迎用户:name</h2>

在vue中插值相当于v-text也就是js中的outerText,只会当成文本处理

危害

你就 想象一下你的网站,别人在里面添加js代码,是不是内裤都给看穿了

  • 代理转发流经被攻击者的所有 Web 流量,即实施中间人攻击。
  • 窃取或篡改应用 cookie 用于会话劫持。
  • 钓鱼

危害很多只简单列几个

防御

1.输入检查
过滤<>等特殊字符,但是可能会改变程序的语义。

2.输出检查
使用安全的编码函数
html ->HemlEncode
javascript ->JavascriptEncode

3.使用现代化的前端框架
4.设置Http only
这样通过js脚本将无法读取到cookie信息,这样能有效的防止关于会话的XSS攻击。

CSRF

跨站点请求伪造(Cross Site Request Forgery)

什么是CSRF

我现在写了一个页面,页面里的逻辑是 请求B站注销账户,然后我把链接发给了你,你点开后,如果你最近登录了B站,那么你的账号就被注销了,这就是跨站点请求伪造

危害

CSRF一般都是产生写数据操作的url,因为CSRF过程中,攻击者是无法获得返回的数据的,所以读的操作对他没有意义。
危害显而易见,直接内库被看穿!
顺便说一下SSRF

预防

  • token
    因为token 不会被自动提交,前端在登录成功后在本地缓存token,然后在请求时在请求头中带上token,
    所以CSRF时并不会自动带上token

SSRF

服务端请求伪造(Server Site Request Forgery)

什么是SSRF

当我们服务端提供了从其它服务器应用获取数据的时候,坏银恶意使用该接口来代理攻击

危害

坏银使用恶意的url来访问本来访问不到的内网服务
例如:
公司的一个老接口,现在已被弃用!

    @ApiOperation(value = "图片-下载代理,解决跨越问题")
    @RequestMapping(path = "/download", method = RequestMethod.GET)
    public ResponseEntity<Resource> download(@RequestParam(value = "url") String url) throws IOException 
         String fileName = url.substring(url.lastIndexOf("/") + 1);
        byte[] bytes = IOUtils.toByteArray(new URL(url));
        ByteArrayResource resource = new ByteArrayResource(bytes);

        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Disposition", String.format("attachment;filename=\\"%s", fileName));
        return ResponseEntity.ok()
                .headers(headers)
                .contentLength(bytes.length)
                .contentType(MediaType.APPLICATION_OCTET_STREAM)
                .body(resource);
    

当我本地启动了一个服务时,使用postman请求


直接内裤被打穿!!

预防

  • 内网开启鉴权
  • 过滤内网服务ip
  • 只允许http和https协议访问

SQL注入

对于后端来说SQL 注入可以说非常熟悉了。

盲注

服务端关闭异常显示,攻击者通过注入条件语句来验证是否存在sql注入漏洞
荔枝:

http://path.com/item?id=1
后端sql: select * from user where id= 1

注入:

http://path.com/item?id=1 and 1=1
http://path.com/item?id=1 and 1=2

通过验证上述sql注入返回结果,来判断是否存在sql注入
(定时攻击)Timing Attack
有时 id 是比较复杂的如uuid,这时你就不能通过上面的梨子来盲注了

mysql 中 BENCHMARK(count,expr) 用来测试函数执行count次,来查看耗时
因此 通过注入BENCHMARK来判断耗时是否有增加来判断是否存在SQL注入

预防

1.预编译
2.存储过程
存储过程中尽量不要使用动态SQL
3.检查数据类型

在使用数据库时应该严格 遵守最小权限原则。

XML注入

与HTML注入相似,解决方案也是类似,对用户输入中的保留字符进行转义即可

文件上传漏洞

什么是文件上传漏洞

文件上传漏洞是指用户上传了一个可执行的脚本文件。
触发条件:

  • 上传的文件能被web容器解析
  • 用户能访问到该文件

如果文件上传了,不能被用户访问到或者不能被web解析,那就说明这个这个脚本不会运行,所以就不算漏洞!!

预防

  1. 文件上传的目录设置为不可执行
    在实际业务中文件都放到了独立的存储系统中如OSS,一方面降低的系统的性能的损耗,也杜绝的执行漏洞

  2. 判断文件类型,结合MIME Type和文件后缀等,简单的通过后缀名称来判断文件的类型,是不安全的,

  3. 上传后修改文件名称和路径
    文件上传后,黑客想要执行它,就要先能访问到它,这样可以增加攻击成本

  4. 单独设置文件服务器域名
    因为同源策略,会导致大部分攻击失效,同源策略(协议相同,端口号相同,域名相同)是指未经允许的情况下,不能够访问其他域下的内容,如果没有同源限制,那么浏览器中的cookie等其他数据可以任意读取,不同域下的DOM任意操作,ajax任意请求其他网站的数据

拒绝服务

分布式拒绝服务

什么是分布式拒绝服务

分布式拒绝服务也就是 大家所熟知的DDOS (Distributed Denial of Service),利用合理的请求,来造成服务过载从而导致服务不可用!

DDOS分为 网络层和应用层

预防

这里的预防是预防应用层的DDOS

  • 使用钞能力,与运营商合作
  • 限制请求频率
  • 修改配置
    例如nginx 限制每秒请求数等
  • 性能优化
    • 将数据库压力转移到内存中,及时的释放资源
    • 负载均衡
    • CDN
  • 验证码
    虽然验证码,很影响体验,不过能有效的解决自动重放行为

正则攻击

MD正则写的不好,也会造成资源耗尽,从而拒绝服务。
正则的原理是基于NFA,就是个状态机,有缺陷的正则会消化大量的资源。

我是谁:没有绝对安全的系统

参考:
白帽子讲WEB安全

从后端角度看 php 中的 Flux 架构

【中文标题】从后端角度看 php 中的 Flux 架构【英文标题】:Flux architecture in php from Backend Perspective 【发布时间】:2016-01-02 03:09:20 【问题描述】:

严格从后端的角度来看,我如何实现 Flux 架构? 明确地说,MVC 设计模式实际上明确了文件应该如何排列,框架有自己的实现但仍然明确如何安排和组织项目。根据 Flux 架构,我应该如何构建我的项目代码?还有 是否有任何 Flux 架构的开源框架,比如 codeignighter 是用于 MVC 的?

在我阅读过的所有关于 Facebook 的 Flux 架构的文章和教程中,它们都使用 Nodejs 后端进行演示,前端通常是 reactJS(我也读过一篇使用 angularJS 的文章)。但他们都专注于前端视角。

我从来都不是 MVC 的粉丝,自从我发现 Micro-frameworks 以来,我一直使用我自己版本的 Modal-View 设计模式(令人惊讶地类似于精简的 Flux 模式)。但我一直对如何构建它感到迷茫。

Facebook 关于 Flux 模式的帖子解释了很多关于速度和安全性的内容。但是所有的教程都只关注 ReactJS。 Pluralsight 的教程、egghead 和我在过去一年中遇到的所有其他内容都使用 NodeJS 后端。其中 99% 并没有真正展示 Flux 架构,而是展示了使用 ReactJS。 所以经过将近一年的搜索,我仍然不清楚通量到底是什么。

【问题讨论】:

投反对票的人至少可以屈膝解释你投反对票的原因。你不喜欢的可以改变,你不明白的可以解释。匿名投票对任何人都没有帮助。你实际上是在阻碍某人的学习。 我没有给你投反对票,但可能是因为问题太广泛了 我编辑了问题并重组了我的问题,以便更清楚地了解我想要理解的内容。感谢@Rasclatt 的提示, 反对者应该发表评论。这个问题表明对反应、通量、可能是 mvc 和前端/后端分离的理解非常糟糕,但这不是投反对票的理由。至少发表评论。 【参考方案1】:

没有特定的后端架构,flux 模式是针对前端的。它也是用特定的反应元素构建的,这就是你找不到其他实现的原因。 您可以复制原理以便在另一个框架中生成相同的方案

【讨论】:

我不太确定这一点。 FB 特别表示 MVC 模式对于非常大的项目失败,延迟了向客户端的内容交付。所以他们将 Facebook 代码从 MVC 转移到了 Flux。我认为他们在谈论后端。 所以根据你的说法,我只需要后端,一个将数据转发给客户端的模式,客户端中的反应元素将在页面上显示它。我一直认为“DISpatcher”和“Action”是服务器组件。让我试试你的方法。 根本不是 dispatcher 是一个简单的前端单例,Action 是一个文件,它收集前端交互以及最终对服务器的调用。 React 和 Flux 都是关于前端的。我会说通量是一种 MV* 模式 在我目前的工作中,有 get 路由器加载第一页。然后我使用大量 $.ajax 请求发布路由器,它返回我在页面上更新的完整 html 代码。所以我只需要在前端从 $.ajax 切换到 ReactJS,调整后端返回的内容。我不需要对后端应用程序进行任何重大重组吗?我走上正轨了吗? 你误会了调度员。没有教程说它可以打电话。而且只有一名调度员。 Dispatcher 是一个在 action 和 store 之间进行通信的简单单例。您无需更新后端。还说“我只需要在前端从 $.ajax 切换到 ReactJS”没有任何意义。您将在操作中调用 ajax,然后操作将使用调度程序填充存储,然后视图将自动存储并更新。【参考方案2】:

PHP 没有通量模式。不过,有一个基于 libevent 的 php 服务器核心,称为 React.php。

您在考虑 mvc 和模式时提出了错误的问题,这就是为什么我将尝试解释不同的观点,甚至为什么他们使用 nodejs 示例。所以首先nodejs不是mvc,也不是框架,而是一个简单的服务器进程来调用工作线程——典型的php中的apache服务器/nginx,或者也称为“调度程序”。动作处理程序是简单的类,具有在事件或函数上运行的方法(想象一下原始的 php 方式,使用 Web 服务器作为路由器调用模板或代码的脚本,并且在 php 框架中没有路由器)。所以这有点像回到原始的 payternless php,但有一些不同:

动作处理程序是休眠的工作人员。他们不会在没有事件的情况下执行,并且可能是数千个。如果它们启动了,我们可以在服务器死机之前说 10 点。

动作句柄的代码非常少且专门的代码使用尽可能少的资源,并尽可能在 0.000x 秒内运行。喜欢简单的

回声“你好世界”;

而不是框架。你需要假设每个线程 8mb 而不是 300mb 来运行 symfony 2。

您有一个 php 应用程序正在运行并充当 apache 的替代品。以同步非阻塞模式(libevent 方式)与 websockets 建立连接

所以 nodejs 被构建为一个可扩展的调度器,并且 js 仍然没有因设计模式和框架而臃肿。这就是他们使用它作为示例的原因——它打破了“这是不恰当的,因为不是设计模式和框架代码”。

对于通量,您需要回到原始的 php 思维方式,相信 Rasmus Lerdorf 的话“它们都糟透了!”关于他对框架的看法,然后使用多线程原始 php 非常简单且节省资源的代码来扩展这个想法。

这就是为什么 facebook 以“MVC 对大型项目来说是一个糟糕的范例,无法支持或扩展。我们创建了一个架构来打破它。”开始了第一个通量演示。设计模式深深地基于mvc。 Flux 以简单的 oop 表示形式返回到功能类似的代码,以提高可读性。但是对于每个表记录来说,更少的类和继承以及没有模型/实体的简单代码是必须的。

所以有一个基于 Symphony react 的包,它可以从 symfony 项目中创建一个应用程序。但是你使用 sumfony 来启动调度程序,然后你应该疯狂地使用学说、树枝等。 Apache + symfony 和 http 请求会更好,因为脚本死掉了,你不需要为 5000 个线程中的每一个保留 100mb,但每次 300mb x 5。如果你使用flux,你会忘记mvc。再说一遍,FLUX 是一种忘记 MVC、模式和框架的方法,开始思考业务问题和需求,再次编写清晰简单的代码。

【讨论】:

Dbf,我不是以英语为母语的人,作为程序员,我的解释很混乱。感谢您的更正。

以上是关于从后端角度看安全的主要内容,如果未能解决你的问题,请参考以下文章

Spring安全和角度

星说·从数据分析角度看安全运营 深度探索攻击有效性验证

多角度看虚拟化的安全问题

从安全角度看Oauth2.0授权码模式

比使用 routeguard 更安全地保护有角度的路线?

如何在浏览器中安全地存储 JWT?