【三十天精通Vue 3】第二十一天 Vue 3的安全性详解

news2024/11/28 22:47:01

请添加图片描述

✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: 三十天精通 Vue 3

文章目录

    • 引言
    • 一、Vue 3 中的安全问题
      • 1.1 前端安全问题概述
      • 1.2 Vue 3 中的安全问题
        • 1.2.1 跨站脚本攻击(XSS)
        • 1.2.2 跨站请求伪造(CSRF)
        • 1.2.3 点击劫持攻击
        • 1.2.4 客户端数据篡改
        • 1.2.5 客户端信息泄露
          • 1.2.5.1 代码中包含敏感信息
          • 1.2.5.2 调试信息泄露
          • 1.2.5.3 未加密的通信
          • 1.2.5.4 前端存储敏感信息
    • 二、Vue 3 中的安全防范措施
      • 2.1 跨站脚本攻击(XSS)防范
        • 2.1.1 使用内置的过滤器
        • 2.1.2 使用第三方库
        • 2.1.3 使用 HTML 实体编码
      • 2.2 跨站请求伪造(CSRF)防范
        • 2.2.1 使用 Cookie + Token 方式
        • 2.2.2 使用 SameSite 属性
        • 2.2.3 后端进行身份验证
      • 2.3 点击劫持攻击防范
        • 2.3.1 使用 X-Frame-Options
        • 2.3.2 使用 CSP
      • 2.4 客户端数据篡改防范
        • 2.4.1 对表单数据进行校验
        • 2.4.2 使用 Immutable.js
      • 2.5 客户端信息泄露防范
        • 2.5.1 使用 HTTPS
        • 2.5.2 避免在前端存储敏感信息
    • 三、Vue 3 中的安全最佳实践
      • 3.1 在 Vue 3 中的安全最佳实践
        • 3.1.1 在 Vue 3 项目中使用 HTTPS
        • 3.1.2 在 Vue 3 项目中防范跨站脚本攻击
        • 3.1.3 在 Vue 3 项目中防范跨站请求伪造攻击
          • 3.1.3.1 使用 Cookie + Token 方式
          • 3.1.3.2 使用 SameSite 属性
        • 3.1.4 在 Vue 3 项目中防范点击劫持攻击
          • 1. 使用 X-Frame-Options 报头
          • 2. 使用 frame-ancestors 报头
        • 3.1.5 在 Vue 3 项目中防范客户端数据篡改和信息泄露
          • 1. 对表单数据进行校验
          • 2. 下面是一个使用 Immutable.js 实现不可变数据的示例代码:

引言

随着 Web 应用程序的快速发展,前端技术也在不断地进步和发展,Vue 3 作为目前最流行的前端框架之一,其优秀的性能和易用性深受开发者的喜爱。然而,安全问题却是前端开发者需要关注的一个重要问题。

在开发 Web 应用程序时,安全问题涉及到诸多方面,比如跨站脚本攻击(XSS)、跨站请求伪造(CSRF)、点击劫持攻击、客户端数据篡改和客户端信息泄露等问题。这些问题可能会导致用户数据的泄露、系统崩溃等严重后果,因此,前端开发者需要了解这些安全问题,并采取相应的防范措施来保护用户数据和应用程序的安全性。

在本文中,我们将详细介绍 Vue 3 中的安全问题,并提供一些防范措施和最佳实践,以帮助您更好地保障 Vue 3 项目的安全性。

一、Vue 3 中的安全问题

1.1 前端安全问题概述

在介绍 Vue 3 中的安全问题之前,我们先来了解一下前端安全问题的概述。在前端开发中,常见的安全问题包括:

  • XSS(Cross-Site Scripting,跨站脚本攻击)
  • CSRF(Cross-Site Request Forgery,跨站请求伪造)
  • 点击劫持攻击
  • 客户端数据篡改
  • 客户端信息泄露

这些安全问题都可能导致用户数据的泄露、系统崩溃等严重后果。因此,前端开发者需要采取相应的措施来保护应用程序的安全性。

1.2 Vue 3 中的安全问题

1.2.1 跨站脚本攻击(XSS)

