开源项目中的法律风险

2023-05-16

引言

写这篇博客的契机是我厂刚好开了一次这样的培训,听了以后觉得很有收获。碰巧自己最近也在写开源项目,因此觉得还是有必要写一下。

有小伙伴提到,这种问题,去网上找那个指导你如何选择 LICENSE 的图就好了。那个图能指导你选择正确的许可协议,但是并不会增进你对各个协议的了解。

本文里会通过几个例子让读者更能了解这些协议。

软件的分类

我们先来看看软件一共分为几种:

软件分类版权保护开放源码再分发修改
商业软件不一定××
开源软件
共有软件×不一定
微软的共享源码软件部分提供部分提供部分提供

这里特别提一下公有软件,指的是著作人去世后一段时间之后,例如 50 年后,这个软件就变成了共有软件,谁都可以用,谁都可以拿去卖,但是署名不能改。

微软共享代码软件指的是,向部分用户提供了源代码,也允许部分用户进行再分发等。

开源软件

开源软件又称自由软件,提倡的是:

  • FREE TO RUN
  • FREE TO STUDY
  • FREE TO REDISTRIBUTE
  • FREE TO IMPROVE

既然把源代码共享了,如何保护自己的权利呢?可以通过著作权法和商标法。

著作权

著作权法主要要求:

复制、分发、修改时,附上版权说明。

修改时,对修改部分进行明示。

需要明确的是,软件的思想、功能是受专利保护,而不受著作权法保护。

商标权

是否允许使用者使用你的商标。Linux、Apple、IBM等就是商标。

许可协议

许可协议是很常见的权益声明。许可协议数量多达 82 种,主要分为三类:

GPL: Copyleft 原则。给你足够的自由去修改,去再分发。类似的协议:AGPL、LGPL。对商业软件来说,这是一项非常危险的许可,下文详细会讲 GPL 协议相关的内容。

BSDL: 绝对的自由,允许授权者修改、再分发、甚至闭源。类似的协议:Apache、MIT。

MPL: 集开源之力为我所用。类似的协议: Apple、Sun、Nokia、IBM。

许可协议的兼容性

一个软件中可能会集成多个开源项目。如果这几个的开源项目的许可有所冲突,或跟软件主体的许可有所冲突,表明这些项目许可不兼容,是不能在一起用的。

GPL、Apache不能集成在一起,更不能以Apache发布。

示例

下面的例子都是关于上文提到的一类非常危险的协议:GPL 协议的。

GPL 类许可协议是对商业最危险的许可协议。它规定你可以私自修改,使用,但是不能发布。例如 MySQL,拿过来改,只能自己用,没有问题。但绝对不能闭源发布。如果你发布了,GPL 要求你要向用户提供源码,并且一定要使用 GPL 授权。

什么意思呢?如果一个库是 GPL 发布的,则任何使用这个库的程序,必须使用 GPL 授权,必须要向用户开放源代码。这是一种非常有传染性的许可协议。

下面就来看几个例子:

例0:Linux 和 Android

先来提一下这两个个例。Linux 是 GPL 协议开源的,这意味着用户可以修改,可以再分发,但必须要开源。

问题来了,许多 Linux 的驱动程序,他们使用了 Linux 系统的库,按照 GPL 许可协议,他们必须开源。但他们为什么可以闭源发布呢?

原因在于,Linux 本人在他的许可协议加上了一句话:凡是以调用内核形式访问代码的,不受 GPL 限制。

那么又说到安卓,安卓为了规避 GPL 许可的风险,做了非常大的努力:

组分许可
Linux kernelGPL-2.0
LibraryMIT BSD
RuntimeApache
FrameworkApache

上文提到了 Linux 使用的许可的特殊性,使安卓能把 GPL 协议限制在 kernel 层。上层全部采用了非 GPL 类许可,使厂商、用户可以闭源发布产品。只要这中间混进去了一个 GPL 库,那么这层以后的所有层,全部必须开源。包括大家开发的安卓App,也必须开源,这肯定是无法接受的。

通过 Linux 和 Android 的例子,大家一定对 GPL 的传染性有一定的概念。

例1:思科

思科开发自己的路由器时,对嵌入式 Linux 本身做了裁剪,最后安装在路由器里面发布了。

而 Linux 特殊的 GPL 许可只允许调用系统内核的情况下不受 GPL 限制,但修改源码是不行的。有一个理想主义组织,叫FSF,发现了这个情况后起诉了思科。

最终判决结果是,思科开源了代码,最终演变成了著名的openwrt。

例2:Hancom office

