软考中级软件设计师高频考点:DoS、ARP欺骗与IDS、IPS防御辨析
文章目录
考查题型:综合知识(选择题)。围绕攻击目标、协议位置和防护设备能力,区分 DoS/DDoS、ARP 欺骗、SQL 注入、XSS,以及 ACL、IDS、IPS、WAF 的作用边界。
做网络安全选择题时,只记住缩写很容易掉进“所有安全设备都能防所有攻击”的陷阱。更有效的顺序是:先看攻击破坏了什么,再看它发生在哪一层,最后判断防护措施有没有相应的观察和处置能力。本文用三道留存真题和一段离线日志模拟,把这条判断链走一遍。
一、从攻击目标判断:机密性、完整性还是可用性
机密性关注未经授权的人能否读到信息;完整性关注信息有没有被擅自修改;可用性关注合法用户在需要时能否使用服务。一次攻击可能同时影响多个属性,但题干问“首要目标”时,要选择最直接的那个。
| 题干现象 | 优先识别 | 主要影响 |
|---|---|---|
| 服务资源耗尽,合法请求不能得到响应 | 拒绝服务 DoS | 可用性 |
| 多个来源协同造成拒绝服务 | 分布式拒绝服务 DDoS | 可用性 |
| 伪造局域网 IP 与 MAC 的映射 | ARP 欺骗 | 可能导致窃听、篡改或中断 |
| 数据作为 SQL 语句结构被解释 | SQL 注入 | 数据库权限与数据安全 |
| 不可信内容进入浏览器的可执行上下文 | 跨站脚本 XSS | 浏览器侧执行与用户会话安全 |
DDoS 中的“分布式”描述攻击来源和组织方式,并不是另一种病毒名称。大量正常用户同时访问也会造成负载升高,因此“请求多”不能单独证明遭遇 DDoS。考试中按给定特征判断,实际运维还需要流量、资源和业务证据。

真题一:拒绝服务针对哪个目标
来源:2021 年上半年软件设计师综合知识,第 8 题。题干与选项按本地卷面文本引用:
下列攻击类型中, (8) 是以被攻击对象不能继续提供服务为首要目标。
(8) A. 跨站脚本 B. 拒绝服务 C. 信息篡改 D. 口令猜测
参考答案:B。题干的“不能继续提供服务”直接对应可用性。C 的直接目标是完整性;D 主要尝试突破身份认证;A 的核心是浏览器执行不可信脚本。它们可能间接造成服务问题,但不是该定义的首要目标。
这类题先把中文现象翻译为安全属性,再与攻击名称匹配,比背诵一长串英文缩写更稳定。
二、ARP 欺骗:先看清 IP 与 MAC 的映射
IPv4 局域网中,主机发送以太网帧之前,需要确定下一跳的 MAC 地址。若目标处于同一网段,通常解析目标主机的地址;若目标位于其他网段,通常解析网关地址。不能认为“访问任何网站时,都要用 ARP 查网站服务器的 MAC”。
传统 ARP 缺少对映射声明的强身份认证,错误的映射可能进入缓存。攻击者伪造映射后,流量可能被错误转发、截获或者丢弃。ARP 欺骗与 DNS 欺骗的区别在于:前者影响 IP 到 MAC,后者影响域名到 IP 等 DNS 记录。
防护要覆盖实际工作位置:交换机支持时可使用动态 ARP 检测,结合可信 DHCP Snooping 绑定;关键设备可根据维护能力配置静态绑定;还可监控异常 MAC 变化。静态绑定需要维护,正常更换网卡或网关也可能触发异常,不能当成零成本万能措施。
HTTPS 能为合适配置下的应用通信提供保护,但它不负责修复 ARP 缓存;即使内容无法被解密,链路仍可能被丢包而不可用。看到“加密”就选为所有网络问题的答案,同样不成立。
三、ACL、IDS、IPS、WAF:过滤、检测与阻断不同
| 技术 | 主要依据或观察对象 | 常见作用 | 不能直接推导的结论 |
|---|---|---|---|
| ACL | 地址、协议、端口等规则 | 允许或拒绝相应流量 | 能理解全部业务语义 |
| IDS | 流量、事件或主机行为 | 检测异常并告警 | 检测到就一定已阻断 |
| IPS | 在线检测与处置规则 | 在流量路径上执行阻断等动作 | 没有误报、漏报或性能代价 |
| WAF | HTTP 等应用请求特征 | Web 应用攻击防护 | 能替代安全编码或抵御全部链路攻击 |
| 防病毒软件 | 恶意文件、行为等 | 检测和处置恶意软件 | 可替代所有网络访问控制 |
考试常用 IDS 与 IPS 的主要区别来设干扰项:典型 IDS 偏向检测、告警;典型 IPS 处于可执行阻断的位置。实际产品可能联动防火墙或组合多种能力,判断时要看题目是否给出联动条件,不能把产品扩展能力一概当成基本定义。
ACL 的规则顺序和默认动作非常重要。在“从上到下匹配、首次匹配生效”的模型中,前面的宽泛允许可能使后面的拒绝无法命中;没有匹配任何规则时,是否默认拒绝又取决于配置与实现。作答时先找题干规定,别把某厂商行为套到所有系统。