跨站脚本攻击(XSS)是一种常见的 Web 安全漏洞,攻击者通过注入恶意脚本代码,使得用户在浏览页面时执行这些脚本,从而达到攻击的目的。Vue 3 中的组件模板语法可以使得攻击者更容易地注入恶意代码,因此需要采取措施防范 XSS 攻击。

1.2.2 跨站请求伪造(CSRF)

跨站请求伪造(CSRF)是指攻击者通过某种方式欺骗用户在已登录的情况下访问攻击者制作的页面,从而发起一个伪造的请求,以此来冒充用户完成某些操作。Vue 3 中也存在 CSRF 的安全隐患,需要采取措施进行防范。

1.2.3 点击劫持攻击

点击劫持攻击是指攻击者在 Web 页面中嵌入一个透明的 iframe,使得用户在不知情的情况下点击了页面中的某个位置,触发了 iframe 中的操作,从而达到攻击的目的。Vue 3 中也存在点击劫持攻击的风险。

1.2.4 客户端数据篡改

客户端数据篡改是指攻击者在客户端上修改请求数据,从而达到修改服务器数据的目的。在 Vue 3 中,用户可以通过浏览器的开发者工具修改前端的数据,从而达到恶意修改数据的目的。

1.2.5 客户端信息泄露

客户端信息泄露是指敏感信息被泄露到客户端,使得攻击者可以通过某些手段获取到这些信息。在 Vue 3 中,存在一些常见的客户端信息泄露场景,例如:

1.2.5.1 代码中包含敏感信息

在开发 Vue 3 应用时,如果将敏感信息(如密码、密钥等)直接写在代码中,那么这些信息就可能被恶意攻击者获取到。因此,开发者应该避免在代码中包含敏感信息,而应该使用安全的存储方式,如环境变量或后端配置等方式来获取这些信息。

1.2.5.2 调试信息泄露

在 Vue 3 应用中,默认情况下会在浏览器的控制台中输出很多调试信息,例如警告、错误信息等。如果这些信息包含敏感信息,那么就有可能被攻击者利用。因此,开发者应该在生产环境中禁用调试信息输出,以避免敏感信息泄露。

1.2.5.3 未加密的通信

如果 Vue 3 应用通过未加密的方式与后端通信,那么就有可能被攻击者截获通信数据,并获取其中的敏感信息。因此,开发者应该在应用中使用 HTTPS 协议来保证通信的安全性。

1.2.5.4 前端存储敏感信息

在 Vue 3 应用中,如果将敏感信息存储在前端,例如使用 LocalStorage、SessionStorage 等方式,那么这些信息就有可能被攻击者获取到。因此,开发者应该避免在前端存储敏感信息,而应该将这些信息存储在后端,通过后端接口进行访问。

二、Vue 3 中的安全防范措施

2.1 跨站脚本攻击(XSS)防范

2.1.1 使用内置的过滤器

Vue 3 提供了内置的过滤器,可以用来防止跨站脚本攻击。例如,v-text 指令可以用来替代 {{ }} 的方式来显示文本内容,这样就不会对文本内容进行 HTML 解析。

2.1.2 使用第三方库

除了使用 Vue 3 内置的过滤器,还可以使用第三方库来防范跨站脚本攻击。例如,xss 库可以帮助你将用户输入的 HTML 标记转换成实体,从而避免了标记被解析的问题。

2.1.3 使用 HTML 实体编码

使用 HTML 实体编码是防范跨站脚本攻击的一种简单方法。将所有用户输入的内容进行 HTML 实体编码,可以将标记转换成实体,从而避免了标记被解析的问题。例如,< 可以替代 <> 可以替代 >

2.2 跨站请求伪造(CSRF)防范

2.2.1 使用 Cookie + Token 方式

使用 Cookie + Token 方式是一种有效的防范跨站请求伪造攻击的方法。在发送请求时,将 Token 作为请求的参数一同发送,后端进行验证。如果 Token 验证失败,则拒绝请求。

2.2.2 使用 SameSite 属性