Hancom office 是一家韩国公司开发的一套 office 软件。这个软件集成了一套开源 PDF 解释器,Ghostscript。

这个 Ghostscript 呢,拥有两种协议。一种是免费协议,是 GPL。意味着你可以免费用他的库,但是许可协议是 GPL 协议,你发布的话也必须要开放你的源代码。另一种是商业许可协议,需要花钱购买,买了以后,你就可以闭源发布你的产品了。但该公司没有购买商业许可,用了免费的 GPL 许可,但是他闭源发布了他的产品。

所以最后的结果,你懂的。

上面是两个是比较常规的例子,下面来点刺激的。

例3:GPL和逆向

A 公司购买了 V 公司软件,进行反编译用来增加自己功能。V 公司发现后,起诉 A 公司的这种行为侵犯他们著作权。

但事情发生了转折,A 公司反过来起诉 V 公司,他们在逆向时候发现 V 公司使用了一个用 GPL 许可协议的开源库,但 V 公司没有开放产品的源代码。

判决结果,A 公司修改 V 公司软件是合法的。

风险规避

说了这么多,我们在做开源时如何才能规避风险呢?可以从以下几点考虑:

策略上。你为什么要开源,是为了让人随便用,到处都运行着你的代码,觉得很有成就感,还是为了其他目的。

权衡利弊,选择许可。

避免陷阱,对以下情况做限制:1、再分发要求。2、担保条款,免责条款。3、代码传染性。

定位什么人会用我的代码。

版权贡献者协议(CLA)。

最后,如果你需要更改你的开源项目的许可协议,你需要征得所有项目贡献者的同意。但如果在贡献项目以前,他们签署过版权贡献者许可协议(CLA),那么就意味着授权了版权给你,你可以不经过他们同意就修改许可协议。

结语

以上内容是依靠当场做的笔记写的,也有可能有错误,有疏漏,欢迎大家提出。

最后是一点个人建议,对于完成度比较高的工具类开源项目,GPL + 付费商业许可是比较好的选择。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

