当前位置: 首页 > news >正文

【论文阅读】Tabbed Out: Subverting the Android Custom Tab Security Model

论文链接:Tabbed Out: Subverting the Android Custom Tab Security Model | IEEE Conference Publication | IEEE Xplore

总览

“Tabbed Out: Subverting the Android Custom Tab Security Model” 由 Philipp Beer 等人撰写,发表于 2024 年 IEEE Symposium on Security and Privacy。论文对 Android 的 Custom Tab(CT)组件进行了首次系统安全评估,揭示了其安全模型在设计时未考虑的跨上下文状态推断攻击等问题,并提出了缓解策略。通过与Google的合作,这些漏洞已经得到了修复,但该研究仍然对移动Web桥接技术的安全性具有重要意义,为未来的研究提供了有价值的参考。

研究背景

移动到 Web 的桥梁组件

移动操作系统为开发者提供了多种在原生应用中显示网页的方式。其中,Custom Tab(CT)组件是一种较新的方式,它与底层浏览器共享状态,并能让宿主应用了解网页导航情况。

CT 组件的特性

  • 状态共享:与 WebView 等组件不同,CTs 与底层浏览器(如 Chrome、Edge、Brave 和 Firefox 等)共享状态,包括 cookies 和权限。这意味着用户在浏览器中登录网站后,在 CT 中也会被自动认证。

  • 导航回调:CTs 支持多种类型的回调,如导航回调(在网页导航事件中触发)和特定于浏览器实现的额外回调。开发者可以通过重写 CustomTabsCallback 类在宿主应用中接收和利用这些事件。

  • UI 定制和其他特性:CTs 允许开发者定制浏览器活动的样式,包括修改 URL 栏的颜色、应用进出动画以及在浏览器导航栏中添加自定义操作。此外,CTs 还提供了一些性能优化,如预初始化浏览器和预加载可能访问的网页。

CT 的使用情况

  • 数据集:从 AndroZoo 获取应用列表,筛选出在 Google Play 商店中可用且安装量超过 1M 的应用,最终得到 50,831 个应用作为数据集。

  • 评估方法

    • CT 使用检测:使用 Androguard 静态分析框架,搜索特定字符串和函数的使用情况,以确定应用是否使用 CTs 以及使用的位置。

    • 库的特征分析:根据检测到的 CT 使用情况,对相关库进行分组和分析,通过查看文档、开源代码和示例应用来了解库如何使用 CTs。

  • 实验结果

    • CT 使用情况:在数据集中,83% 的应用(42,372 个 APKs)使用了 CTs。其中,55% 的应用可以识别到对 CT 支持库的 launchUrl 函数的调用,26% 的应用使用了回调。

    • CT 使用模式:CTs 主要用于两个目的:显示应用上下文之外的 Web 内容和与外部服务进行认证。不同的库使用 CTs 的方式有所不同,例如广告相关的库使用 CTs 跟踪广告交互,认证相关的库使用 CTs 进行用户认证。

研究动机

尽管 CT 组件提供了良好的用户体验,但它的安全模型可能存在漏洞。之前对 Android WebView 组件的研究已经揭示了许多安全风险,而 CT 组件作为一种类似但具有不同特性的组件,其安全性尚未得到充分研究。

攻击&防御

1. CT 活动隐藏攻击

概念:攻击者通过利用 CT 回调机制,将 CT 活动隐藏在后台,使其不被用户察觉。

原理:当 CT 被打开时,会触发 TAB_SHOWN 事件。攻击者让启动 CT 的活动监听此事件,并在收到事件后立即启动另一个活动,将 CT 活动覆盖。同时,通过重写覆盖活动的 onBackPressed 函数,防止用户通过返回按钮显示 CT。

具体步骤:

攻击者隐藏 CT 活动主要通过以下两种方式:

CT 活动隐藏(利用回调机制)

  • 步骤一:启动 CT 并监听事件

    • 攻击者让潜在有害应用(PUA)中的某个活动(如 Activity A)通过 launchUrl 方法启动 CT 并打开目标网站。

    • CT 在启动过程中会触发一系列事件,其中当 CT 变得可见时会触发 TAB_SHOWN 事件。Activity A 会监听此事件。

  • 步骤二:启动覆盖活动

    • 当 Activity A 接收到 TAB_SHOWN 事件后,立即启动另一个活动(如 Activity B)。此时,即使 Activity B 处于前台,未来的 CT 回调事件仍然会报告给 Activity A,从而在视觉上隐藏了 CT 活动。

  • 步骤三:处理活动栈相关操作

    • 当用户按下返回按钮或进行返回手势时,活动栈会按照打开的顺序进行操作。通常情况下,栈顶的活动会被移除,CT 会显示出来。为了防止这种情况,攻击者可以在覆盖活动(Activity B)中重写 onBackPressed 函数。通过这样做,当用户执行返回操作时,不是显示 CT,而是重新启动之前的 Activity A,从而保持 CT 的隐藏状态。

利用同活动覆盖(适用于特定场景)

  • 操作方法

    • 攻击者可以让启动 CT 的同一个活动(如 Activity A)覆盖 CT。例如在视频播放场景中,当用户在 Activity A 中观看视频时,启动 CT 后,Activity A 立即覆盖 CT,提供给用户不间断的视频体验。同时,在启动多个 CT 的情况下,可以按照顺序依次启动 CT,每个 CT 由前一个 CT 的 TAB_SHOWN 事件触发,最后在所有 CT 都打开后启动覆盖活动,实现多个 CT 的隐藏。

  • 注意事项

    • 在这种方式下,需要注意 UI 可能会在 CT 启动过程中出现短暂的无响应情况。例如在视频播放场景中,视频播放期间,UI 控件在 CT 启动时会有一小段时间无响应。

实验数据:在 Google Pixel 6a 运行 Android 13 和 Chrome 112 上进行测试,打开单个 CT 平均使 UI 无响应 0.2s,打开 10 个并行 CT 约 1.7s。

防御方法:可以通过检测应用是否存在异常的活动启动和切换行为来防范。同时,系统可以限制应用对活动栈的过度操作权限。

2. 网页内容隐藏攻击

概念:

攻击者利用 CT 的底部栏和一些特性,隐藏网页内容,改变导航栏信息,以达到隐蔽攻击的目的。

原理:尽管底部栏高度有限,但嵌入较大元素可隐藏内容,并创建与网站背景颜色相同的覆盖层。还可通过一些方法改变导航栏信息,如隐藏按钮、改变颜色等。

防御方法:可以限制底部栏的自定义程度,防止嵌入过大元素。同时,对导航栏的设置进行监控,防止异常的信息改变。

3. Cross-Context State Inference(跨上下文状态推断)

概念: 跨上下文状态推断攻击利用Custom Tab组件与底层浏览器共享状态(如cookies和权限)的特性,允许攻击者推断出用户的敏感信息。

原理: 当用户在浏览器中登录某个网站时,他们在Custom Tab中也会隐式地被认证。攻击者通过利用Custom Tab的回调机制(如导航事件回调),可以捕捉到用户与网站的交互信息,从而推断出用户的登录状态、浏览历史等敏感信息。

相关说明: 文章描述了实验方法和攻击效果。例如,通过测量资源加载时间,攻击者可以推断出用户在网站上的特定状态,如购物车中的商品数量。

  • 实验数据说明

    • 基于状态码的攻击:如 4xx/5xx 状态码且空响应体触发特定导航事件组合可用于推断。

    • 基于重定向的攻击:不同类型的重定向(HTML/JavaScript 或 HTTP)触发不同导航事件,可据此判断用户认证状态等。

    • 基于下载的攻击:在 Chrome、Edge 和 Brave 中,触发下载的资源在 CT 中会触发特定事件,用于推断用户状态。

    • 基于内容类型的攻击:某些媒体类型资源触发特定事件,可在特定条件下推断用户状态。

    • 基于时间的攻击:测量导航开始和结束事件的时间间隔,依据不同用户状态下资源加载时间差异来推断。

防御方法

  • 限制Custom Tab回调的使用,特别是在后台时禁用回调。

  • 扩展HTTP请求头中的指令列表,添加用于HTTP请求起源的webview关键字,以区分请求是否来自可信环境。

