⌨️ 第六章 Web技术与安全
📄 本篇一句话

开源=源代码公开可看,但「免费拿」≠「随便用」——许可协议才是合同:GPL(传染式:用了就得开源)与 MIT/Apache(宽松:留个版权声明即可),商用前看一眼,能避免大事故。

📝 在本章的位置

上游:6-2 的库(你引用的每个库都有许可证)、6-16 的 GitHub(开源的大本营)。本课一路用过的 Python/SQLite/Bootstrap 全是开源——本篇讲清「可以白拿的条件」。

一、开源是什么、不是什么

开源(Open Source)=源代码公开,且许可证授予使用、研究、修改、再分发的权利。两个常见错觉: - 「开源=免费」——大多免费,但可以收费(服务、企业版、双许可);「自由软件」的 Free 是 freedom 不是 free beer。 - 「公开源码=随便用」——没写许可协议的代码默认保留所有权利(你看到了也不能合法复用);协议才是法律边界。

二、两大流派

Copyleft(传染式)——GPL 家族 - 条款:用了 GPL 代码的衍生作品,必须同样以 GPL 开源; - 「传染」:链接了 GPL 库的产品也得 GPL——商业闭源软件避之不及; - 代表:Linux 内核(GPLv2)、GCC。理念:自由要代代相传。

宽松派(Permissive)——MIT / BSD / Apache - 条款:几乎随便用(含商用闭源),只需保留版权与许可声明; - Apache 2.0 额外给专利授权与专利报复条款,企业友好; - 代表:MIT(jQuery、Bootstrap)、Apache 2.0(Kubernetes、Android 用的 Linux 内核修改版走 GPL 但 Google 用 Harmony 兜底——细节复杂,总之协议选型是商业决策)。

协议 商用闭源 修改后须开源 保留声明 专利授权
GPL ✗(衍生品须 GPL) ✓ ✓ ✗
MIT ✓ ✗ ✓ 无
Apache 2.0 ✓ ✗ ✓ ✓

三、工程实践三条

  1. 引用即审查:pip install 任何库先看许可证字段——MIT/Apache 放心用,GPL 问法务(尤其产品要闭源卖时)。
  2. 声明要留痕:宽松协议的唯一义务是保留声明——丢掉 LICENSE 文件就已经违约。
  3. 警惕「套壳违规」:拿 GPL 代码改个名当自家产品卖=违约可诉(历史判例不少);供应链攻击(6-19)也常从依赖这座桥进来。

动手 Demo:给自己的开源项目挑协议

# 决策小助手:回答三个问题,得到协议建议
def pick_license(closed_commercial, want_copyleft, want_patent_grant):
    if want_copyleft:
        return "GPL-3.0(传染式:衍生作品必须开源)"
    if closed_commercial:
        return "Apache-2.0(宽松+专利授权,企业友好)" if want_patent_grant \
               else "MIT(最简宽松)"
    return "MIT 或 CC0(近乎放弃权利,随便用)"

for case in (
    ("个人小工具想让大家随便用", False, False, False),
    ("公司库,产品要闭源,怕专利坑", False, False, True),
    ("坚持所有改进都要回馈社区",    False, True,  False),
):
    name, a, b, c = case
    print(f"{name} → {pick_license(a, b, c)}")

看到什么算成功:

个人小工具想让大家随便用 → MIT 或 CC0(近乎放弃权利,随便用)
公司库,产品要闭源,怕专利坑 → Apache-2.0(宽松+专利授权,企业友好)
坚持所有改进都要回馈社区 → GPL-3.0(传染式:衍生作品必须开源)

读结果:协议选择是意图声明——想约束别人就 GPL,想被广泛采用就 MIT/Apache;没有默认答案。

30 秒实验

随便打开一个你装过的 Python 包目录(或 pip show 包名)找 License 字段——多半是 MIT。再打开 GitHub 任一热门仓库,README 旁边就有许可证徽章——从今天起,装库前多看一眼这两个位置,习惯即成。

常见误区

自测三问(点击展开) 1. **Copyleft 的「传染」指什么?** 答:用 GPL 代码的衍生作品必须继续以 GPL 开源——自由条款随代码传播。 2. **MIT 协议下商用闭源的义务?** 答:仅保留版权与许可声明;无强制开源、无付费。 3. **没写许可协议的公开代码能不能用?** 答:默认保留所有权利——不能合法复用;想用得先联系作者或换有协议的。

相关笔记