开源项目中的法律风险 的相关文章

  • Linux虚拟机下WWW(HTTP)服务器的搭建与使用(详细)

    1 简介 1 1 关于www服务器 WWW服务器是被动程序 xff0c 只有接收到互联网中其他计算机发出的请求后才会响应 xff0c 然后WWW服务器才会使用HTTP或者HTTPS将指导文件传输到客户机的浏览器上 1 2 关于HTTP协议
  • 非抢占式优先级调度算法

    Priority scheduling is a type of scheduling algorithm used by the operating system to schedule the processes for executi
  • Eclipse中使用jstl标签库

    在MyEclipse中使用jstl标签只需导读jstl jar就能使用 xff0c 但是在Eclipse中还需要一点小套路 步骤 xff1a 一 导入jstl jar 二 导入导入standard jar 三 web xml加上如下配置 l
  • hibernate HQL 投影查询 + 多表关联

    64 Test public void testQueryProjection Session session 61 HibernateUtils openSession session beginTransaction 操作 hql 默认
  • NetEQ 算法

    NetEQ 算法中集成了自适应抖动控制算法以及语音包丢失隐藏算法 这项技术使其能够快速且高解析度地适应不断变化的网络环境 xff0c 确保音质优美且缓冲延迟最小 研究的重点是 NetEQ 模块 xff0c 其中所涉及的处理过程包括抖动消除
  • 数组的形参与实参,通过引用传递数组

    数组形参 xff1a void printValues int void printValues int void printValues int 10 以上三种是等价的 通常 xff0c 将数组形参直接定义为指针要比使用语法定义更好 第三
  • java 简单员工管理系统

    package cn test import java io import java util class Emp 64 Override public String toString return 34 Emp empNo 61 34 4
  • 关闭虚拟机vmware自动挂起

    1 xff0c 桌面右键 属性 xff0c 里的屏幕保护程序 xff0c 选 无 2 xff0c 控制面板的电源选项 xff0c 方案为 一直开着 xff0c 具体选项选 从不关机 3 xff0c 在Windows 2003 Server点
  • GTK+2.0之初始学习篇(二)—— g_signal_connect宏解释及HelloWorld

    GTK 43 2 0中利用信号 回调函数机制来处理窗口外部传来的事件 消息或信号 以下实现的是单击窗口关闭按钮 xff0c 窗口自动关闭 在程序中调用了gtk main quit 函数实现退出主循环 include lt gtk gtk h
  • linux-----页、页表、页框(块)

    基本介绍 我们知道 xff0c 在linux操作系统中 xff0c CPU在执行一个进程的时候 xff0c 都会访问内存 但CPU并不是直接访问物理内存地址 xff0c 而是通过虚拟地址空间来间接的访问物理内存地址 所谓的虚拟地址空间 xf
  • CMake交叉编译配置

    罗列一下cmake常用的命令 CMake支持大写 小写 混合大小写的命令 1 添加头文件目录INCLUDE DIRECTORIES 语法 xff1a include directories AFTER BEFORE SYSTEM dir1
  • 8086CPU的14个寄存器全称

    通用寄存器 xff1a ax accumulate register 累加器 bx based register 基地址寄存器 cx count register 计数器 dx data registered 数据寄存器 段寄存器 xff1
  • 项目开发-后台管理框架

    开发中几乎的平台都需要一个后台管理 xff0c 但是从零开发一套后台控制面板并不容易 xff0c 幸运的是有很多开源免费的后台控制面板可以给开发者使用 xff0c 那么有哪些优秀的开源免费的控制面板呢 xff1f 我在 Github 上收集
  • 项目经理必备工具-个人推荐

    点击链接 项目经理必备工具 进入详细说明
  • 如何绕过CDN找源站ip?

    如何绕过CDN找源站ip xff1f 这是一个总结帖 xff0c 查了一下关于这个问题的国内外大大小小的网站 xff0c 对其中说的一些方法总结归纳形成 xff0c 里面具体发现ip的方法不是原创 xff0c 所有参考的原贴都也贴在了后面
  • Navicat修改MySQL数据库密码就是这么简单

    方法1 xff1a 用SET PASSWORD命令 首先登录MySQL 格式 xff1a mysql gt set password for 用户名 64 localhost 61 password 39 新密码 39 例子 xff1a m
  • Axure 元件库-原型

    元件名称 xff1a 1 Axure交互原型设计指南 rp 2 PC和移动原型常用元件 rp 3 后台模板 rp 4 全局说明 rp https pan baidu com s 1vmac 08MZAKj6qsdjwIZlg 提取码 xff
  • Node.js 通过http调用外部接口

    通过http request发送带参数的post请求 data xff1a 发送的内容 opt xff1a 描述将要发出的请求 data xff1a 事件在数据到达时被触发 end xff1a 请求结束时触发 error xff1a 发生错
  • 想成为出色的 CTO,你要具备这七大能力

    编者按 xff1a 首席技术官这一职位在20世纪80年代出现于美国 起于做很多技术研发的大公司 xff0c 如General Electric 主要职能是将科研成果转化实际效益 简单地说 xff0c 就是一个企业中技术的最高负责人 要扮演好
  • Keil中添加自己的头文件

    xfeff xfeff 方法一 在keil的开发环境下添加 xff1a 请注意上面的系统生成的头文件目录是 xff1a xff0c 即 dd jj pp kk xff0c 其中 是相对于项目文件 uvproj 而言的 其中 表示项目文件所在

