| Learning Objective | Essential Knowledge |
|---|---|
5.1.A |
|
5.1.B |
|
5.1.C |
|
保护应用与数据
AP 网络安全 · 第 5 主题
9:47
Securing Applications and Data
A company spent a fortune on firewalls, locked doors and strong passwords. Then somebody typed a few strange characters into a login box — and the database…
英文讲解 · 内嵌中英文字幕
5.1
应用与数据的漏洞与攻击
大纲
来源:美国大学理事会 AP 课程与考试说明
应用程序(applications)是在计算机上运行的程序,而数据是它们处理的——两者都是首要目标。若文件被未加密地存储,任何有访问驱动器权限的人都能读它们。若一个普通用户被给予管理性(administrative)权限,一个窃取那个账户的对手获得广泛的权力。
最大的应用危险是坏的用户输入。当一个程序不检查一个用户打什么时,一个对手能溜入命令——一个注入攻击(injection attack)。数据验证(data validation)(检查输入符合预期的规则)是防御。关键的攻击:
- SQL注入(SQL injection)——把 SQL 命令插入一个输入字段以读或改变一个数据库。
- 跨站脚本(XSS)(cross-site scripting)——把恶意脚本注入一个网站,它在另一个用户的浏览器里运行。
SQL 注入实际长什么样
SQL 是查询数据库的语言,它的控制词一律大写——SELECT、FROM、WHERE、IN、OR、AND。登录表单通常把你输入的内容直接拼进一条查询里:
SELECT * FROM users WHERE name = 'alice' AND password = 'secret'
攻击者在输入框里填的不是名字,而是 SQL。两个手法造成了大部分破坏:
- 一个恒真的条件。 输入
' OR '1'='1,WHERE子句对每一行都为真,于是数据库把所有用户都返回。 - 双横线,在 SQL 里表示注释的开始。 输入
admin' --会结束名字字符串,并把这一行余下的部分(包括密码校验)全部注释掉,查询变成… WHERE name = 'admin',攻击者不用密码就以管理员身份登录。
防御不是去过滤 SELECT 这个词,而是让输入根本不被当作代码:使用参数化查询(parameterised queries,也叫预处理语句),把查询和取值分别交给数据库、永不混在一起;再加上输入验证,拒绝该字段本来不该出现的字符。
- 缓冲区溢出(buffer overflow)——发送比一个内存缓冲区(buffer)能容纳的更多数据,所以它溢出到附近的内存并可能运行对手的代码。
- 目录遍历(directory traversal)——在一个 URL 里用
../序列以到达打算的文件夹之外的文件,例如/etc/passwd。
我们按敏感性给数据风险评级:未加密的军事计划是高风险;带一个弱密钥的客户数据是中等;带短密钥的低价值数据是低。
| 英文 | 中文 | 拼音 |
|---|---|---|
| Applications/ˌæplɪˈkeɪʃnz/ | 应用程序 | yìng yòng chéng xù |
| administrative/ədˈmɪnɪstrətɪv/ | 管理性 | guǎn lǐ xìng |
| injection attack/ɪnˈdʒekʃn əˈtæk/ | 注入攻击 | zhù rù gōng jī |
| Data validation/ˈdeɪtə ˌvælɪˈdeɪʃn/ | 数据验证 | shù jù yàn zhèng |
| Cross-site scripting (XSS)/krɒs saɪt ˈskrɪptɪŋ/ | 跨站脚本 | kuà zhàn jiǎo běn |
| parameterised queries/ˌpærəˈmetəraɪzd ˈkwɪərɪz/ | 参数化查询 | cān shù huà chá xún |
| Buffer overflow/ˈbʌfə ˌəʊvəˈfləʊ/ | 缓冲区溢出 | huǎn chōng qū yì chū |
| buffer/ˈbʌfə/ | 缓冲区 | huǎn chōng qū |
| Directory traversal/daɪˈrektəri træˈvɜːsl/ | 目录遍历 | mù lù biàn lì |
| SQL injection/ˌes kjuː ˈel ɪnˈdʒekʃn/ | SQL注入 | SQL zhù rù |
5.2
保护应用与数据:管理性控制与访问控制
大纲
| Learning Objective | Essential Knowledge |
|---|---|
5.2.A |
|
5.2.B |
|
5.2.C |
|
5.2.D |
|
来源:美国大学理事会 AP 课程与考试说明
数据按它的状态分类——静态数据(at rest)(存储在一个驱动器上)、传输中数据(in transit)(在设备之间移动),和使用中数据(in use)(正在被处理)。静态数据和传输中数据可以加密,这样窃取者也读不了;使用中数据必须解密,所以改由访问控制来守护它。
有些数据类型是受监管(regulated)的 —— 法律规定了它们必须如何存储、传输和处理 —— 所以组织必须让自己的控制措施匹配这些规则,以达到合规(compliance)。考试要你能把每种数据类型与管辖它的法律配对:
| 受监管数据 | 它是什么 | 管辖法律 |
|---|---|---|
| 个人身份信息(PII)(personally identifiable information) | 任何能识别一个人的信息:姓名、地址、社保号、生物特征、出生日期 | 《隐私法》(1974);针对 13 岁以下儿童的 COPPA |
| 受保护健康信息(PHI)(protected health information) | 健康、治疗和医疗付款记录 | HIPAA(1996) |
| 支付卡信息(PCI)(payment card information) | 卡号、有效期、CVV、持卡人姓名 | PCI-DSS |
收集受监管数据的组织必须给它贴标签,并制定政策,使其存储、传输和处理保持合规 —— 敏感度越高,所需的安全程度就越高。
访问控制(access control)决定哪些主体(subjects)(用户)可以对哪些对象(objects)(文件)执行哪些操作(operations)。四个模型:
- 基于角色的访问控制(RBAC)(role-based)——访问遵循你的角色(所有"会计"都能到达工资软件)。
- 基于规则的访问控制(RuBAC)(rule-based)——访问遵循条件(只在营业时间),层叠在另一个模型上。
- 自主访问控制(DAC)(discretionary)——一个文件的所有者(owner)决定谁还可以使用它。
- 强制访问控制(MAC)(mandatory)——一个中央管理员设定严格的级别;Bell-LaPadula 模型把它总结为"向上写、向下读"。

