Subversion,簡稱SVN,是一個開放源代碼的版本控制系統,相對于的RCS、CVS,采用了分支管理系統,它的設計目標就是取代CVS。互聯網上越來越多的控制服務從CVS轉移到Subversion。
Subversion的官方網站是:http://subversion.tigris.org/
中文的網站:Subversion中文站、SVNBook 正體中文版、Subversion中文社區、中文SVN技術資料。
這些網站都提供了非常詳細、多樣的說明文檔,有時間大家可以逐一細查。
Subversion使用服務端—客戶端的結構,當然服務端與客戶端可以都運行在同一臺服務器上。在服務端是存放著所有受控制數據的Subversion倉庫,另一端是Subversion的客戶端程序,管理著受控數據的一部分在本地的映射(稱為“工作副本”)。在這兩端之間,是通過各種倉庫存取層(Repository Access,簡稱RA)的多條通道進行訪問的。這些通道中,可以通過不同的網絡協議,例如HTTP、SSH等,或本地文件的方式來對倉庫進行操作。
安裝SVN
#yum install subversion
測試是否安裝成功
#svnserve --version
如果顯示了版本信息則表示安裝成功
創建倉庫
#svnadmin create /home/svn/repo
給svn設置密碼
修改配置文件/home/svn/repo/conf/svnserve.conf 去掉
#[general]
前面的#號
匿名訪問的權限,可以是read,write,none,默認為read
anon-access = none
認證用戶的權限,可以是read,write,none,默認為write
auth-access = write
密碼數據庫的路徑
#password-db = passwd
去掉前面的#
修改配置文件passwd
#vim /home/svn/repo/conf/passwd
=前面是用戶名,后面是密碼:
[users]
name = password
啟動SVN服務器
對于單個代碼倉庫
#svnserve -d -r /home/svn --listen-host 192.168.1.100
svn默認端口是3690,在防火墻上開放這個端口。
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 3690 -j ACCEPT
/sbin/service iptables save
把/var/www/html/目錄導入到svn的repo目錄下
svn import /var/www/html/ file:///home/svn/repo -m "test"
1、檢出(導出結果帶.svn文件夾的目錄樹)
svn co http://路徑 [本地目錄全路徑] --username 用戶名 --password 密碼
svn co svn://路徑 [本地目錄全路徑] --username 用戶名 --password 密碼
svn checkout http://路徑 [本地目錄全路徑] --username 用戶名
svn checkout svn://路徑 [本地目錄全路徑] --username 用戶名
如果不帶--password 參數傳輸密碼的話,會提示輸入密碼,建議不要用明文的--password 選項。 其中 username 與 password前是兩個短線,不是一個。 不指定本地目錄全路徑,則檢出到當前目錄下。
2、導出(導出一個干凈的不帶.svn文件夾的目錄樹)
svn export [-r 版本號] http://路徑 [本地目錄全路徑] --username 用戶名
svn export [-r 版本號] svn://路徑 [本地目錄全路徑] --username 用戶名
svn export 本地檢出的(即帶有.svn文件夾的)目錄全路徑 要導出的本地目錄全路徑
第一種從版本庫導出干凈工作目錄樹的形式是指定URL。 如果指定了修訂版本號,會導出相應的版本。 如果沒有指定修訂版本,則會導出最新的,導出到指定位置。 如果省略 本地目錄全路徑,URL的最后一部分會作為本地目錄的名字。 第二種形式是指定 本地檢出的目錄全路徑 到 要導出的本地目錄全路徑,所有的本地修改將會保留。 但是不在版本控制下(即沒提交的新文件,因為.svn文件夾里沒有與之相關的信息記錄)的文件不會拷貝。
現實的開發環境中,強烈建議使用導出功能svn export而不是svn co。
由此可能導致非常嚴重的問題,很多管理員直接吧svn co出來的代碼直接放到web目錄下。
這就使.svn隱藏文件夾被暴露于外網環境,黑客可以借助其中包含的用于版本信息追蹤的“entries”文件,逐步摸清站點結構。
更嚴重的問題在于,SVN產生的.svn目錄下還包含了以.svn-base結尾的源代碼文件副本(低版本SVN具體路徑為text-base目錄,高版本SVN為pristine目錄),如果服務器沒有對此類后綴做解析,黑客則可以直接獲得文件源代碼。
如果解析了該后綴,可能會有文件解析的漏洞,可能會有擴展解析漏洞,找地方上傳xxx.php.gif也許就可以直接得到webshell了。
如果已經線上的生產環境已經有了.svn目錄不想刪掉可以在服務器上設置禁制訪問此目錄:
另外svn更新至1.7+ .svn/entries目錄就不包含文件目錄列表了。
Apache:
<Directory ~ "\.svn">
Order allow,deny
Deny from all
</Directory>
Nginx:
location ~ ^(.*)\/\.svn\/ {
return 404;
}
附上個遍歷.svn/entries展現網站目錄結構的兩個腳本:
wooyun上也是已經有非常多的svn泄露網站信息的事件,有的甚至由此導致整個服務器淪陷:
WooYun: 【盛大180天滲透紀實】第四章.SVN獵手 (某站SVN信息泄露+設計問題導致服務器淪陷)
WooYun: 愛拍svn泄露,有被脫褲危險,想起了csdn....
參考: