【太原理工大学】软件系统安全—分析题
OK了,又是毫无准备的一场仗,我真是ありがとうございます 凸^o^凸
根据前几年传下来的信息,所谓“分析”,就是让你根据情节自行设计,例如如何设计表单等,这类多从实验中出,王老师强调好好做实验一定有他的道理。
实验一:漏洞分析实验
对于实验一我其实想不出来他会怎么考,索性就把实验顺一遍。但是百分之八十不会考这么细,时间紧张的同学可以把一跳了(反正看了也一知半解的,我也研究不透),直接看后面吧 (。ì _ í。)
解释什么是栈溢出漏洞以及它如何被利用:
栈溢出漏洞是一种常见的软件安全漏洞,主要发生在使用C或C++等语言编写的程序中。这种漏洞是由于程序在处理输入数据时,没有正确地检查数据的长度,导致输入数据超出了预定的栈空间,覆盖了栈上的其他重要数据。
在实验报告中提到的例3-6中,如果程序没有正确处理输入数据,攻击者可以构造一个很长的字符串作为输入,这个字符串的长度超出了程序为其分配的缓冲区大小。当这个长字符串被复制到栈上的局部变量时,就会发生栈溢出。如果攻击者控制了溢出数据的内容,就可以覆盖栈上的返回地址,使得程序执行攻击者指定的代码。
函数栈结构分析:
例如本图带给我们的信息:
0018XXXX:0018开头的内存地址是Win7系统栈空间在VC6下的特征;
0xCCCCCCCC:函数局部变量初始化为一片0xCCCCCCCC,符合debug版的特性,这是编译环境为我们调试程序赋予的便利。有4片0xCCCCCCCC(如图),说明有4个函数。
栈底:18FF88、18FF48、18FED4、18FE74,貌似一串连续的栈底(如图),形成4个栈结构,且存在函数的嵌套调用,因为四个栈堆起来,如果不是嵌套调用,一个函数执行完毕,栈空间会释放掉,调用下一个函数时,栈还在原来的位置,就不会堆起来。
解释:栈帧是函数调用时在栈上分配的一块内存区域,包含了局部变量、参数、返回地址等信息。每个函数调用都会在栈上创建一个新的栈帧。根据提供的内存地址(例如18FF88
、18FF48
、18FED4
、18FE74
),我们可以看到这些地址是连续的,这表明它们可能是同一个栈的不同部分。如果存在多个连续的栈帧,这通常意味着有函数的嵌套调用。当一个函数调用另一个函数时,新的栈帧会在当前栈帧的顶部创建。
接下来,我们来看函数调用过程:
1.参数入栈
2.返回地址入栈
3.保存栈底
4.变量入栈
5.保存CPU环境
main函数:
1.参数入栈--------------------------------------01 00 00 00 B8 0F 2D 00 50 10 2D 00
2.返回地址入栈--------------------------------------B9 12 40 00
3.保存栈底--------------------------------------88 FF 18 00
4.变量入栈--------------------------------------42 CC CC CC --0A 00 00 00
5.保存CPU环境(/Zi 稳定保存12字节)-----00 00 00 00 00 00 00 00 00 E0 FD 7E
1.三个参数说明是main函数,命令行个数是1个,命令行字符指针数组和环境变量字符指针数组的首地址分别为0x002D0FB8和0x2D1050;
2.main函数返回地址是0x004012B9;
3.调用方栈底是0x0018FF88;
4.变量看形式有5个,1个int型0A 00 00 00(值为10),1个char型字符串68 65 6C 6C 00(内容为“hell”,00为字符串结束字符‘\0’),1个double型33 33 33 33 33 33 2F 40(值为15.6),1个float型00 00 28 41(值为10.5),1个char型0x42(值为‘B’);
5.当前CPU三个寄存器的值分别为0x7EFDE000、0x00000000、0x00000000。
从main函数自下至上,三个函数暂时称作fun1、fun2、fun3(先声明,再使用)。
fun 1函数:
fun 1被main调用
1.参数入栈--------------------------------------2C FF 18 00
2.返回地址入栈--------------------------------------02 11 40 00
3.保存栈底--------------------------------------48 FF 18 00
4.变量入栈--------------------------------------CD CC 5C 41 0A 00 00 00
5.保存CPU环境(/Zi 稳定保存12字节)------48 FF 18 00 00 00 00 00 00 E0 FD 7E
1.参数是0x0018FF2C,是指向main函数char型变量的地址,由此可以推断main函数的5个变量有可能是一个结构体的5个成员,否则,仅仅传地址要么造成后面的变量无意义,要么造成不合理的指针运算;
2.fun1函数返回地址是0x00401102;
3.fun1函数的调用方main函数的栈底是0x0018FF48;
4.变量有两个,1个int型0A 00 00 00(值为10),1个float型CD CC 5C 41(值是13.8f);
5.当前CPU三个寄存器的值分别为0x7EFDE000、0x00000000、0x0018FF48,此时fun1的栈顶被更新为其栈底保存的值。
第2、3个函数同理,2被1调用,3被2调用,一层套一层,直接上图
一个不严谨的方法:一片C为一块,信息都是从这一片C的前后得出的,前三组为保存CPU环境,后面几组main和调用函数有区别,自己看看。
实验二:SQL注入
本实验中最重要的就是一个SQL注入,至于前面安装配置小皮还有靶场什么的不说了
SQL的本质就是“故意写错填空内容”,将本来要输入的数据填写为代码,使得服务器向数据库的正常查询变成了不正常的代码执行,以此来达到入侵。
SQL 手工注入(非盲注)的基本步骤如下:
1)判断是否存在注入,注入是字符型还是数字型。
2)猜解 SQL 查询语句中的字段数及字段顺序。
3)获取当前数据库名。
4)获取数据库中的表名。
5)获取表中的字段名。
6)下载数据。
案例背景
假设你正在测试一个电子商务网站的安全性,该网站有一个搜索功能,允许用户通过用户名搜索用户信息。搜索框的URL参数如下:
http://example.com/search?username=[user_input]
步骤1:判断是否存在注入
首先,需要确定目标应用是否存在SQL注入漏洞,并判断注入类型(字符型或数字型)
字符型注:输入 `'`(单引号)导致查询失败或出现异常(你输入的数据其实是作为SQL查询语句提交给数据库的,加一个单引号后会将原本的查询语句打乱,导致报错)。
数字型注入:输入特殊字符或SQL语句片段,如 `1' or '1'='1`,如果返回结果与预期不符,可能存在注入(通过1=1这个恒等式(不是1==1,SQL中语法与C不一样)来使or这条语句判断为真,以达到侵入的目的)。
步骤2:猜解字段数及字段顺序
通过SQL注入点,尝试改变查询结果的排序,来确定SQL查询中涉及的字段数量和顺序。
输入以下字符串来确定查询语句中的字段数:
1' order by 1 --+
//如果页面正常显示,增加数字直到出现错误,比如:
1' order by 3 --+ //如果页面出错,说明查询语句涉及3个字段
// 在语法上--会使之后的语句变成注释,由此破坏查询命令
步骤3:获取当前数据库名
利用SQL注入点,尝试获取当前数据库的名称
' union select database() --+
步骤4:获取数据库中的表名
在确认了数据库名后,下一步是获取数据库中包含的表名
' union select table_name from information_schema.tables where table_schema='[target_db_name]' --+
//这里的[target_db_name]是你要入侵的数据库名字,同样使用--+使后面的语句变成注释,不影响你的“入侵”
步骤5:获取表中的字段名
确定表名后,可以进一步获取表中各字段的名称。
' union select column_name from information_schema.columns where table_name='[target_table_name]' --+
//[target_table_name]是实际的表名,你想康康那一列就康哪一列(。ì _ í。)
步骤6:下载数据
最后一步是尝试获取敏感数据,如用户名和密码
' union select user, password from [target_table_name] --+
//裤衩子都给他看光
实验三:登陆界面的需求分析
如果是前面的实验是在讲“攻”,那这个实验就是在说“防”了,怎样的设计可以提高软件的安全性
首先登陆页面是必不可少的,由此也就延伸出了本实验所讨论的内容。
邮箱注册登录方式
- 优点:免费、方便、安全、多功能。
- 缺点:垃圾邮件、邮箱泄露风险、容量限制。
- 验证方式:用户名和密码、邮箱验证码、手机短信验证、安全问题验证。
手机号注册登录方式
- 优点:方便快捷、安全性高、信息真实性高。
- 缺点:依赖手机网络、隐私泄露风险、无法记住账号。
- 验证方式:短信验证码、语音验证码、手机号验证链接。
传统账号密码登录
- 优点:安全性高、稳定性好、用户习惯。
- 缺点:操作繁琐、容易忘记密码、安全性不足。
根据实验报告中的登录界面需求分析,以下是可能存在的一些软件安全漏洞:
1. **注入漏洞**:
- 如果输入未经适当过滤,攻击者可能会利用SQL注入或命令行注入攻击来操纵数据库查询或执行恶意命令。
2. **跨站脚本攻击(XSS)**:
- 如果用户输入数据(如用户名或密码)未经适当处理就显示在网页上,可能会引起存储型或反射型XSS攻击。
3. **暴力破解**:
- 如果系统没有有效的防暴力破解措施,如登录尝试次数限制或验证码,攻击者可能会尝试无限次登录来猜测密码。
4. **密码安全问题**:
- 如果密码策略不够强,允许用户设置简单密码或不要求密码复杂度,密码容易被破解。
5. **信息泄露**:
- 如果用户信息(如密码、身份证号等)未经加密存储或传输,可能会在传输过程中或存储时被窃取。
为了保障实现注册和登录功能时对用户信息及相关数据的保护,在设计时必须实现以下功能点。(4-6点)
- 安全漏洞修复:系统必须及时修复已知的安全漏洞,以保障用户信息的安全。同时,系统必须定期进行安全检查和漏洞扫描,及时发现并修复潜在的安全问题。
2. 防暴力破解策略:系统必须设置防暴力破解策略,例如限制用户登录次数、增加验证码等,以防止恶意攻击者通过暴力破解获取用户信息。
3. 用户信息传输加密:用户在注册或登录时,输入的信息必须经过加密处理后再传输到服务器,以防止信息被窃取或篡改。
4. 用户信息加密存储:用户的敏感信息(如密码、身份证号等)必须经过加密处理后再存储到数据库中,以防止数据泄露和恶意攻击。
实验四:编写正则表达式
正则表达式(RegEx)是一种文本模式,包括普通字符和特殊元字符,用于匹配制定规则的字符串。编译器中的词法分析器会使用正则表达式去匹配代码中的关键字,网站上的注册表单会用他去判断密码的强弱,在爬虫中同样有用。
正则表达式实例:
- 用户名验证:必须字母开头,6~16位,包含字母、数字和其他字符。
- 密码验证:8-16字符,必须包含数字、字母和其他字符。
- 强密码验证:16-24字符,不能有连续数字,包含数字、字母和其他字符。
- 身份证号验证:18位,最后一位可以是数字或X。
- E-mail地址验证:包含用户名和域名,支持字母、数字、下划线、短横线和点号。
- 电话号码验证:11位,开头必须是1,全数字。
- IP地址验证:四组数字,每组0~255,用点分隔。
- 中文字符验证:字符串必须全是汉字。
- 域名验证:字母或数字开头,可含中划线,后缀至少两个字符。
- 数字验证:匹配整数或小数。
现在来介绍正则表达式的规则:
1.used? //?是一个特殊字符,表示?前的字符可有可无,例如本例可以匹配到used,也可以匹配到use
2.ab*c //*代表前面的字符可以出现0次获多次,例如本例可以匹配到ac,abc,abbbbbc
3.ab+c //+会匹配出现一次及以上的字符,例如abc,abbbc
4.ab{6}c //比+更精确,能够匹配出现了六次的字符,abbbbbbc,这种写法还可以是{2,6}2到6次之间,{2,}两次以上等
5.a(cat|dog) //或限定符,匹配到a cat,a dog
6.[abc]+ //方括号要求匹配的字符只能取自于他们,比如abcc,cacb,bbc
7.[a-z] //所以小写字符[a-zA-Z] //所有英文字符[a-zA-Z0-9] //所有英文字符和数字
8.[^0-9] //^代表所有非括号内的字符,本例中表示所有非数字字符,包括换行符
同时,正则表达式还规定了很多元字符,这里不多赘述了,想看的自己下去了解吧。
来看两个简单实例:
1.颜色值匹配
2.IPv4地址匹配
好了,至此,四篇实验全部讲完,我们来进入实战。
实战1:给你一段代码问你代码相关的东西(相关实验2,3)
// 假设的PHP代码,用于从数据库检索用户信息
if (isset($_POST['username'])) {$username = $_POST['username'];// 构造SQL查询$query = "SELECT * FROM users WHERE username = '$username' AND password = '" . md5($_POST['password']) . "'";// 执行查询$result = mysqli_query($conn, $query);// ...
}
问可能受到的攻击和防范措施:
可能的攻击方法:
-
SQL注入:
- 攻击者可以通过在
username
输入框中输入如' OR 1=1 --
,绕过登录验证,因为SQL查询没有进行适当的转义或使用参数化查询。
- 攻击者可以通过在
-
密码绕过:
- 如果攻击者发现密码字段的MD5值总是相同,他们可能会尝试使用这个值来绕过密码验证。
避免攻击的基本对策:
-
使用预处理语句:
- 使用预处理语句和参数化查询,确保用户输入作为参数处理,而不是作为SQL代码的一部分。
-
输入过滤和验证:
- 对所有输入进行严格的过滤和验证,确保它们不包含潜在的恶意代码。
-
密码存储安全:
- 不要使用MD5存储密码,因为它不安全且容易受到彩虹表攻击。使用更强的哈希函数,如bcrypt。
此类题其实就是考察你对这门课教过的各种攻击记忆有多少,有哪些种类的攻击,是通过什么原因导致的。(对于此,我个人认为其实不算是分析,而更像是简答,把你记住的攻击全往上怼就行了。考试卷面有限,不会把完整代码都给你写出来的,既然有省略,我们就可以钻空子,最常见的就是SQL注入攻击,再其次就是XSS,你能说他省略的地方一定没有用户输入回显的方法吗?既然有,那就很有可能存在XSS漏洞。诸如此类,所以这题更看重的是你心态稳不稳,看不懂也别慌)
对于易受SQL注入攻击的Web应用程序,可能的攻击方法包括但不限于以下几种:
1. **经典SQL注入**:
- 攻击者通过输入特殊的SQL代码片段,尝试改变原有查询逻辑,获取、篡改或删除数据库中的敏感数据。(看到输入的内容直接作为查询语句的,不用想,SQL注入)
// 直接将用户输入拼接到SQL查询中,易受SQL注入攻击
if (isset($_POST['username']) && isset($_POST['password'])) {$username = $_POST['username'];$password = $_POST['password'];$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";$result = mysqli_query($conn, $query);// ...
}
2. **XSS跨站脚本攻击**:
- 用户输入直接输出到页面,没有进行HTML编码,易受XSS攻击。(看到有输入回显相关的,OK,XSS)
// 假设的PHP代码,用于显示用户输入的评论
echo "Welcome, " . $_GET['name'] . "!";
3. **不安全的文件上传**:
- 直接使用用户上传的文件名,可能包含相对路径或特殊字符,易导致文件权限提升或敏感文件覆盖。(看到文件看到file了,可能会有不安全的文件上传)
// 假设的PHP代码,用于处理文件上传
if ($_FILES['file']['error'] == 0 && $_FILES['file']['size'] <= 1024 * 1024 * 5) {if (move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $_FILES['file']['name'])) {echo "File uploaded successfully.";} else {echo "File upload failed.";}
}
4. **不安全的直接对象引用**:
- 用户ID直接用于查询,易受不安全的直接对象引用攻击。(和SQL注入差不多,要查那个直接就查了,可能会出现不安全的直接对象引用)
// 假设的PHP代码,用于显示用户配置文件
$user_id = $_GET['user_id'];
$query = "SELECT * FROM user_profiles WHERE id = $user_id";
$result = mysqli_query($conn, $query);
// ...
5. **文件上传漏洞利用**:
- 如果SQL注入漏洞存在于文件上传功能中,攻击者可能会上传恶意文件来执行代码。
6. **远程命令执行**:
- 在某些情况下,SQL注入可能被用来执行操作系统命令,导致远程命令执行。
### 防御措施:
- **使用预处理语句和参数化查询**:避免直接将用户输入拼接到SQL语句中。
- **输入验证和过滤**:确保所有输入都符合预期格式,过滤掉潜在的危险字符。
- **最小权限原则**:数据库账号应具有执行必要操作的最小权限。
- **错误处理**:不要向用户展示详细的数据库错误信息。
- **定期安全审计**:定期对应用程序进行安全审计,检查潜在的安全问题。
通过这些措施,可以显著提高应用程序的安全性,减少被SQL注入攻击的风险。
好了,这类题就是这样,其中SQL和XSS比较重要,剩下几个随便吧,大概写点就有几分呢,别放弃 (。ì _ í。)
实战2:给你一个登陆页面回答相关问题(关联实验3)
既然实验做了登陆页面的分析,那大题应该会考一个登陆页面相关的。其实本质来说跟上一道差不多,也是记住了可能有哪些漏洞,看图说话罢了。
首先根据实验,来看三种登陆方式可能出现的问题,这是最有可能得分点:
电子邮件登录、手机号码登录和账号密码登录是常见的登录方式,每种方式都有其潜在的安全问题:
### 电子邮件登录可能存在的问题:
1. **电子邮件被截获**:
- 使用电子邮件进行通信时,如果未加密,邮件内容可能在传输过程中被截获。
2. **电子邮箱被非法登录控制**:
- 邮箱账户若被攻破,攻击者可能获取用户的登录令牌或其他敏感信息。
3. **电子邮件系统被攻击控制**:
- 电子邮件服务提供商若存在安全漏洞,可能被攻击者控制,影响所有用户。
4. **针对特定用户的电子邮件社会工程学攻击**:
- 通过发送欺诈性邮件,诱导用户泄露密码或其他敏感信息。
5. **Cookie和Session的安全性问题**:
- 如果Session ID存放在Cookie中,并且没有适当的安全措施,可能遭受CSRF攻击。
### 手机号码登录可能存在的问题:
1. **依赖手机网络**:
- 如果用户在没有网络的情况下,可能无法接收验证码,影响登录。
2. **隐私泄露风险**:
- 使用手机号码作为登录凭证可能会增加个人信息泄露的风险。
3. **短信服务被攻击**:
- 短信服务若被攻击者截获或篡改,验证码可能被拦截。
4. **手机设备安全**:
- 手机若被植入恶意软件,可能影响登录安全。
### 账号密码登录可能存在的问题:
1. **密码强度不足**:
- 用户可能使用弱密码,容易被猜测或通过暴力破解手段破解。
2. **密码存储安全**:
- 如果服务器端未对密码进行加密或使用不安全的哈希算法,密码可能被泄露。
3. **键盘记录器攻击**:
- 恶意软件可能记录用户的键盘输入,从而获取账号密码。
4. **暴力破解攻击**:
- 攻击者可能尝试多次登录,猜测密码。
5. **社交工程攻击**:
- 通过诱导用户提供密码或其他敏感信息。
所以,第一步先看题干,如果是账密登陆,就可以答密码强度、密码存储等问题;邮箱就是截获、非法控制这种;手机也是一个道理。
其次,还有可能出现:
-
弱密码策略:如果系统允许用户设置简单或弱密码,那么账户容易被暴力破解。
-
缺乏双因素认证:如果没有提供双因素认证选项,就会增加账户被入侵的风险。
-
会话管理不足:如果有“多长时间内免密登陆”这种,系统可能提供长时间有效的会话,这可能使会话劫持更加容易。
-
输入验证不足:如果登录表单没有正确验证输入,可能会受到SQL注入、跨站脚本(XSS)等攻击。这也跟上一题说的对上了。
-
信息泄露:如果有管理员入口,如果存在漏洞,可能会泄露管理员账户信息。
-
扫码登录的安全性:如果有扫码登录功能,可能会受到中间人攻击或其他安全威胁。
通用的安全措施:
- 使用HTTPS:确保所有通信都是加密的,防止数据在传输过程中被截获。
- 多因素认证:增加安全层次,即使密码被破解,攻击者也难以获取账户控制权。
- 限制登录尝试次数:防止暴力破解攻击。
- 安全的密码策略:强制使用强密码,并提供密码管理建议。
- 安全的Cookie使用:设置HttpOnly和Secure标志,防止CSRF和XSS攻击。
- Session管理:定期轮换Session ID,并在用户登出时使Session ID失效。
- 双因素认证:通过短信验证码、身份验证器应用或硬件令牌提供第二层安全验证。
- 教育用户:提高用户对钓鱼攻击和社交工程攻击的认识。
- 定期安全审计:检查和修复安全漏洞,更新安全策略。
通过实施这些安全措施,可以显著提高登录系统的安全性,减少被攻击的风险。
实战3:缓冲区溢出,栈相关(相关实验1)
实验一能考的我认为只有溢出一个点了,可能还夹杂着一些密码安全相关的东西。话不多说,直接看题。
#include <stdio.h>
#include <string.h>int main() {char password[20] = "mysecurepassword";char input[20];printf("Enter your password: ");// 危险:使用gets()可能导致缓冲区溢出gets(input); // 危险函数,已被废弃if (strcmp(input, password) == 0) {printf("Access granted.\n");} else {printf("Access denied.\n");}return 0;
}
此C语言程序片段,用于从用户那里获取输入并检查是否与预设密码匹配:
可能出现的问题:
-
缓冲区溢出: 使用
gets()
函数读取用户输入会导致未定义行为,如果输入超过input
数组的大小,将覆盖相邻内存区域,可能导致程序崩溃或安全漏洞。 -
不安全的密码存储: 密码以明文形式存储在源代码中,这使得密码对所有可以访问源代码的人来说都是可见的。
-
不安全的密码输入: 使用
gets()
函数无法防止用户输入带有换行符的长字符串,增加了溢出风险。 -
密码猜测: 如果程序在比较密码时反馈具体是哪个部分不正确(如长度或内容),攻击者可以使用此信息进行猜测。
-
缺乏加密措施: 密码在内存中以明文形式存在,如果程序的内存被dump,密码同样会暴露。
-
不健壮的输入处理: 程序没有检查
gets()
是否成功读取输入,没有错误处理机制。 -
过时的函数使用:
gets()
函数由于其不安全性,在C11标准中已被移除,使用此函数的代码不符合现代C语言标准。
解决对策:
-
使用安全的输入函数: 使用
fgets()
代替gets()
,并检查返回值以确保成功读取。fgets(input, sizeof(input), stdin);
-
限制输入长度: 在将输入与密码比较之前,确保去除字符串末尾的换行符,并检查长度。
-
安全地存储密码: 使用加密哈希存储密码,而不是明文。
-
使用恒定时间比较: 使用如
timingsafe_bcmp()
这样的函数比较密码,以防止侧信道攻击。 -
错误处理: 对所有用户输入和程序逻辑进行错误检查,并适当处理异常情况。
-
遵循现代编程实践: 遵循C语言的最佳实践和现代编程标准,避免使用过时和不安全的函数。
-
代码审查和安全测试: 定期进行代码审查和安全测试,包括静态分析和动态分析,以发现潜在的安全问题。
这种类型的题目通常考察对C语言编程中常见安全漏洞的理解和防御策略,包括但不限于缓冲区溢出、不安全的输入处理、密码安全、内存安全等凸^-^凸
实战4:正则表达式编写
这个其实有点难,不是死记硬背能解决的了,可能上考场后一个点没有想到就答不出标准答案,不过做不到和标准答案一摸一样,大差不差还是可以的。限定小写字母会写吧,限定数字会写吧,限定出现几次会写吧,把会写的写写就行
背景: 在开发一个用户注册功能时,需要验证用户输入的邮箱地址是否有效。为了确保用户填写的邮箱符合标准的格式,你需要编写一个正则表达式来验证邮箱地址。
要求: 编写一个正则表达式,满足以下条件:
- 邮箱地址以字母、数字、下划线、短横线或点开始。
- 必须包含一个
@
符号,@
符号前后可以有字母、数字、下划线、短横线或点。 - 域名部分至少要有一个点,点的两侧可以有字母、数字。
- 不能以点或短横线开始或结束。
- 邮箱地址长度应在3到255个字符之间。
示例:
- 有效的邮箱:
example_user@mail服务商.com
- 无效的邮箱:
user@.com
、user@.com.cn
、user@.com.
、user@服务商.com
任务: 请根据以上要求编写一个正则表达式,并说明每个部分的作用。
答案:
^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
^
:匹配字符串的开始。
[a-zA-Z0-9._-]+
:匹配一个或多个字母、数字、下划线、点或短横线。
@
:字面意义上的@
符号。
[a-zA-Z0-9.-]+
:匹配一个或多个字母、数字、点或短横线(域名部分)。
\.
:字面意义上的点,因为点在正则表达式中是一个特殊字符,所以需要使用反斜杠进行转义。
[a-zA-Z]{2,}
:匹配两个或更多的字母(顶级域名)。
$
:匹配字符串的结束。
上一届似乎还考了“谈谈你这学期做过的实验和心得体会这种题”,大有“你这学期的任课老师叫什么名字”的感觉,四个实验咱们之前都说过,这里不再赘述。选择题应该是把上一篇总结的知识点挖空变成选择,难度不大,看过上一篇的能答个七七八八。至此,本科考试知识点全部讲解完毕。
之后如果想到能够补充的会继续发,可以订阅一下专栏。
稳住心态,不要慌,结课考试而已,总有人要过,为什么不能是认真准备了的各位呢?把前面的简答认真看了,胜利必然
英国优秀法学生祝您考试顺利
相关文章:
【太原理工大学】软件系统安全—分析题
OK了,又是毫无准备的一场仗,我真是ありがとうございます 凸^o^凸 根据前几年传下来的信息,所谓“分析”,就是让你根据情节自行设计,例如如何设计表单等,这类多从实验中出,王老师强调好好做实验一…...
【仪器仪表/电源专题】浮地信号的测试的四种方案对比
接地信号和浮地信号区别 所有的电压测量都是差分测量,差分测量定义为两点之间的电压差。所以会分成两类: 1.参考地电平测量(有时也叫接地信号) 2.非参考地电平测量(也称为浮地测量) 测试信号可以分为接地信…...
Centos7安装jdk8或11以及切换方案
目录 jdk安装 安装OpenJDK11 安装OpenJDK8 配置默认的 Java 版本 验证 全局环境变量(选配) 个人版(自己可以用,公司不建议) 公司版本 /etc/profile 和 ~/.bash_profile 区别 前言-与正文无关 生活远不止眼前的苦…...
计算机二级Access选择题考点—代码篇
第1题 窗体的事件过程如下: Private Sub Form MouseDown(Button As Integer ,Shift As integer,X As Single,Y As Single)If Shift 6 And Button 2 Then MsgBox "Hello World."End lf End Sub程序运行后,要在窗体消息框中显示"Hello World."…...
海外仓系统如何让海外仓受益,WMS海外仓系统使用指南
随着跨境电商业务的快速发展,海外仓面临着需要更加高速运转的巨大挑战。 当海外仓出现因为手动作业导致效率低下,成本不断飙升或者出现库存管理问题的时候,意味着是时候引入一套合适的海外仓管理系统了。 对于寻求海外仓业务流程优化的企业…...
贪心-区间问题
135. 分发糖果 问题描述 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求,给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&#x…...
算法分析与设计期末考试复习GDPU
重点内容: 绪论: 简单的递推方程求解 1.19(1)(2) 、 教材例题 多个函数按照阶的大小排序 1.18 分治法: 分治法解决芯片测试问题 计算a^n的复杂度为logn的算法(快速幂) 分治法解决平面最近点对问…...
分批次训练和评估神经网络模型
【背景】 训练神经网络模型的时候,特征组合太多,电脑的资源会不足,所以采用分批逐步进行。已经处理过的批次保存下来,在下一次跳过,只做新加入的批次训练。 选择最优模型组合在中间结果的范围内选择,这样…...
【CS.AL】算法核心之分治算法:从入门到进阶
文章目录 1. 概述2. 适用场景3. 设计步骤4. 优缺点5. 典型应用6. 题目和代码示例6.1 简单题目:归并排序6.2 中等题目:最近点对问题6.3 困难题目:分数背包问题 7. 题目和思路表格8. 总结References 1000.01.CS.AL.1.4-核心-DivedeToConquerAlg…...
leetcode刷题记录:hot100强化训练2:二叉树+图论
二叉树 36. 二叉树的中序遍历 递归就不写了,写一下迭代法 class Solution(object):def inorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""if not root:return res []cur rootstack []while cur or st…...
湘潭大学信息与网络安全复习笔记2(总览)
前面的实验和作业反正已经结束了,现在就是集中火力把剩下的内容复习一遍,这一篇博客的内容主要是参考教学大纲和教学日历 文章目录 教学日历教学大纲 教学日历 总共 12 次课,第一次课是概述,第二次和第三次课是密码学基础&#x…...
C语言:头歌使用函数找出数组中的最大值
任务描述 本关任务:本题要求实现一个找出整型数组中最大值的函数。 函数接口定义: int FindArrayMax( int a[], int n ); 其中a是用户传入的数组,n是数组a中元素的个数。函数返回数组a中的最大值。 主程序样例: #include <stdio.h>#…...
【技巧】Leetcode 191. 位1的个数【简单】
位1的个数 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中 设置位 的个数(也被称为汉明重量)。 示例 1: 输入:n 11 输出:3 解释&#x…...
【Pandas驯化-02】pd.read_csv读取中文出现error解决方法
【Pandas】驯化-02pd.read_csv读取中文出现error解决方法 本次修炼方法请往下查看 🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地! 🎇 相关内容文档获取 微信公众号 &…...
linux下C语言如何操作文件(三)
我们继续介绍file_util.c中的函数: bool create_dir(const char* path):创建目录,根据给定的path创建目录,成功返回true,否则返回false。如果有父目录不存在,该函数不会创建。 /*** 创建目录* @param path 目录路径* @return true 创建成功,false 创建失败*/ bool cre…...
6.14作业
使用手动连接,将登录框中的取消按钮使用第二中连接方式,右击转到槽,在该槽函数中,调用关闭函数 将登录按钮使用qt4版本的连接到自定义的槽函数中,在槽函数中判断ui界面上输入的账号是否为"admin"࿰…...
MySQL数据库管理(一)
目录 1.MySQL数据库管理 1.1 常用的数据类型编辑 1.2 char和varchar区别 2. 增删改查命令操作 2.1 查看数据库结构 2.2 SQL语言 2.3 创建及删除数据库和表 2.4 管理表中的数据记录 2.5 修改表名和表结构 3.MySQL的6大约束属性 1.MySQL数据库管理 1.1 常用的数据类…...
Kafka使用教程和案例详解
Kafka 使用教程和案例详解 Kafka 使用教程和案例详解1. Kafka 基本概念1.1 Kafka 是什么?1.2 核心组件2. Kafka 安装与配置2.1 安装 Kafka使用包管理器(如 yum)安装使用 Docker 安装2.2 配置 Kafka2.3 启动 Kafka3. Kafka 使用教程3.1 创建主题3.2 生产消息3.3 消费消息3.4 …...
TGI模型- 同期群-评论文本
用户偏好分析 TGI 1.1 用户偏好分析介绍 要分析的目标,在目标群体中的均值 和 全部群体里的均值进行比较, 差的越多说明 目标群体偏好越明显 TGI(Target Group Index,目标群体指数)用于反映目标群体在特定研究范围内…...
ESP32 BLE学习(0) — 基础架构
前言 (1)学习本文之前,需要先了解一下蓝牙的基本概念:BLE学习笔记(0.0) —— 基础概念(0) (2) 学习一款芯片的蓝牙肯定需要先简单了解一下该芯片的体系结构&a…...
【JAVA】Java中Spring Boot如何设置全局的BusinessException
文章目录 前言一、函数解释二、代码实现三、总结 前言 在Java应用开发中,我们常常需要读取配置文件。Spring Boot提供了一种方便的方式来读取配置。在本文中,我们将探讨如何在Spring Boot中使用Value和ConfigurationProperties注解来读取配置。 一、函数…...
pdf.js实现web h5预览pdf文件(兼容低版本浏览器)
注意 使用的是pdf.js 版本为 v2.16.105。因为新版本 兼容性不太好,部分手机预览不了,所以采用v2版本。 相关依赖 "canvas": "^2.11.2", "pdfjs-dist": "^2.16.105", "core-js-pure": "^3.37.…...
SSID简介
一、 SSID 概念定义 SSID(Service Set Identifier)即服务集标识符。它是无线网络中的一个重要标识,用于区分不同的无线网络。 相当于无线网络的名称,用于区分不同的无线网络。用户在众多可用网络中识别和选择特定网络的依据。通…...
PS通过GTX实现SFP网络通信1
将 PS ENET1 的 GMII 接口和 MDIO 接口 通过 EMIO 方 式引出。在 PL 端将引出的 GMII 接口和 MDIO 接口与 IP 核 1G/2.5G Ethernet PCS/PMA or SGMII 连接, 1G/2.5G Ethernet PCS/PMA or SGMII 通过高速串行收发器 GTX 与 MIZ7035/7100 开发…...
前端面试项目细节重难点(已工作|做分享)(九)
面试官:请你讲讲你在工作中如何开发一个新需求,你的整个开发过程是什么样的? 答:仔细想想,我开发新需求的过程如下: (1)第一步:理解需求文档: 首先&#x…...
区间预测 | Matlab实现BP-ABKDE的BP神经网络自适应带宽核密度估计多变量回归区间预测
区间预测 | Matlab实现BP-ABKDE的BP神经网络自适应带宽核密度估计多变量回归区间预测 目录 区间预测 | Matlab实现BP-ABKDE的BP神经网络自适应带宽核密度估计多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现BP-ABKDE的BP神经网络自适应带…...
抢占人工智能行业红利,前阿里巴巴产品专家带你15天入门AI产品经理
前言 当互联网行业巨头纷纷布局人工智能,国家将人工智能上升为国家战略,藤校核心课程涉足人工智能…人工智能领域蕴含着巨大潜力,早已成为业内共识。 面对极大的行业空缺,不少人都希望能抢占行业红利期,进入AI领域。…...
MEMS:Lecture 16 Gyros
陀螺仪原理 A classic spinning gyroscope measures the rotation rate by utilizing the conservation of angular momentum. 经典旋转陀螺仪通过利用角动量守恒来测量旋转速率。 Coriolis Effect and Coriolis Force 科里奥利效应是一种出现在旋转参考系中的现象。它描述了…...
Java中List流式转换为Map的终极指南
哈喽,大家好,我是木头左! 在Java编程中,经常需要将一个List对象转换为另一个Map对象。这可能是因为需要根据List中的元素的某些属性来创建一个新的键值对集合。在本文中,我将向您展示如何使用Java 中的流式API轻松地实…...
【秋招突围】2024届秋招笔试-小红书笔试题-第一套-三语言题解(Java/Cpp/Python)
🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系计划跟新各公司春秋招的笔试题 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📧 清隆这边…...
杰讯山西网站建设/seo什么意思简单来说
display布局中有两个属性,一个是none可以使其修饰的标签隐藏,show可以使其修饰的标签显示出来...
iis wordpress伪静态/百度问问我要提问
首先需要修改一些配置文件 vim /etc/ssh/sshd_config 进入sshd_config文件后需要更改几个地方 PubkeyAuthentication yes #启用公告密钥配对认证方式 AuthorizedKeysFile %h/.ssh/authorized_keys #设定PublicKey文件路径RSAAuthentication yes #允许RSA密钥PasswordAu…...
萧山做网站设计/近期重大新闻事件
有点发昏..可能是最近没休息好..争取今晚在二点之前把剩下的视频看完.然后去准备网工的考试吧.明天还上班呢...早点睡早点睡.. 伴着这首歌入眠吧,抛却所有.我要的执着.歌曲:执着歌手:许巍 专辑:在路上 每个夜晚来临的时候孤独总在我左右每个黄…...
做电子商务系统网站/晋城今日头条新闻
这个问题严格来说是肯定有的,kafka只能保证分区内的有序性。 下面是kafka作者Jay Kreps的blog中介绍kafka设计思想的一段话。 Each partition is a totally ordered log, but there is no global ordering between partitions (other than perhaps some wall-clock…...
网站建设属于什么服务/网络营销方案设计毕业设计
代码块 概述:在Java中,使用{}括起来的代码被称为代码块。 代码块分为:局部代码块,构造代码块,静态代码块,同步代码块 常见代码块的使用: a:局部代码块 在方法中出现;限定变量生命周…...
制作网站需要注意什么/江苏网页设计
前言用过腾讯课堂的小伙伴们可能都知道,腾讯课堂播放时左右快进,后退的时候不太灵敏,有时候没反应,非常难受。我就想着能不能下载下来。在网上找了一圈都没有什么好用的方法。直到今天才找到方法,分享出来给大家使用。…...