使用 SameSite 属性可以防止跨站请求伪造攻击。该属性可以在 Cookie 中设置,使得 Cookie 只能在同一站点下使用,而不能在其他站点使用。

2.2.3 后端进行身份验证

在后端进行身份验证是防范跨站请求伪造攻击的一种有效方法。在发送请求时,后端进行身份验证,判断请求是否合法。如果请求不合法,则拒绝请求。

2.3 点击劫持攻击防范

2.3.1 使用 X-Frame-Options

X-Frame-Options 是一种 HTTP 响应头,可以告诉浏览器是否允许在 iframe 中加载网页。通过设置该响应头,可以禁止页面被嵌套在其他网站的 iframe 中,从而防止点击劫持攻击。

2.3.2 使用 CSP

Content-Security-Policy(CSP)是一种 HTTP 响应头,可以控制网页加载内容的源。通过设置该响应头,可以限制页面上资源的加载,从而防止恶意脚本的注入,从而防止点击劫持攻击。

2.4 客户端数据篡改防范

2.4.1 对表单数据进行校验

在前端对表单数据进行校验可以有效地防止客户端数据篡改攻击。可以使用一些常见的校验库,如 Vuelidate 或 Yup。

2.4.2 使用 Immutable.js

Immutable.js 是一种 JavaScript 库,可以使得对象和数组不可变。使用 Immutable.js 可以防止客户端数据被篡改,因为所有的操作都是基于原始的不可变数据。

2.5 客户端信息泄露防范

2.5.1 使用 HTTPS

使用 HTTPS 可以保证客户端和服务器之间的通信是加密的,从而防止敏感信息在传输过程中被窃听和篡改。因此,在使用 Vue 3 开发应用时,应该尽可能地使用 HTTPS。

2.5.2 避免在前端存储敏感信息

在前端存储敏感信息是不安全的,因为攻击者可以轻易地获取到这些信息。因此,应该避免在前端存储敏感信息。如果确实需要存储敏感信息,应该使用加密算法对这些信息进行加密,从而增加攻击者获取信息的难度。

三、Vue 3 中的安全最佳实践

3.1 在 Vue 3 中的安全最佳实践

3.1.1 在 Vue 3 项目中使用 HTTPS

在 Vue 3 项目中使用 HTTPS 可以保证数据传输的安全性。HTTPS 采用 SSL/TLS 加密协议,能够有效地防止中间人攻击和数据窃取。为了使用 HTTPS,你需要在你的 Web 服务器上安装 SSL/TLS 证书,例如 Let’s Encrypt 证书。

以下是一个使用 HTTPS 的 Vue 3 项目示例:

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'

const app = createApp(App)

if (process.env.NODE_ENV === 'production') {
  const secureCookie = true
  app.use(router)
    .use(createSecureCookieMiddleware(secureCookie))
    .mount('#app')
} else {
  app.use(router)
    .mount('#app')
}

在生产环境中,通过设置 secureCookie 为 true,我们可以确保 Cookie 只会在 HTTPS 连接中使用。

3.1.2 在 Vue 3 项目中防范跨站脚本攻击

跨站脚本攻击是指攻击者将恶意脚本注入到网页中,从而窃取用户的敏感信息。在 Vue 3 项目中,你可以采取以下措施来防范跨站脚本攻击:

  • 对用户输入的数据进行过滤和验证;
  • 在模板中使用 v-text 指令,而不是 {{}};
  • 在插值中使用 Vue 提供的过滤器,对输出的内容进行过滤。

以下是一个使用 v-text 指令和过滤器的示例:

<template>
  <div>
    <p v-text="$options.filters.filterHTML(content)"></p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      content: '<script>alert("Hello World!");</script>'
    }
  },
  filters: {
    filterHTML(value) {
      return value.replace(/(<([^>]+)>)/gi, '')
    }
  }
}
</script>

上述示例中,我们使用 v-text 指令来输出 content 的值,并使用 Vue 提供的 filterHTML 过滤器对输出的内容进行过滤,过滤掉所有的 HTML 标签和脚本。

3.1.3 在 Vue 3 项目中防范跨站请求伪造攻击

