用个小技巧,趁你不备,rm -rf你的电脑
摄影:产品经理
产品经理心心念念的荔枝小番茄
大家回想一下,你是不是遇到过这种情况:有时候,你访问一个网站,它突然给你下载了一个东西。特别是当你用 Chrome 的时候,浏览器直接就自动给你下载到“下载”文件夹里面去了,如下图所示:
而大多数时候,你只是把 Chrome 的这个提示关掉了,并没有去主动删除它下载的这个文件。于是这个自动下载的文件就留在了你的“下载”文件夹里面。
你想,我只要不去执行它,就不会有什么问题。但事实真的是这样吗?我们看看下面这张图。
python3 -m pip install requests
简单又熟悉的命令,我们都执行了无数次。今天却翻车了。电脑被格式化了。
问题出在哪里?问题出在这里:
当我们执行python3 -m pip install xxx
的时候,Python 会在你当前运行这个命令的文件夹下面寻找有没有一个叫做 pip.py
的文件。如果有这个文件的话,那么你执行python3 -m pip install xxx
相当于执行python3 pip.py install xxx
。如果这个pip.py
文件里面有恶意代码,那么你就翻车了。
恶意用户如果想攻击 Python 开发者,就可以自己做一个 Python 相关的网站,当用户访问网站的时候,悄悄下载一个 pip.py 到你的电脑上。如果有人碰巧在下载文件夹里面执行了 python3 -m pip install xxx
想安装某个库,那么此时就会触发恶意攻击代码,从而让你中招。
特别是遇到不会科学上网的用户,他们直接使用 pip 常常会出现网络超时的问题,于是恶意网站“友好”地给他们提供.whl
包的官方下载地址
。用户一看,是官方地址,放松了警惕。这样一来,用户用浏览器从官网下载这个包时,正好也是下载到了“下载”文件夹里面。于是很多用户顺理成章地,直接
cd ~/Downloads
python3 -m pip install xxx.whl
于是悲剧就发生了。
- 洛谷P1311 选择客栈
- 洛谷P1607 [USACO09FEB]庙会班车Fair Shuttle
- R语言抓包实战——知乎live二级页面获取
- 左手用R右手Python系列——面向对象编程基础
- 线性同余同余方程组解法(excrt)
- #19. 计数(容斥原理)
- 左手用R右手Python系列——多进程/线程数据抓取与网页请求
- #15. 钻石
- P1328 生活大爆炸版石头剪刀布
- ASP.NET MVC 5 Authentication Breakdown
- jquery easyui datagrid mvc server端分页排序筛选的实现
- 左手用R右手Python系列——使用多进程进行任务处理
- 2017.9.17校内noip模拟赛解题报告
- MySQL基础入门——MySQL与R语言、Python交互
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 3分钟短文:Laravel Carbon自定义日期时间格式
- (30)字符截取命令sed
- 2. Bean Validation声明式校验方法的参数、返回值
- 如何识别和阻止基于电报的僵尸网络
- 由String,String Builder,String Buffer 引起的面试惨案
- MySQL案例:各类临时文件的存放位置
- 关于加@Transactional注解的方法之间调用,事务是否生效的问题
- 基于Vue实现一个有点意思的拼拼乐小游戏
- 硬核手写字节码实现HelloWorld
- 由 go orm 引发的探索
- 为什么不建议在 for 循环里捕捉异常?
- 我就是想找个下标,怎么用到二分查找了?
- 利用Decorator和SourceMap优化JavaScript错误堆栈
- 【每日一题】43. Multiply Strings
- extjs 为组件动态添加插件