4. HTTP Header Injection(HTTP头注入)

概念: HTTP头注入攻击允许攻击者向由Custom Tab发起的请求中注入额外的HTTP头。

原理: 由于Custom Tab在处理HTTP请求时未能充分清理或验证HTTP头的值,攻击者可以构造恶意请求,注入自定义的HTTP头,从而绕过安全机制或执行未授权的操作。

防御方法

  • 对HTTP头的值进行严格的清理和验证,确保不包含恶意内容。

  • 更新Custom Tab组件以修复已知的安全漏洞。

5. SameSite Cookie Bypass(SameSite Cookie绕过攻击)

概念: SameSite Cookie绕过攻击允许攻击者绕过SameSite属性的限制,将cookie附加到跨站请求中。

原理: SameSite cookie属性用于限制cookie是否应附加到跨站请求中,以防止跨站攻击。然而,Custom Tab在处理SameSite Strict cookie时存在漏洞,允许攻击者绕过这一限制。

防御方法

  • 更新Custom Tab组件以严格遵守SameSite cookie标准。

  • 对于需要跨站请求的场景,使用其他安全机制(如CORS)来保护cookie。

6. Scroll Inference(滚动推断攻击)

概念: 滚动推断攻击允许攻击者通过监控用户在Custom Tab中的滚动行为来推断用户的敏感信息。

原理: Custom Tab提供了滚动事件的回调机制,攻击者可以利用这些回调来捕捉用户的滚动行为,并通过分析滚动数据来推断用户的浏览习惯、阅读速度等敏感信息。

防御方法

  • 限制或禁用Custom Tab中的滚动事件回调。

  • 使用隐私保护技术来模糊或隐藏用户的滚动行为。

7. Bottom Bar Info Leakage & Phishing(底部栏信息泄露和钓鱼)

概念: 底部栏信息泄露和钓鱼攻击允许攻击者利用Custom Tab中的底部栏来泄露用户信息或执行钓鱼攻击。

原理: Custom Tab中的底部栏可以显示来自Web内容的提示或信息。攻击者可以构造恶意的Web内容,利用底部栏来显示虚假信息或诱骗用户执行敏感操作。

相关说明: 文章指出,攻击者可以利用底部栏来显示虚假的登录提示或支付信息,从而诱骗用户输入敏感信息。

防御方法

  • 对Custom Tab中的底部栏内容进行严格的验证和过滤。

  • 提高用户对钓鱼攻击的认识和警惕性。

缓解策略

  • 跨攻击缓解

    • CT 嵌入策略:网站运营商可以通过扩展 CSP 和 Fetch Metadata 头部,实现选择退出 CT 加载的机制,防止跨上下文泄漏和钓鱼攻击。

    • 限制状态共享:建议默认在私有浏览上下文中打开网站,或者通过扩展 CT API,在用户明确批准的情况下允许状态共享。在存在信任关系(如通过 Digital Asset Links)时,可以绕过批准对话框。

  • 特定攻击缓解

    • 限制导航回调:可以通过减少共享信息的粒度(如将所有完成的导航事件分组为一个)或仅在存在 Digital Asset Link 时允许回调,来缓解跨上下文信息泄漏。

    • 限制背景回调:限制对后台 CT 的回调,因为 CTs 主要用于显示用户交互的内容,隐藏的 CT 接收回调可能是恶意的。

    • 限制滚动回调和额外命令:禁止第三方应用接收滚动事件,可以防止滚动推断攻击。可以通过在存在 DAL 时才启用此功能来保持兼容性。

    • 限制底部栏高度:防止底部栏覆盖页面内容,从而使滚动推断攻击不再隐蔽。

    • 底部栏意图中的 URL 净化:在底部栏点击时发送给应用的 Intent 中删除 URL,可以防止底部栏欺骗攻击。同时,可以对 URL 进行净化,只保留来源信息,以保持一定的兼容性。

    • 省略 SameSite Strict Cookies:在 CT 中加载网站时,不应发送 SameSite Strict Cookies,因为这是跨上下文请求,类似于在浏览器弹出窗口中加载网站。

    • 净化 HTTP 头部值:通过拒绝包含换行符的畸形 CORS - approvelisted HTTP 头部,可以修复头部注入攻击。

案例研究

  • 性偏好检测:针对 FetLife 社交网络,攻击者可以利用跨上下文状态推断攻击中的时间向量,通过在 CT 和隐藏的 WebView 中同时打开登录页面,并比较加载时间,来确定用户是否在该网站上有活跃会话,从而推断用户是否属于特定社区。

  • ProtonMail 登录检测:攻击者可以利用跨上下文状态推断攻击中的重定向向量,针对 ProtonMail 电子邮件服务,通过在 CT 中打开登录页面,根据收到的 NAVIGATION_FAILED 事件数量来判断用户是否已登录。

  • 位置历史泄漏:针对 Google Maps Timeline 服务,攻击者可以通过在 URL 中编码目标日期和位置,并利用 CT 浏览器的滚动功能,结合滚动推断攻击,泄漏用户在特定日期是否访问过特定地点的信息。

  • 社交账号匿名化:攻击者可以利用 CT 底部栏和一些社交网络的自动重定向端点,通过在 CT 中加载特定端点,并隐藏视图端口,诱使用户点击底部栏,从而获取用户的社交账号用户名。

  • Instagram 钓鱼攻击:攻击者可以利用 CT 底部栏,在 Instagram 上显示一个包含虚假消息的帖子,诱使用户点击底部栏,然后提示用户输入当前密码和新密码,从而窃取用户的凭据。

Q&A

文章分析Custom Tabs使用情况方法的局限性

1. 代码混淆问题可能产生假阴性

  • 类和方法重命名

    • 开发者可能会在构建过程中对类和方法进行重命名,这会导致静态分析框架难以识别 CT API 的正确使用情况。例如,原本用于启动 CT 的 launchUrl 函数可能被重命名为其他名称,使得分析工具无法准确检测到应用是否使用了该函数来启动 CT。

  • 字符串混淆

    • 字符串也可能被混淆,这对于检测 CT 使用的关键字符串(如 android.support.customtabs.extra.SESSION)造成困难。如果该字符串被加密或替换为其他难以识别的形式,静态分析工具可能无法找到它,从而错误地判断应用没有使用 CT 组件。

2. 死代码问题可能产生假阳性

  • 应用可能包含一些在实际运行中从未被使用的代码片段。如果这些代码片段中包含 CT API 的使用,静态分析方法会将应用标记为使用 CT 组件,但实际上这些代码在应用运行过程中并不会执行相关的 CT 操作。这种情况会导致分析结果出现假阳性,即错误地认为应用使用了 CT 组件,而实际上并没有真正的 CT 相关功能被调用。

论文中如何评估 CT 隐藏工具的性能?

论文通过测量用户界面(UI)的响应时间来评估 CT 隐藏工具的性能,具体如下:

CT 活动隐藏工具

  • 实验设置

    • 在 Google Pixel 6a 运行 Android 13 和 Chrome 112 的设备上进行测试。

    • 通过多次重复实验来获取较为准确的数据。

  • 评估指标

    • 测量从攻击开始(即启动 CT 隐藏操作)到 UI 再次响应所花费的时间。

  • 实验结果

    • 打开单个 CT 时,平均使 UI 无响应的时间约为 0.2 秒。

    • 当同时打开 10 个并行 CT 时,UI 无响应的时间约为 1.7 秒。

网页内容隐藏工具

  • 相关说明

    • 论文中未提及针对网页内容隐藏工具通过类似 UI 响应时间的方式给出具体性能评估数据,但强调了其在隐藏网页内容方面的有效性及相关原理,如利用底部栏嵌入元素隐藏内容以及改变导航栏信息等操作对攻击隐蔽性的影响。

相关文章:

【论文阅读】Tabbed Out: Subverting the Android Custom Tab Security Model

论文链接:Tabbed Out: Subverting the Android Custom Tab Security Model | IEEE Conference Publication | IEEE Xplore 总览 “Tabbed Out: Subverting the Android Custom Tab Security Model” 由 Philipp Beer 等人撰写,发表于 2024 年 IEEE Symp…...

2025 - AI人工智能药物设计 - 中药网络药理学和毒理学的研究

中药网络药理学和毒理学的研究 TCMSP:https://old.tcmsp-e.com/tcmsp.php 然后去pubchem选择:输入Molecule Name 然后进行匹配:得到了smiles 再次通过smiles:COC1C(CC(C2C1OC(CC2O)C3CCCCC3)O)O 然后再次输入:http…...

iwebsec靶场 XSS漏洞通关笔记

目录 前言 1.反射性XSS 2.存储型XSS 3.DOM型XSS 第01关 反射型XSS漏洞 1.打开靶场 2.源码分析 3.渗透 第02关 存储型XSS漏洞 1.打开靶场 2.源码分析 4.渗透 方法1: 方法2 方法3 第03关 DOM XSS漏洞 1.打开靶场 2.源码分析 3.渗透分析 3.渗透过程…...

设计模式-单例模型(单件模式、Singleton)

单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。 单例模式同时解决了两个问题, 所以违反了单一职责原则: 保证一个类只有一个实例。 为什么会有人想要控制一个类所拥有的实例…...

笔记本双系统win10+Ubuntu 20.04 无法调节亮度亲测解决

sudo add-apt-repository ppa:apandada1/brightness-controller sudo apt-get update sudo apt-get install brightness-controller-simple 安装好后找到一个太阳的图标,就是这个软件,打开后调整brightness,就可以调整亮度,可…...

零基础Java第十一期:类和对象(二)

目录 一、对象的构造及初始化 1.1. 就地初始化 1.2. 默认初始化 1.3. 构造方法 二、封装 2.1. 封装的概念 2.2. 访问限定符 2.3. 封装扩展之包 三、static成员 3.1. 再谈学生类 3.2. static修饰成员变量 一、对象的构造及初始化 1.1. 就地初始化 在声明成员变…...

NumPy包(下) python笔记扩展

9.迭代数组 nditer 是 NumPy 中的一个强大的迭代器对象,用于高效地遍历多维数组。nditer 提供了多种选项和控制参数,使得数组的迭代更加灵活和高效。 控制参数 nditer 提供了多种控制参数,用于控制迭代的行为。 1.order 参数 order 参数…...

极狐GitLab 17.5 发布 20+ 与 DevSecOps 相关的功能【一】

GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…...

Oracle 第1章:Oracle数据库概述

在讨论Oracle数据库的入门与管理时,我们可以从以下几个方面来展开第一章的内容:“Oracle数据库概述”,包括数据库的历史与发展,Oracle数据库的特点与优势。 数据库的历史与发展 数据库技术的发展可以追溯到上世纪50年代&#xf…...

7、Nodes.js包管理工具

四、包管理工具 4.1 npm(Node Package Manager) Node.js官方内置的包管理工具。 命令行下打以下命令: npm -v如果返回版本号,则说明npm可以正常使用 4.1.1npm初始化 #在包所在目录下执行以下命令 npm init #正常初始化,手动…...

网络地址转换——NAT技术详解

网络地址转换——NAT技术详解 一、引言 随着互联网的飞速发展,IP地址资源日益紧张。为了解决IP地址资源短缺的问题,NAT(Network Address Translation,网络地址转换)技术应运而生。NAT技术允许一个私有IP地址的网络通…...

问:数据库存储过程优化实践~

存储过程优化是提高数据库性能的关键环节。通过精炼SQL语句、合理利用数据库特性、优化事务管理和错误处理,可以显著提升存储过程的执行效率和稳定性。以下是对存储过程优化实践点的阐述,结合具体示例,帮助大家更好地理解和实施这些优化策略。…...

C++ vector的使用(一)

vector vector类似于数组 遍历 这里的遍历跟string那里的遍历是一样的 1.auto&#xff08;范围for&#xff09; 2.迭代器遍历 3.operator void vector_test1() {vector<int> v;vector<int> v1(10, 1);//初始化10个都是1的变量vector<int> v3(v1.begin(), --…...

深入浅出:ProcessPoolExecutor 处理异步生成器函数

深入浅出&#xff1a;ProcessPoolExecutor 处理异步生成器函数 什么是 ProcessPoolExecutor&#xff1f;为什么要使用 ProcessPoolExecutor 处理异步生成器函数&#xff1f;ProcessPoolExecutor 处理异步生成器函数的基本用法1. 导入模块2. 定义异步生成器函数3. 定义处理函数4…...