跨站请求伪造(CSRF)是一种攻击方式,攻击者利用受害者的身份来发送一些请求。为了防范 CSRF 攻击,我们可以在 Vue 3 项目中使用一些有效的防范措施。

3.1.3.1 使用 Cookie + Token 方式

使用 Cookie + Token 方式是一种有效的防范跨站请求伪造攻击的方法。在发送请求时,将 Token 作为请求的参数一同发送,后端进行验证。如果 Token 验证失败,则拒绝请求。

在 Vue 3 中,我们可以使用 Axios 库来发送请求,并通过设置 Axios 的拦截器来实现 Token 验证的功能。

首先,我们需要在后端生成一个 Token,并将 Token 保存在 Cookie 中。在发送请求时,将 Token 作为请求的参数一同发送。

import axios from 'axios'
import { getCookie } from './cookie'

// 设置 Token
const token = getCookie('token')

// 创建 Axios 实例
const instance = axios.create({
  baseURL: 'http://example.com/api',
  timeout: 5000
})

// 设置 Axios 拦截器
instance.interceptors.request.use(config => {
  config.params = {
    ...config.params,
    token // 将 Token 作为请求的参数一同发送
  }
  return config
})

// 发送请求
instance.get('/data')
  .then(res => {
    console.log(res)
  })
  .catch(err => {
    console.log(err)
  })

在后端接收请求时,验证 Token 是否合法。如果 Token 验证失败,则拒绝请求。

app.get('/data', (req, res) => {
  const token = req.query.token
  if (token === '123456') { // 验证 Token 是否合法
    res.send('data')
  } else {
    res.status(401).send('Unauthorized')
  }
})
3.1.3.2 使用 SameSite 属性

使用 SameSite 属性可以防止跨站请求伪造攻击。该属性可以在 Cookie 中设置,使得 Cookie 只能在同一站点下使用,而不能在其他站点使用。

在 Vue 3 中,我们可以通过设置 Axios 的拦截器来设置 SameSite 属性。

import axios from 'axios'
import { getCookie } from './cookie'

// 设置 SameSite 属性
const sameSite = 'strict'

// 创建 Axios 实例
const instance = axios.create({
  baseURL: 'http://example.com/api',
  timeout: 5000
})

// 设置 Axios 拦截器
instance.interceptors.request.use(config => {
  config.withCredentials = true // 开启跨域 Cookie
  config.headers.Cookie = `token=${getCookie('token')}; SameSite=${sameSite}` // 设置 SameSite 属性
  return config
})

// 发送请求
instance.get('/data')
  .then(res => {
    console.log(res)
  })
  .catch(err => {
    console.log(err)
  })

3.1.4 在 Vue 3 项目中防范点击劫持攻击

点击劫持(Clickjacking)是一种针对Web应用程序的安全漏洞,攻击者将一些恶意内容覆盖在一个透明或半透明的图层上,然后将用户引导到一个看似无害的网站或页面,当用户在该页面上单击时,实际上是单击了图层下的一个或多个按钮或链接,从而执行了攻击者想要的操作,比如捕获用户的个人信息、进行非法交易等。在 Vue 3 项目中,我们可以采取以下措施来防范点击劫持攻击:

1. 使用 X-Frame-Options 报头

X-Frame-Options 报头是一种HTTP响应报头,用于控制如何嵌入当前网页。它的值可以是以下三种之一:

  • DENY:表示不允许嵌入当前网页。
  • SAMEORIGIN:表示只允许与当前网页具有相同源的网页嵌入。
  • ALLOW-FROM uri:表示只允许指定的 URI 嵌入当前网页。

在 Vue 3 项目中,可以通过在服务器端设置 X-Frame-Options 报头来防范点击劫持攻击。例如,在 Node.js 服务器上,可以使用 Helmet 中间件来设置该报头:

const express = require('express');
const helmet = require('helmet');

const app = express();

app.use(helmet.frameguard({ action: 'deny' }));

上述代码将设置 X-Frame-Options 报头的值为 DENY,表示不允许嵌入当前网页。

2. 使用 frame-ancestors 报头