真题二:出口防火墙的访问控制
来源:2022 年上半年软件设计师综合知识,第 10 题。引用原文:
10.通过在出口防火墙上配置______功能可以阻止外部未授权用户访问内部网络。
A.ACL B.SNAT C.入侵检测 D.防病毒
参考答案:A,与留存解析的答案一致。ACL 根据规则对访问流量放行或丢弃。SNAT 的直接作用是源地址转换,并不等于授权判断;入侵检测的基本定义强调发现和告警;防病毒的观察对象也不等于网络访问权限。
注意不要把 NAT 当成一整套访问控制方案。某个网络部署可能因地址转换和状态行为降低可达性,但题目问“配置哪个功能实现阻止未授权访问”,应选明确承担访问控制职责的 ACL。
四、SQL 注入和 XSS:先确定执行者
SQL 注入的关键在于应用把不可信输入拼接成 SQL 结构;XSS 的关键在于浏览器把不可信内容解释为可执行内容。题目出现“数据库语句、数据库权限”,先考虑前者;出现“浏览器、脚本、会话”,先考虑后者。
SQL 防护优先使用参数化查询,并对动态表名、排序字段等无法作为普通参数绑定的结构使用固定映射或允许列表。参数化不能自动约束过大的结果集,也不能替代数据库最小权限。XSS 防护需要结合输出上下文编码、安全模板机制等;SQL 的参数绑定不能代替 HTML 输出编码。
WAF 可以作为补充防护层,不能据此省略代码修复。只靠“过滤某几个关键词”,也不能覆盖编码、上下文和语法变化。本文不演示攻击请求,关注的是软考需要的能力边界。
真题三:SQL 注入的首要目标
来源:2021 年上半年软件设计师综合知识,第 10 题:
SQL 是一种数据库结构化查询语言,SQL 注入攻击的首要目标是 (10) 。
(10) A. 破坏Web 服务
B. 窃取用户口令等机密信息
C. 攻击用户浏览器,以获得访问权限
D. 获得数据库的权限
参考答案:D。本题按其选项的抽象层次,强调突破数据库查询或权限边界。B 是可能出现的后果,A 更贴近拒绝服务,C 更接近浏览器侧攻击。工程中 SQL 注入也可能导致修改、删除或泄露数据,不能把题目的“首要目标”理解为唯一后果。
五、贯穿案例:同一批请求经过ACL、检测器和业务服务
以下为原创离线教学案例,不发送网络请求。拓扑明确为:请求 → ACL → 检测环节 → 业务服务。检测环节分别采用“只告警的IDS模型”和“告警后丢弃的IPS模型”。真实IDS常旁路观察镜像流量,代码只是把两个部署方式的处置差异放在同一数据上对比。
业务策略是允许文档示例网段192.0.2.0/24访问443端口,但拒绝其中的.8主机。ACL按顺序首次匹配,未命中默认拒绝;这项默认动作是本例的明确约定,不代替真实设备说明书。
合成日志里同时放入正常重试、低频探测和策略禁止的访问:
| 事件 | 行为 | 应观察的边界 |
|---|---|---|
| 1、2 | .9同一秒正常重试 | 频率规则可能误报正常行为 |
| 3、4 | .10跨两个整数秒的低频探测 | 来源获准不等于行为安全,单秒规则可能漏检 |
| 5 | 被单独禁止的.8访问443 | 特例拒绝必须位于宽泛允许之前 |
| 6 | 同网段主机访问80 | 网段匹配并不代表端口也匹配 |
| 7 | 其他网段访问443 | 服务端口正确也不代表来源有权限 |
检测规则仅为“同源、同一整数秒的第二次事件产生告警”,用于展示机制,不是生产级入侵识别算法。scenario是事后核对的教学标签,检测器不能偷看它来决定告警。
环境:Python 3.10+,仅用标准库。保存为security_pipeline.py,运行python3 security_pipeline.py。
from collections import Counter
from dataclasses import dataclass
from ipaddress import ip_address, ip_network
@dataclass(frozen=True)
class Rule:
action: str
source: str
port: int
@dataclass(frozen=True)
class Event:
second: int
source: str
port: int
scenario: str # 合成场景标签,不是检测器可用的特征。
ALLOW = Rule('permit', '192.0.2.0/24', 443)
DENY_HOST = Rule('deny', '192.0.2.8/32', 443)
RULES = [DENY_HOST, ALLOW]
def acl(event, rules):
for number, rule in enumerate(rules, 1):
if ip_address(event.source) in ip_network(rule.source) and event.port == rule.port:
return rule.action, number
return 'deny', 0 # 本例明确定义默认拒绝。
events = [
Event(0, '192.0.2.9', 443, 'normal_retry'),
Event(0, '192.0.2.9', 443, 'normal_retry'),
Event(1, '192.0.2.10', 443, 'slow_probe'),
Event(2, '192.0.2.10', 443, 'slow_probe'),
Event(3, '192.0.2.8', 443, 'blocked_host'),
Event(0, '192.0.2.11', 80, 'wrong_port'),
Event(0, '203.0.113.10', 443, 'outside_subnet'),
]
def run(mode):
if mode not in {'IDS', 'IPS'}:
raise ValueError('mode must be IDS or IPS')
seen, stats, rows = Counter(), Counter(), []
for index, event in enumerate(events, 1):
action, rule = acl(event, RULES)
if action == 'deny':
stats['acl_denied'] += 1
rows.append((index, f'ACL_DENY#{rule}'))
continue
stats['inspected'] += 1
key = event.second, event.source
seen[key] += 1
alert = seen[key] > 1
stats['alerts'] += int(alert)
# 仅用于事后核对教学标签;这些标签不参与规则判断。
stats['normal_alerts'] += int(alert and event.scenario == 'normal_retry')
stats['probe_without_alert'] += int(not alert and event.scenario == 'slow_probe')
if alert and mode == 'IPS':
stats['ips_blocked'] += 1
rows.append((index, 'IPS_BLOCK'))
else:
stats['delivered'] += 1
rows.append((index, 'DELIVER_ALERT' if alert else 'DELIVER'))
assert stats['acl_denied'] + stats['ips_blocked'] + stats['delivered'] == len(events)
return stats, rows
ids, ids_rows = run('IDS')
ips, ips_rows = run('IPS')
assert (ids['acl_denied'], ids['alerts'], ids['delivered']) == (3, 1, 4)
assert (ips['acl_denied'], ips['ips_blocked'], ips['delivered']) == (3, 1, 3)
assert ids['normal_alerts'] == 1 and ids['probe_without_alert'] == 2
assert acl(events[4], [ALLOW, DENY_HOST]) == ('permit', 1)
assert acl(events[4], RULES) == ('deny', 1)
print('event | IDS path | IPS path')
for (index, left), (_, right) in zip(ids_rows, ips_rows):
print(f'{index} | {left} | {right}')
print(f"IDS: ACL={ids['acl_denied']} alerts={ids['alerts']} delivered={ids['delivered']}")
print(f"IPS: ACL={ips['acl_denied']} blocked={ips['ips_blocked']} delivered={ips['delivered']}")
print(f"normal alerts={ids['normal_alerts']}; slow-probe events missed={ids['probe_without_alert']}")
print('host exception: wrong-order=permit; fixed-order=deny')
# 请求即便通过网络策略,业务层仍要隔离SQL结构与输入数据。
import sqlite3
con = sqlite3.connect(':memory:')
con.executescript("CREATE TABLE users(name TEXT); INSERT INTO users VALUES ('alice'),('bob');")
payload = "' OR 1=1 --"
unsafe = con.execute(f"SELECT name FROM users WHERE name='{payload}'").fetchall()
safe = con.execute('SELECT name FROM users WHERE name=?', (payload,)).fetchall()
assert unsafe == [('alice',), ('bob',)] and safe == []
print(f'application query: concatenated rows={len(unsafe)}; parameterized rows={len(safe)}')
con.close()
实跑输出:
event | IDS path | IPS path
1 | DELIVER | DELIVER
2 | DELIVER_ALERT | IPS_BLOCK
3 | DELIVER | DELIVER
4 | DELIVER | DELIVER
5 | ACL_DENY#1 | ACL_DENY#1
6 | ACL_DENY#0 | ACL_DENY#0
7 | ACL_DENY#0 | ACL_DENY#0
IDS: ACL=3 alerts=1 delivered=4
IPS: ACL=3 blocked=1 delivered=3
normal alerts=1; slow-probe events missed=2
host exception: wrong-order=permit; fixed-order=deny
application query: concatenated rows=2; parameterized rows=0
从输出逐项回到考点
**先检查流量守恒。**IDS路径是7条输入减去3条ACL拒绝,业务收到4条;IPS路径再减去1条检测阻断,业务收到3条。不能把“告警1次”直接当作“业务少收到1条”,也不能把ACL拒绝与IPS阻断重复计数。
再看规则顺序。.8同时属于整个/24网段。如果宽泛允许在前,首次匹配已经返回,后面的主机拒绝永远不会执行;具体拒绝在前才实现例外。这不等于“拒绝规则必须全部在允许前面”,仍应按完整策略安排优先级。
**最后核对误报和漏检。**第二条正常重试被告警,IPS甚至把它阻断,这是本例的误报代价;两个低频探测事件没有触发阈值,这是本例规则的漏检。这里的1和2只是合成数据中的事件数,不能冒充真实产品误报率或漏报率。
这些结果说明了设备职责的边界:ACL做来源和端口授权,IDS发现后能告警,IPS具备路径内阻断能力,实际效果仍取决于识别规则和部署。WAF观察HTTP语义、参数化查询隔离SQL数据与语法、动态ARP检测约束局域网映射,各自解决不同问题,不能只因都叫“防护”就互相替代。
对于出口带宽已被占满的DDoS,放在业务服务前的本地规则即便拒绝了请求,也不代表能恢复上游链路容量;这还涉及上游清洗、容量和部署位置。固定整数秒窗口、单来源计数、无连接状态也是本程序的明确局限。
网络层放行之后,应用层还要做什么
最后一行在内存数据库中复现同一个输入的两种处理。拼接字符串时,输入改变查询逻辑,返回alice、bob两行;绑定参数时,整个输入只被当成待匹配的名字,返回0行。这不是“参数化自动识别攻击”,而是SQL语句结构不再由这个数据值决定。
OWASP SQL注入防护指南明确建议将SQL结构和数据值分离,并绑定动态数据。表名、列名和排序方向等结构部分通常不能直接用值占位符代替,应使用应用控制的固定允许列表。WAF可以作为防护的一层,但不能替代代码中的参数绑定、最小权限和正确的业务授权。
IDS与IPS的架构和部署可以参考NIST SP 800-94《入侵检测与防御系统指南》。该文档发布于2007年,这里用作基础分类与部署依据,不把它当成当前产品特性清单。判断题目时,应分别确认数据是否可见、事件能否识别、设备是否位于流量路径内、是否配置阻断动作;“支持阻断”和“能准确识别所有攻击”是两个命题。
这也避免把IDS名称理解成绝对不能联动响应:旁路检测可以告警并联动其他组件处置,路径内预防可以直接丢弃流量。本文模型只固定两种动作来比较结果,真实产品功能和联动能力应以部署与配置为准。

六、临场排除顺序
先圈出题目问的是机密性、完整性还是可用性;再确定发生在局域网、网络边界、Web 应用还是浏览器;然后比较备选技术有没有相应的观察与处置能力;最后检查题目是否要求“能够阻断”“不能防御”“首要目标”。
最容易丢分的组合是“DoS 选成病毒”“IDS 自动等于阻断”“NAT 等于授权控制”“WAF 等于代码已经安全”“ARP 查远端网站的 MAC”。把这些边界分开,比多背几个名词更有用。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/derek1997/article/details/170546965