elementUI表达自定义校验,校验在v-for中

注意&#xff1a;本帖为公开技术贴&#xff0c;不得用做任何商业用途 <el-form :inline"true" :rules"rules" :model"formData" ref"formRef" class"mt-[20px]"><el-form-item label"选择区域" prop&qu…...

Elasticsearch 在linux部署 及 Docker 集群部署详解案例示范

1. 在 CentOS 上安装和配置 Elasticsearch 在 CentOS 系统下&#xff0c;安装 Elasticsearch 主要分为以下步骤&#xff1a; 1.1 准备工作 在开始安装之前&#xff0c;确保你的系统满足以下基本条件&#xff1a; CentOS 版本要求&#xff1a;推荐使用 CentOS 7 及以上版本。…...

短信验证码发送实现(详细教程)

短信验证码 接口防刷强检验以及缓存验证码阿里云短信服务操作步骤验证码发送实现 好久没发文啦&#xff01;最近也是在工作中遇到我自认为需要记录笔记的需求&#xff0c;本人只求日后回顾有迹可寻&#xff0c;不喜勿喷&#xff01; 废话不多说&#xff0c;直接上代码&#xff…...

P450催化的联芳基偶联反应-文献精读72

Chemoenzymatic Synthesis of Fluorinated Mycocyclosin Enabled by the Engineered Cytochrome P450-Catalyzed Biaryl Coupling Reaction 经工程化的细胞色素P450催化的联芳基偶联反应实现氟代麦环素的化学酶促合成 摘要 将氟原子引入天然产物有望生成具有改良或新颖药理特…...

在不支持AVX的linux上使用PaddleOCR

背景 公司的虚拟机CPU居然不支持avx, 默认的paddlepaddle的cpu版本又需要有支持avx才行,还想用PaddleOCR有啥办法呢? 是否支持avx lscpu | grep avx 支持avx的话,会显示相关信息 如果不支持的话,python运行时导入paddle会报错 怎么办呢 方案一 找公司it,看看虚拟机为什么…...

Python数据分析——Numpy

纯个人python的一个小回忆笔记&#xff0c;当时假期花两天学的python&#xff0c;确实时隔几个月快忘光了&#xff0c;为了应付作业才回忆起来&#xff0c;不涉及太多基础&#xff0c;适用于有一定编程基础的参考回忆。 这一篇笔记来源于下面哔哩哔哩up主的视频&#xff1a; 一…...

JMeter快速入门示例

JMeter是一款开源的性能测试工具&#xff0c;常用于对Web服务和接口进行性能测试。 下载安装 官方下载网址&#xff1a; https://jmeter.apache.org/download_jmeter.cgi也可以到如下地址下载&#xff1a;https://download.csdn.net/download/oscar999/89910834 这里下载Wi…...

【333基于Java Web的考编论坛网站的设计与实现

毕 业 设 计&#xff08;论 文&#xff09; 考编论坛网站设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计…...

计算机网络关键名词中英对照

物理层 IMP - Interface Message Processor - 接口信息处理机 MODEM - Modulator-Demodulator - 调制解调器 LAN - Local Area Network - 局域网 FDM - Frequency Division Multiplexing - 频分复用 TDM - Time Division Multiplexing - 时分复用 STDM - Statistical Time…...

二叉树的学习

除了根节点外的其他节点只有一个直接前驱,有多个直接前驱的逻辑结构叫做图 任何一个树都可以看成是一个根节点和若干个不相交的子树构成的; 构建思维导图时使用树形结构 题目中给出AB是堂兄弟节点说明他们处在同一层 描述两节点之间的路径是从上到下的,同层没有路径,一条边记录…...

免费开源的医疗信息提取系统:提升超声波影像的诊断价值

一、系统概述 思通数科推出的医疗信息精准抽取系统&#xff0c;致力于解决当前医疗行业面临的信息碎片化和数据管理难题。传统医疗过程中&#xff0c;超声波影像数据与诊断报告之间的脱节&#xff0c;往往导致信息无法有效整合&#xff0c;影响医生的诊断效率与准确性。我们的…...