frame-ancestors 报头是一种Content Security Policy(CSP)指令,用于控制哪些网页可以嵌入当前网页。它的值可以是以下之一:

  • none:表示不允许任何网页嵌入当前网页。
  • self:表示只允许与当前网页具有相同源的网页嵌入。
  • uri:表示只允许指定的 URI 嵌入当前网页。
  • ‘self’ uri:表示既允许与当前网页具有相同源的网页嵌入,也允许指定的 URI 嵌入。

在 Vue 3 项目中,可以通过在服务器端设置 frame-ancestors 报头来防范点击劫持攻击。例如,在 Node.js 服务器上,可以使用 Helmet 中间件来设置该报头:

const express = require('express');
const helmet = require('helmet');

const app = express();

app.use(helmet.contentSecurityPolicy({
  directives: {
    'frame-ancestors': ["'none'"]
  }
}));

上述代码将设置 frame-ancestors 报头的值为 none,表示不允许任何网页嵌入当前网页。

3.1.5 在 Vue 3 项目中防范客户端数据篡改和信息泄露

1. 对表单数据进行校验

在前端页面中,经常会有表单提交的情况。对于表单数据,需要对其进行校验,确保数据的正确性和合法性。Vue 3 中可以使用第三方库来实现表单校验,例如 VeeValidate、ElementUI 等。同时,Vue 3 自带了表单验证指令 v-model 和表单校验函数,也可以用来实现表单校验。

下面是一个使用 VeeValidate 实现表单校验的示例代码:

htmlCopy code
<template>
  <div>
    <form @submit.prevent="submitForm">
      <div>
        <label>用户名:</label>
        <input type="text" v-model="form.username" />
        <span>{{ errors.first('username') }}</span>
      </div>
      <div>
        <label>密码:</label>
        <input type="password" v-model="form.password" />
        <span>{{ errors.first('password') }}</span>
      </div>
      <button type="submit">提交</button>
    </form>
  </div>
</template>

<script>
  import { defineComponent } from 'vue';
  import { useForm, ErrorMessage } from '@vee-validate/vue3';

  export default defineComponent({
    setup() {
      const { handleSubmit, formState, errors } = useForm({
        initialValues: {
          username: '',
          password: '',
        },
        validationSchema: {
          username: 'required|min:3|max:20',
          password: 'required|min:6|max:20',
        },
        onSubmit(values) {
          console.log(values);
        },
      });

      const submitForm = handleSubmit(() => {
        // 表单提交逻辑
      });

      return {
        form: formState,
        errors,
        submitForm,
      };
    },
  });
</script>

在上面的代码中,我们通过引入 VeeValidate 库来实现表单校验。通过 useForm 函数来创建表单对象,定义了表单的初始值和校验规则,并在提交时执行 onSubmit 函数。在模板中,我们通过 v-model 来绑定表单数据,使用 errors.first 来获取表单校验的错误信息。2. 使用 Immutable.js

Vue 3 中使用 Immutable.js 可以有效地防范客户端数据篡改。Immutable.js 是一个实现了不可变数据结构的 JavaScript 库,可以确保数据不会被意外修改,从而防止客户端数据篡改的风险。

2. 下面是一个使用 Immutable.js 实现不可变数据的示例代码:
<template>
  <div>
    <div>原始数据:{{ data }}</div>
    <div>不可变数据:{{ immutableData }}</div>
  </div>
</template>

<script>
  import { defineComponent } from 'vue';
  import Immutable from 'immutable';

  export default defineComponent({
    setup() {
      const data = {
        name: 'Jack',
        age: 25,
hobby: ['reading', 'music'],
};
 // 使用 Immutable.js 将原始数据转化为不可变数据
  const immutableData = Immutable.fromJS(data);

  return {
    data,
    immutableData,
  };
},
});
</script>

在上述示例中,使用 Immutable.fromJS() 方法将原始数据转化为不可变数据,从而确保数据不会被意外修改。在使用不可变数据时,如果需要更新数据,则需要使用 Immutable.js 提供的 API 来进行操作,例如 set()、push() 等方法。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/474244.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅谈Golang等多种语言转数组成字符串