跨所有模型的一个指导思想是最小权限原则(principle of least privilege)——给每个实体恰好它需要的访问,不多。
在一个 Linux 系统上,每个文件有三个权限——读(r)、写(w)、执行(x)——对三个组:所有者(owner)、组(group),和其他人(others)。chmod 命令用数字设定它们,加 4(读)+ 2(写)+ 1(执行)。所以 chmod 640 意味着所有者读+写(6)、组读(4)、其他人什么都没有(0)。

Worked example. 一个主体想要只有她自己能读并编辑一个文件、她的员工组能读它,而没有其他人能碰它。读+写 = 4+2 = 所有者的 6、读 = 组的 4、什么都没有 = 其他人的 0,给出 chmod 640 file。列表然后显示 -rw-r-----。要也让所有者能作为一个程序运行这个文件,你会加执行(7 = 4+2+1),给出 chmod 740。
Which access-control model fits the rule?
Each access-control model has a different decider: RBAC by your role, RuBAC by a condition, DAC by the file's owner, and MAC by a central administrator's levels.
| 英文 | 中文 | 拼音 |
|---|---|---|
| at rest/æt rest/ | 静态数据 | jìng tài shù jù |
| in transit/ɪn ˈtrænsɪt/ | 传输中数据 | chuán shū zhōng shù jù |
| in use/ɪn juːs/ | 使用中数据 | shǐ yòng zhōng shù jù |
| regulated/ˈreɡjʊleɪtɪd/ | 受监管 | shòu jiān guǎn |
| compliance/kəmˈplaɪəns/ | 合规 | hé guī |
| personally identifiable information (PII)/ˈpɜːsənəli aɪˈdentɪfaɪəbl ˌɪnfəˈmeɪʃn/ | 个人身份信息 | gè rén shēn fèn xìn xī |
| protected health information (PHI)/prəˈtektɪd helθ ˌɪnfəˈmeɪʃn/ | 受保护健康信息 | shòu bǎo hù jiàn kāng xìn xī |
| payment card information (PCI)/ˈpeɪmənt kɑːd ˌɪnfəˈmeɪʃn/ | 支付卡信息 | zhī fù kǎ xìn xī |
| Role-based (RBAC)/rəʊl beɪst/ | 基于角色的访问控制 | jī yú jué sè de fǎng wèn kòng zhì |
| Rule-based (RuBAC)/ruːl beɪst/ | 基于规则的访问控制 | jī yú guī zé de fǎng wèn kòng zhì |
| Discretionary (DAC)/dɪˈskreʃənəri/ | 自主访问控制 | zì zhǔ fǎng wèn kòng zhì |
| Mandatory (MAC)/ˈmændətəri/ | 强制访问控制 | qiáng zhì fǎng wèn kòng zhì |
| principle of least privilege/ˈprɪnsɪpl ɒv liːst ˈprɪvɪlɪdʒ/ | 最小权限原则 | zuì xiǎo quán xiàn yuán zé |
5.3
用密码学保护存储的数据
大纲
| Learning Objective | Essential Knowledge |
|---|---|
5.3.A |
|
5.3.B |
|
来源:美国大学理事会 AP 课程与考试说明
密码学(cryptography)隐藏信息。一个加密(encryption)算法把明文(plaintext)与一个密钥(key)结合以产生密文(ciphertext);解密(decryption)逆转它。密钥空间(keyspace)是可能的密钥的数量——它越大,一个对手需要越长时间猜测。一个 n 位密钥有一个 $2^n$ 的密钥空间。
对称加密(symmetric encryption)使用相同的密钥来加密和解密。标准是 AES(高级加密标准),一个在 128 位块上工作的分组密码(block cipher),保护 Wi-Fi、浏览和存储的文件。因为两侧都需要相同的秘密密钥,安全地共享那个密钥是挑战。
Encrypt a message by shifting letters
Encryption combines plaintext with a key to make ciphertext. In this simple cipher the key is the shift amount; only someone who knows the shift can decrypt the message back.
| 英文 | 中文 | 拼音 |
|---|---|---|
| Cryptography/krɪpˈtɒɡrəfi/ | 密码学 | mì mǎ xué |
| plaintext/ˈpleɪntekst/ | 明文 | míng wén |
| key/kiː/ | 密钥 | mì yào |
| ciphertext/ˈsaɪfətekst/ | 密文 | mì wén |
| keyspace/ˈkiːspeɪs/ | 密钥空间 | mì yào kōng jiān |
| Symmetric encryption/sɪˈmetrɪk enˈkrɪpʃn/ | 对称加密 | duì chèn jiā mì |
| AES/ˌeɪ iː ˈes/ | 高级加密标准 | gāo jí jiā mì biāo zhǔn |
| block cipher/blɒk ˈsaɪfə/ | 分组密码 | fēn zǔ mì mǎ |
5.4
非对称密码学
大纲
| Learning Objective | Essential Knowledge |
|---|---|
5.4.A |
|
5.4.B |
|
5.4.C |
|
来源:美国大学理事会 AP 课程与考试说明
非对称加密(asymmetric encryption)用一个密钥对(key pair)解决密钥共享问题——一个任何人都可以看的公钥(public key)和一个保持秘密的私钥(private key)。这些密钥是数学的逆:无论一个锁上什么,只有另一个解锁。要给你发一个秘密,我用你的公钥加密,而只有你的私钥能解密它——所以我们从不必提前共享一个秘密。

