当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。
攻击者可以利用该漏洞下载git文件夹里的所有内容。如果文件夹内有敏感信息比如站点源码、数据库账户密码等,攻击者可能直接控制服务器。
Git作为大家熟悉的,深受欢迎的版本控制工具,和其他同类工具有很多不同之处:
Git 有三种状态,你的文件可能处于其中之一:已修改(modified)、已暂存(staged)、已提交(committed)。由此引出三个逻辑区域,他们和文件状态以及部分对应操作的关系如下图。
Git对象
在Git系统中有四中类型的对象,所有的Git操作都是基于这四种类型的对象。
SHA1哈希值
在Git系统中,每个Git对象都通过哈希值来代表这个对象。哈希值是通过SHA1算法计算出来的,长度为40个字符(40-digit)。
.git目录
对照这张图来理解两段提交,工作区(working tree),暂存区(stage/index)和 branch之间的关系
git ls-files -u
显示冲突的文件,-s
是显示标记为冲突已解决的文件
git diff
对比工作区和stage文件的差异
git diff --cached
对比stage和branch之间的差异
git ls-files --stage
检查保存在stage的文件
git log
显示到HEAD所指向的commit为止的所有commit记录 。
git reset HEAD <file>
git reset --hard HEAD
放弃工作区和index的改动,HEAD指针仍然指向当前的commit.
git init
此命令初始化一个新本地仓库,它在工作目录下数据目录生成一个名为.git的隐藏文件夹。git会将所有的文件,目录,提交等转化为git对象,压缩存储在这个文件夹当中。
git init 命令后面不加参数表示把当前目录变为仓库,如下表示在当前目录下创建test仓库
git add
创建一个test1.txt文件,git status
查看当前状态,此时test.txt文件位于工作目录
通过git add跟踪这个文件,把test.txt文件放到暂存区
.(可以使用git rm --cached
命令来取消暂存)
git commit
在暂存区的文件使用git commit提交到版本库(数据目录
)中
-m参数表示提交的注释,如果不使用-m参数那么会跳出页面提示主动输入注释
修改test.txt文件
修改后,通过查看git status可以看到文件状态被改变了。根据提示知道文件已被修改,但是未提交修改到版本库中。
git diff
,对比工作区和暂存区文件的差异,查看文件被修改的地方
确认修改无误后提交到版本库的方法和提交初始文件一样,需要先提交到暂存区,然后提交到版本库.
再修改一次文件
提交
git log
查看下历史记录,HEAD我的理解就是指针,指到最后提交的版本
git reset --hard
,回退版本
回退到上一个版本,gei reset --hard HEAD^
厉害了,可以看到HEAD指针也指到了第一次修改的版本,第二次修改的版本看不到了
但是我要是因为操作失误怎么追回地二次修改的版本呢,可以使用git reset --hard 版本号
追回
git reflog
获取版本号,得到第二次修改版本号为5edcc89
get reset --hard 5edcc89
恢复
我后面测试使用comit后面一串很长的字符,这里理解为对象sha1字符串吧.也可以回退到那个版本
可以把工作区修改的文件git add提交到暂存区,也可以使用git checkout — test1.txt 把工作区的修改撤销,这样,文件就会回退到上一次提交时的状态。
.git
文件夹下的文件,还原重建工程源代码.git/index
文件,找到工程中所有的(文件名,文件sha1).git/objects
文件夹下下载对应的文件zlib
解压文件,按原始的目录结构写入源代码GitHack会按照上面的原理自动恢复
参考:https://www.zhihu.com/tardis/sogou/art/30044692