目录 Python 一维列表转字符串 二维列表转字符串 多维列表转字符串 Golang 一维数组的遍历打印 二维数组的遍历打印 Java 一维容器的直接打印 二维容器的直接打印 普通数组的转化 C 一维容器的遍历 1. to_string() 2. stringstream 二维容器的遍历 简要小结 …

【Python--高级教程】

高级教程 1.正则表达式re.compile()re.match()函数re.search()函数re.search()函数与re.match()函数的区别group(num) 或 groups()检索和替换re.sub()替换函数中的re.sub可以是一个函数findAll()方法re.finditer()方法re.split()regex修饰符正则表达式模式 2.CGI编程什么是CGI网…

Top-K问题

Top-K简介 &#x1f604;Top-k算法常用于对诸如前几名&#xff0c;前几个最大值&#xff0c;前几个最小值这样的问题的求解&#xff0c;并且在数据量较大时力求在最短的时间内求出问题的解。例如&#xff1a; 世界500强公司&#xff0c;世界上年龄最大的几个人&#xff0c;某知…

3.7 Linux shell脚本编程(分支语句、循环语句)

目录 分支语句&#xff08;对标C语言中的if&#xff09; 多路分支语句&#xff08;对标C语言中的swich case&#xff09; 分支语句&#xff08;对标C语言中的if&#xff09; 语法结构: if 表达式 then 命令表 fi 如果表达式为真, 则执行命令表中的命令; 否则退出if语句,…

数据湖Data Lakehouse支持行级更改的策略:COW、MOR、Delete+Insert

COW:写时复制,MOR:读时合并,Delete+Insert:保证同一个主键下仅存在一条记录,将更新操作转换为Delete操作和Insert操作 COW和MOR的对比如下图,而Delete+Insert在StarRocks主键模型中用到。 目前COW、MOR在三大开源数据湖项目的使用情况,如下图。 写入时复制【Copy-On…

浙大的SAMTrack,自动分割和跟踪视频中的任何内容

Meta发布的SAM之后&#xff0c;Meta的Segment Anything模型(可以分割任何对象)体验过感觉很棒&#xff0c;既然能够在图片上面使用&#xff0c;那肯定能够在视频中应用&#xff0c;毕竟视频就是一帧一帧的图片的组合。 果不其然浙江大学就发布了这个SAMTrack&#xff0c;就是在…

编译预处理以及相关面试

编译预处理 1、宏定义1.1、 无参宏定义1.2、使用宏定义的优点1.3、宏定义注意点1.4、带参数的宏(重点)1.5、条件编译1.6、宏定义的一些巧妙用法(有用)1.7、结构体占用字节数的计算原则&#xff08;考题经常考&#xff0c;要会画图&#xff09;1.8、#在宏定义中的作用&#xff0…

[Android Studio Tool]如何将AS的gradle文件迁移到D盘

解决学习安卓的过程中&#xff0c;使用Android Studio来进行开发导致的C盘空间占用的问题。 首先&#xff0c;找到C盘中的.gradle文件的位置 一般会在我们的系统盘的用户文件下。 然后把一整个.gradle文件剪切&#xff0c;粘贴到其它盘(比如D盘)的根目录下 打开Androdi Stu…

QT菜单样式Ribbon Control for Qt, Office ribbon control

基于Qt&#xff08;最低要求Qt5&#xff0c;支持C11的编译器&#xff09;开发的一个轻量级的Ribbon控件(Office样式UI) 使用Qt Creator直接打开SARibbon.pro&#xff0c;并编译即可&#xff0c;会编译出SARibbonBar库和一个&#xff08;目前只有一个例子&#xff09;例子&#…

7.0、Java继承与多态 - 多态的特性

7.0、Java继承与多态 - 多态的特性 面向对象的三大特征&#xff1a;封装性、继承性、多态性&#xff1b; extends继承 或者 implements实现&#xff0c;是多态性的前提&#xff1b; 用学生类创建一个对象 - 小明&#xff0c;他是一个 学生&#xff08;学生形态&#xff09;&…

nginx(七十二)nginx中与cookie相关的细节探讨