随机推荐

  • http authorization 基本认证

    最近做的一个项目需要与其它系统对接接口 xff0c 对方提供的是webservice的接口 xff0c 并且需要Basic Authorization基本认证 xff0c 一开始都是用postman请求 xff0c 用户名和密码需要填在Ba
  • 终端命令安装 chrome for linux

    终端里安装chrome for linux 备注 xff1a 我是在Linux Mint 17 1 64位系统下安装的chrome for linux xff0c 其它Debian衍生版应该也是一样的 1 在终端里输入下载命令 xff1a
  • Arduino串口函数详解

    本文总结了Arduino常用串口操作函数 xff0c 函数说明部分来源于Arduino 官网串口使用指南 xff0c 示例与实验部分为自编 本文是对Arduino串口操作函数的较全面总结 xff0c 可作为工具贴查找使用 1 串口设置 xf
  • STM32CubeMX——霍尔编码器、L298N驱动电机

    前言 人生如逆旅 xff0c 我亦是行人 苏轼 临江仙 送钱穆父 目录 xff1a L298N电机驱动介绍编码器介绍电机介绍新建工程编写代码实验结果 一 L298N电机驱动介绍 B站 视频讲解 xff1a l298n电机驱动模块 电机正反转
  • AT命令拨电话,如何判断手机的状态?

    我使用AT命令拨电话 xff0c 如 xff1a ATD10086 我怎么知道我拨打的电话是否成功了呢 xff1f 比如SIM卡欠费了 xff0c 那么肯定算是没有拨通 xff1b 再比如网络有问题 xff0c 被叫方没有收到来电 xff0
  • GPS模块(GPS-NEO-6M)

    ATK NEO 6M GPS 模块简介 ATK NEO 6M V23 模块 xff0c 是 ALIENTEK 生产的一款高性能 GPS 模块 xff0c 模块核心采用 UBLOX公司的 NEO 6M 模组 xff0c 具有 50 个 通道
  • toCharArray()

    toCharArray 是将一个字符串内容转换为字符数组 xff0c 例如 String str 61 34 abc 34 System out println str toCharArray 43 34 34 将输出a b c 转载于 h
  • 基于Arduino的GPS数据解析程序

    这篇博客讲了我利用arduino来解析和转发原始nema 0813数据的思想和实现方法 因为arduino比较简单 xff0c 无法实现串口数据接收中断 xff0c 所以都写在主循环里面了 不知道代码存在何种缺陷和漏洞 xff0c 欢迎大家
  • VsCode安装和配置c/c++环境(超完整,小白专用)

    文章目录 1 vsCode配置C C 43 43 环境 1 vsCode下载和安装 1 下载Microsoft vsCode2 安装vsCode3 下载中文插件2 MinGW编译器下载和配置 1 下载MinGW2 下载后放到自己方便的目录
  • 各版本esp32和esp8266开发板引脚图(附各开发板特殊通信接口如IIC、SPI接口等默认引脚查看方法)

    目录 esp32 GPIO可用资源 1 esp32开发板 2 esp32开发板 查看特殊通信接口的方法 esp8266 esp32 GPIO可用资源 GPIO 6 11 连接到SPI Flash GPIO 34 39 只能作为输入且没有内部
  • GPS数据解析、可视化及经纬度距离计算

    一 GPS数据解析 根据NMEA协议 xff0c 我们从传感器上接收到的GPS经纬度数据格式如下 xff1a 例 xff1a GPRMC 024813 640 A 3158 4608 N 11848 3737 E 10 05 324 27
  • C语言知识点小结 | 指针 数组 结构体 堆栈 内存分配

    不掌握指针就是没有掌握C的精华 地址指向该变量单元 xff0c 地址即指针 在C C 43 43 语言中定义一个指针 xff0c 就是在栈区开辟一个内存空间用来存放它指向的内存地址 xff0c 然后给指针赋值 xff0c 就是把地址值赋值给
  • 西门子PLC S7-200SMART Modbus TCP通讯的步骤和要点

    Modbus TCP是一个非常传统 xff0c 应用广泛的通讯协议 xff0c 很多智能设备都支持该协议 西门子S7 200SMART及1200 1500系列都免费支持 xff08 300和400还是要高昂收费 xff09 xff0c 并且
  • GPRM/GNRMC定位信息的读取与解析

    GPRM GNRMC定位信息的读取与解析 参考网址 xff1a http www cnblogs com 88223100 p GPRM GNRMC Transform html 帧头 UTC时间 状态 纬度 北纬 南纬 经度 东经 西经
  • 基于Arduino 开发 MAX30102 LM35 SSD1306 观察血氧、心率和温度血氧仪

    本项目第一版本实现在arduino框架下通过MAX30102 对血氧和心率 进行实时监控 xff0c 通过LM35 对温度进行监控 所有数值在 ssd 1306 上进行显示 在血氧低过一定数值的时 xff0c 设备会通过蜂鸣器发出警报 第二
  • Python中max函数key的用法详解

    一 背景 起源于一个问题 xff1a 怎样找到字符串中出现次数最多的字符 其实使用max函数就能很轻松的解决这个问题 xff1a 代码 xff1a str1 61 34 AAAaaa8888899sssss 34
  • 查询选修了全部课程的学生姓名

    SELECT SN FROM S WHERE NOT EXISTS SELECT FROM C WHERE NOT EXISTS SELECT FROM SC WHERE SNO 61 S SNO AND CNO 61 C CNO 今天在看
  • Android11小黄鸟安装CA证书以及解决抓包没网问题

    目录 安装CA证书解决没网解决没有system读写权限 安装CA证书 首先没有CA证书是这个样子的 1 准备一个MT管理器 2 进入到 data data com guoshi httpcanary premium cache 目录找到Ht
  • libcurl异步方式使用总结

    原文链接 xff1a https www cnblogs com Newdawn p 10051231 html libcurl这个库的同步方式很简单 xff0c 不做介绍 xff0c 而异步方式很难理解 xff0c 本博客参考官网的dem
  • 开源项目中的法律风险

    引言 写这篇博客的契机是我厂刚好开了一次这样的培训 xff0c 听了以后觉得很有收获 碰巧自己最近也在写开源项目 xff0c 因此觉得还是有必要写一下 有小伙伴提到 xff0c 这种问题 xff0c 去网上找那个指导你如何选择 LICENS