Bash 中的 ${} 和 $() 有什么区别 ?

Bash (Bourne-Again SHell) 是一种流行的 Unix SHell&#xff0c;用于编写脚本。如果您使用 Bash 脚本&#xff0c;那么了解不同的语法元素对于提高脚本的效率和避免错误是很重要的。 在本文中&#xff0c;我们将解释 Bash 中 ${} 和 $() 语法之间的区别&#xff0c;并向您展示…...

SPSS、R语言因子分析FA、主成分分析PCA对居民消费结构数据可视化分析

全文链接&#xff1a;https://tecdat.cn/?p37952 分析师&#xff1a;Ting Mei 在经济发展的大背景下&#xff0c;居民消费结构至关重要。本文围绕居民消费结构展开深入研究&#xff0c;运用 SPSS25.0 和 R 语言&#xff0c;以因子分析法和主成分分析法对东北三省居民消费价格指…...

高级SQL技巧掌握

高级SQL技巧掌握 在数据驱动的时代,掌握SQL不仅仅是为了解决具体问题,它更像是一把钥匙,帮助你打开数据分析的大门。你准备好提升你的SQL技能了吗?在这篇文章中,我们将一起探索十个必备的高级SQL查询技巧,这些技巧将帮助你更有效率地进行数据处理与分析。 1. 常见表表达…...

数组实例之三子棋的实现(C语言)

目录 前言 一、三子棋实现的逻辑 二、三子棋的实现 2.1文件的创建添加 2.2 test文件基本逻辑 2.2.1菜单的实现 2.2.2菜单的选择 2.2.3game函数棋盘的实现 2.3game.c文件的编写 2.3.1初始化函数的模块 2.3.2棋盘打印的模块 2.3.3实现棋盘界面的打印 2.3.4实现玩家下…...

【Linux驱动开发】设备树节点驱动开发入门

【Linux驱动开发】设备树节点驱动开发入门 文章目录 设备树文件设备树文件驱动开发附录&#xff1a;嵌入式Linux驱动开发基本步骤开发环境驱动文件编译驱动安装驱动自动创建设备节点文件 驱动开发驱动设备号地址映射&#xff0c;虚拟内存和硬件内存地址字符驱动旧字符驱动新字…...

wordpress真伪查询主题/微博营销策略

当MySQL单表的数据库过大时&#xff0c;数据库的访问速度会下降&#xff0c;“数据量大”问题的常见解决方案是“水平切分”。MySQL常见的水平切分方式有哪些&#xff1f;回答&#xff1a;分库分表&#xff0c;分区表什么是MySQL的分库分表&#xff1f;回答&#xff1a;把一个很…...

郑州市重点项目建设办公室网站/软文网站推广法

NBearLite是NBearV4的几个核心组件之一&#xff0c;也是目前NBearV3中ORM部分的查询语法的核心。NBearLite本身并不是一个完整的ORM解决方案&#xff0c;配合目前Teddy正常开发的NBearMapping组件使用&#xff08;某个中间组件过渡&#xff09;&#xff0c;组成一套完整强大的O…...

有平面广告设计的网站/sem优化

稍等跟新...

世安建设集团有限公司网站/自助建站系统代理

分享的越多&#xff0c;裸的越多渠道和内容包袱太重&#xff0c;思想禁&#xff0c;年纪太大...

团队网站模板/盐城seo排名

从MySQL binlog得到你要的SQL。根据不同设置&#xff0c;你可以得到原始SQL、回滚SQL、去除主键的INSERT SQL等。 用途 数据回滚 主从切换后数据不一致的修复 从binlog生成标准SQL&#xff0c;带来的衍生功能 安装 $ git clone https://github.com/danfengcao/binlog2sql.git …...

网站开发会议议程范文/营销传播服务

设计稿尽量提供偶数切图之前预先定义好标准(常用标签的样式,公用样式)上下文元素之间尽量保持同级更新不频繁的使用背景图片(logo)先做需求确定部分内容(头/尾部)设置颜色尽量不使用英文,使用色码时多用3位,少用6位转载于:https://blog.51cto.com/suyanzhu/1878191...