背景知识铺垫 一 nginx中与cookie相关 ① Cookie请求头内容回顾 cookie的形式和属性 ② nginx获取cookie值的两种方法 1) $http_cookie -->获取Cookie请求头"所有值"2) $COOKIE_flag -->获取Cookie请求头的"某个key"[1]、脱敏场景在日志中只…

【操作系统复习】第6章 虚拟存储器 1

前面所介绍的各种存储器管理方式&#xff0c;有一个共同特点&#xff1a;作业全部装入内存后方能运行 问题&#xff1a; ➢ 大作业装不下 ➢ 少量作业得以运行 解决办法&#xff1a; ➢ 方法一&#xff1a;从物理上增加内存容量&#xff0c;成本高 ➢ 方法二&#xff1a;…

Android Input系统事件分发分析

“本文基于Android13源码&#xff0c;分析Input系统中&#xff0c;事件分发的实现原理“ 整个事件分发到事件的确认过程很长&#xff0c;如果读者只是想大概了解一下&#xff0c;可以直接看末尾总结部分的流程图。 1. 前言 在文章之前&#xff0c;有必要提一下InputReader。其…

创建NAT模式KVM虚拟机

创建NAT模式KVM虚拟机 1 添加脚本执行权限&#xff08;上传脚本文件至root目录&#xff09;。 首先需要给脚本赋予执行权限。 # chmod x qemu-ifup-NAT 2 启动虚拟机。 通过命令启动虚拟机。(记得安装net-tools) # yum install net-tools -y # qemu-kvm -m 1024 -drive fi…

注解-Annotation

一. 注解解析 1.1 注释和注解的区别&#xff1f;&#xff08;掌握&#xff09; 共同点&#xff1a;都可以对程序进行解释说明。不同点&#xff1a;注释&#xff0c;是给程序员看的。只在Java中有效。在class文件中不存在注释的。当编译之后&#xff0c;会进行注释擦除。 注释…

了解标量、向量和点积

数据科学基础数学&#xff1a;线性代数简介 了解标量、向量和点积 机器只能按着算法理解和处理数据结构存储的数字. 例如创建垃圾邮件检测器&#xff0c;则首先必须将文本数据转换为数字(通过单词嵌入)。 两个句子之间的余弦相似性 两个句子之间的余弦相似性可以通过它们的向量…

【软件相关】Proteus仿真STM32记录

文章目录 0 前期教程1 前言2 先说说建议的流程3 需要注意的事项3.1 供电网配置不要忘了3.2 ADC模块的使用3.3 元器件查询手册 4 一些小技巧 0 前期教程 【软件相关】Proteus 8入门教程 1 前言 最近接了一个项目&#xff0c;是基于Proteus仿真STM32的&#xff0c;虽然此前有听…

软件开发过程中,前期准备的重要性

需求人员&#xff0c;有时候&#xff0c;一开始&#xff0c;并不完全确定自己想要的是什么 因此&#xff0c;值得花费时间&#xff0c;找出他们真正想要的东西 因为&#xff0c;改动的代价&#xff0c;可能代价会是巨大的 构建之前清除一个错误的成本 ( 1 10 ∼ 1 100 ) 开发过…

Mysql 触发器 -> 监控 -> 表 修改前后的 数据 -> 日志

0. 课程视频 https://www.bilibili.com/video/BV1Kr4y1i7ru?p116&spm_id_frompageDriver&vd_sourceff8b7f852278821525f11666b36f180a 1. 简介 1.1 是对象->与表有关 1.2 校验数据完整性 -> 日志记录 1.3 在 insert / update /delete 前后触发 1.4 支持行…

权限提升:Mysql 数据库 .(UDF || 启动项 || 反弹)

权限提升&#xff1a;Mysql 数据库. 权限提升简称提权&#xff0c;由于操作系统都是多用户操作系统&#xff0c;用户之间都有权限控制&#xff0c;比如通过 Web 漏洞拿到的是 Web 进程的权限&#xff0c;往往 Web 服务都是以一个权限很低的账号启动的&#xff0c;因此通过 Web…