更长的密钥意味着更大的密钥空间和更多的安全,但更慢的加密。常见的非对称算法是 RSA 和椭圆曲线密码学(ECC)(elliptic curve cryptography),用于数字签名和证书。记住:你只能在同一算法内比较密钥长度——一个 RSA 4096 位密钥不直接与一个 AES 256 位密钥可比。

| 英文 | 中文 | 拼音 |
|---|---|---|
| Asymmetric encryption/ˌeɪsɪˈmetrɪk enˈkrɪpʃn/ | 非对称加密 | fēi duì chèn jiā mì |
| key pair/kiː peə/ | 密钥对 | mì yào duì |
| public key/ˈpʌblɪk kiː/ | 公钥 | gōng yào |
| private key/ˈpraɪvət kiː/ | 私钥 | sī yào |
| elliptic curve cryptography (ECC)/ɪˈlɪptɪk kɜːv krɪpˈtɒɡrəfi/ | 椭圆曲线密码学 | tuǒ yuán qū xiàn mì mǎ xué |
5.5
保护应用
大纲
| Learning Objective | Essential Knowledge |
|---|---|
5.5.A |
|
5.5.B |
|
来源:美国大学理事会 AP 课程与考试说明
两个设计原则从一开始就保持应用安全。安全设计(secure by design)把安全建入开发的每个阶段,而不是作为一个事后的想法。默认安全(secure by default)意味着产品出厂时它的安全功能已经启用——开箱即安全。
安全设计建立在一家公司必须采纳的三个原则上:(1)为它的客户的安全结果负责,而不是把责任推给用户,(2)拥抱彻底的透明和问责——快速分享与安全相关的消息和更新,让每个人都更安全,以及(3)建立把安全作为头等目标的组织结构和领导力。
对抗注入攻击的关键防御是输入清理(input sanitization)。某些特殊字符(special characters)——单引号、双引号和分号——能被用来操纵一个系统,所以一个好的程序在处理之前移除或拒绝它们。清理同样地防御 SQL 注入、XSS 和目录遍历攻击。
| 英文 | 中文 | 拼音 |
|---|---|---|
| Secure by design/sɪˈkjʊə baɪ dɪˈzaɪn/ | 安全设计 | ān quán shè jì |
| Secure by default/sɪˈkjʊə baɪ dɪˈfɒlt/ | 默认安全 | mò rèn ān quán |
| input sanitization/ˈɪnpʊt ˌsænɪtaɪˈzeɪʃn/ | 输入清理 | shū rù qīng lǐ |
| special characters/ˈspeʃl ˈkærɪktəz/ | 特殊字符 | tè shū zì fú |
5.6
检测应用与数据攻击
大纲
| Learning Objective | Essential Knowledge |
|---|---|
5.6.A |
|
5.6.B |
|
5.6.C |
|
5.6.D |
|
5.6.E |
|
来源:美国大学理事会 AP 课程与考试说明
要检测数据攻击,系统执行审计记录(accounting)——记录谁在何时访问了什么。但日志非常庞大,所以日志分析必须自动化才能以有用的速度运行;靠人读原始日志太慢了。一个巧妙的补充是一个蜜罐(honeypot)——一个看起来有价值的假文件;因为没有人有真正的理由打开它,任何访问都是一个近乎即时的、清晰的攻击迹象。尤其要留意删除或复制敏感文件的企图。密码散列也帮助:重新散列一个文件并比较——若摘要改变了,文件被更改了。
选择检测控制意味着权衡成本(蜜罐便宜;一个数据泄露防护(DLP)(data loss prevention)服务强大但昂贵)与数据的敏感性。要从日志读一个具体的攻击,寻找它的特征:SQL 注入显示 OR 1=1 和 --;XSS 显示 <script> 标签;目录遍历显示 ../ 序列;一个缓冲区溢出显示异常长的输入字符串。
检查一个文件是否被改动过
密码学散列把任意大小的文件变成一个短的定长值。文件改动一个字节,散列就完全改变,所以把下载文件的散列与发布者列出的值比对,就能证明文件完好无损地到达。这是在命令行里做的:
| Shell | 命令 |
|---|---|
| BASH(Linux,以及大多数服务器) | sha256sum testfile |
| zsh,苹果电脑上常用的终端 | shasum -a 256 testfile |
两者都会打印 testfile 的 SHA-256 散列。如果它与公布的值哪怕差一个字符,这个文件就被改动过——可能是传输中损坏,也可能是攻击者把它替换掉了。
⚠️ 散列证明的是完整性,而不是真实性。能替换网页上文件的攻击者,通常也能替换旁边公布的散列;这正是为什么经过签名的散列,或通过另一条可信通道获取的散列,才是更强的证据。
| 英文 | 中文 | 拼音 |
|---|---|---|
| accounting/əˈkaʊntɪŋ/ | 审计记录 | shěn jì jì lù |
| honeypot/ˈhʌnɪpɒt/ | 蜜罐 | mì guàn |
| data loss prevention (DLP)/ˈdeɪtə lɒs prɪˈvenʃn/ | 数据泄露防护 | shù jù xiè lòu fáng hù |
5.6
考试技巧
- 把每个应用攻击匹配到它在一个日志里的证据:
OR 1=1/--= SQL 注入;<script>= XSS;../= 目录遍历;非常长的输入 = 缓冲区溢出。 - 按它们的决定者学四个访问控制模型:RBAC = 你的角色、RuBAC = 一个条件、DAC = 文件的所有者、MAC = 一个中央管理员。最小权限是它们全部的基础。
- 通过每组加 4+2+1 读 Linux 权限——
chmod 750= 所有者 rwx(7)、组 r-x(5)、其他人 none(0)。练习双向转换。 - 对称 = 一个共享密钥(快,AES);非对称 = 一个公钥/私钥对(解决密钥共享,RSA/ECC)。用接收者的公钥加密。
- 输入清理是防止注入攻击的单个最佳答案;一个蜜罐是经典的便宜的检测控制。
本主题的互动课程
逐步学习,并即时检测练习。