站点正在导入数据,暂时处于只读模式:这段时间里无法登录,也不能发帖或回复。
最近的评论
评论于2049增加Google验证码代码 额,忘了几个地方
前端html 增加
<script src='https://www.google.com/recaptcha/api.js'></script>后端golang部分
type JSONAPIResponse struct { Success bool `json:"success"` ChallengeTS time.Time `json:"challenge_ts"` // timestamp of the challenge load (ISO format yyyy-MM-dd'T'HH:mm:ssZZ) Hostname string `json:"hostname"` // the hostname of the site where the reCAPTCHA was solved ErrorCodes []int `json:"error-codes"` //optional }增加
json.Unmarshal(body, &APIResp) fmt.Println(APIResp)增加判断APIResp.Success 是true还是false 的代码就可以了
评论于2049增加Google验证码代码 安全可靠,小二可以自己比对下我的修改 @小二 如果有任何问题,都可以@我
评论于2049增加Google验证码代码 修改代码 https://github.com/Terminus2049/2049bbs/blob/df0914d35b4be3ccf6ae1e8da525b355dd54bd01/controller/user.go
登录的时候,访问 UserLogin 函数 修改如下
func (h *BaseHandler) UserLogin(w http.ResponseWriter, r *http.Request) { type pageData struct { PageData Act string Token string CaptchaId string } act := strings.TrimLeft(r.RequestURI, "/") title := "登录" if act == "register" { title = "注册" } tpl := h.CurrentTpl(r) evn := &pageData{} evn.SiteCf = h.App.Cf.Site evn.Title = title evn.Keywords = "" evn.Description = "" evn.IsMobile = tpl == "mobile" evn.ShowSideAd = true evn.PageName = "user_login_register" evn.Act = act token := h.GetCookie(r, "token") if len(token) == 0 { token := xid.New().String() h.SetCookie(w, "token", token, 1) } h.Render(w, tpl, evn, "layout.html", "userlogin.html") }提交代码修改如下
func (h *BaseHandler) UserLoginPost(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=UTF-8") token := h.GetCookie(r, "token") if len(token) == 0 { w.Write([]byte(`{"retcode":400,"retmsg":"token cookie missed"}`)) return } act := strings.TrimLeft(r.RequestURI, "/") type recForm struct { Name string `json:"name"` Password string `json:"password"` Response string `json:"g-recaptcha-response"` } type response struct { normalRsp } decoder := json.NewDecoder(r.Body) var rec recForm err := decoder.Decode(&rec) if err != nil { w.Write([]byte(`{"retcode":400,"retmsg":"json Decode err:` + err.Error() + `"}`)) return } defer r.Body.Close() if len(rec.Name) == 0 || len(rec.Password) == 0 { w.Write([]byte(`{"retcode":400,"retmsg":"name or pw is empty"}`)) return } nameLow := strings.ToLower(rec.Name) if !util.IsUserName(nameLow) { w.Write([]byte(`{"retcode":400,"retmsg":"name fmt err"}`)) return } // did we get a proper recaptcha response? if null, redirect back to sigup page if rec.Response == "" { // user press submit button without passing reCAPTCHA test // abort http.Redirect(w, r, "/", 301) return // return control to stop execution, otherwise it will continue } // get end user's IP address remoteip, _, _ := net.SplitHostPort(r.RemoteAddr) fmt.Println("remote ip : ", remoteip) // to verify if the recaptcha is REAL. we must send // secret + response + remoteip(optional) to postURL secret := "[你的 secret key]" postURL := "https://www.google.com/recaptcha/api/siteverify" postStr := url.Values{"secret": {secret}, "response": {rec.Response}, "remoteip": {remoteip}} responsePost, err := http.PostForm(postURL, postStr) if err != nil { fmt.Println(err) return } defer responsePost.Body.Close() body, err := ioutil.ReadAll(responsePost.Body) if err != nil { fmt.Println(err) return } // this part is for server side verification var APIResp JSONAPIResponse json.Unmarshal(body, &APIResp) fmt.Println(APIResp) db := h.App.Db timeStamp := uint64(time.Now().UTC().Unix()) if act == "login" { bn := "user_login_token" key := []byte(token + ":loginerr") if db.Zget(bn, key).State == "ok" { // todo //w.Write([]byte(`{"retcode":400,"retmsg":"name and pw not match"}`)) //return } uobj, err := model.UserGetByName(db, nameLow) if err != nil { w.Write([]byte(`{"retcode":405,"retmsg":"json Decode err:` + err.Error() + `","newCaptchaId":"` + captcha.New() + `"}`)) return } if uobj.Password != rec.Password { db.Zset(bn, key, uint64(time.Now().UTC().Unix())) w.Write([]byte(`{"retcode":405,"retmsg":"name and pw not match","newCaptchaId":"` + captcha.New() + `"}`)) return } sessionid := xid.New().String() uobj.LastLoginTime = timeStamp uobj.Session = sessionid jb, _ := json.Marshal(uobj) db.Hset("user", youdb.I2b(uobj.Id), jb) h.SetCookie(w, "SessionID", strconv.FormatUint(uobj.Id, 10)+":"+sessionid, 365) } else { // register siteCf := h.App.Cf.Site if siteCf.CloseReg { w.Write([]byte(`{"retcode":400,"retmsg":"stop to new register"}`)) return } if db.Hget("user_name2uid", []byte(nameLow)).State == "ok" { w.Write([]byte(`{"retcode":405,"retmsg":"name is exist","newCaptchaId":"` + captcha.New() + `"}`)) return } userId, _ := db.HnextSequence("user") flag := 5 if siteCf.RegReview { flag = 1 } if userId == 1 { flag = 99 } uobj := model.User{ Id: userId, Name: rec.Name, Password: rec.Password, Flag: flag, RegTime: timeStamp, LastLoginTime: timeStamp, Session: xid.New().String(), } // 从指定的用户中随机选一个头像作为新注册用户头像 // 指定用户必须连续,取最小id和最大id rand.Seed(time.Now().UnixNano()) min := siteCf.AvatarMinId // 2539 max := siteCf.AvatarMaxId // 2558 sampleID := rand.Intn(max-min+1) + min uidStr := strconv.FormatUint(uint64(sampleID), 10) uobj.Avatar = uidStr uobj.IgnoreLimitedUsers = true jb, _ := json.Marshal(uobj) db.Hset("user", youdb.I2b(uobj.Id), jb) db.Hset("user_name2uid", []byte(nameLow), youdb.I2b(userId)) db.Hset("user_flag:"+strconv.Itoa(flag), youdb.I2b(uobj.Id), []byte("")) h.SetCookie(w, "SessionID", strconv.FormatUint(uobj.Id, 10)+":"+uobj.Session, 365) } h.DelCookie(w, "token") rsp := response{} rsp.Retcode = 200 json.NewEncoder(w).Encode(rsp) }评论于征集antispam方案 @Shiro #55 标准HTTP就不带Mac地址,而且这个不是唯一可以伪造。还违背了匿名承诺
评论于征集antispam方案 @hello _chris #52 https://www.socketloop.com/tutorials/golang-recaptcha-example
我觉得这个说的很清楚,晚上我改个demo发出来,我觉得小二自己可以搞定的
评论于致管理员 不觉得敏感词就一定是政治审核。隔壁有些人,他们就是来树洞参观的,从不发帖子,你让他们注册写什么,自我介绍么?
如果小二觉得人少,人肉审核可以接受,那我觉得对注册方而言,要等很久才可能知道自己注册成功了,可能就没意思了,谁注册不是一时兴起呢?
评论于征集antispam方案 我觉得品葱管理员不应该干涉2049内政,如果参与讨论应该以2049用户身份。
应该使用敏感词系统,YouTube也有黄标,这个是正常网站运营的正常手段。可以根据各个时期增加删除。不应该因为共产党用了这个技术就排斥这个技术。
共产党控制下也有医院,难道医院就是邪恶的么?
技术不存在正邪之分,完全取决于怎么用和为什么用?
小号属于合法行使自己的言论自由,不应该因为是小号被禁,而应该取决于言论是不是符合2049的理性讨论注册申明。
评论于总统应该取消两届八年的任期限制 @陈士杰 #16 我在11楼表达了我的理解,管理国家的是一个团体。这个团体不一定叫党。比如朱元璋成立明朝。他没有管自己那个团体叫党,但他代表了那个利益集团。我觉得只是现代化社会,人类社团组织形式得到了进化,党成为了现代化政治的标准
评论于话说,国内现在网文感觉没以前有活力了,怎么回事? Google搜中文都已经是垃圾了,应该说中文已经被污染了。不止网文
评论于biteinside是品葱站长不是小二 @BE4 #5 好吧
评论于关于2049被恐怖袭击的声明 @Hker #22 前辈保重~
评论于关于2049被恐怖袭击的声明 @rebecca #19 我说了啊,大学才学的编程。工商管理也不好找工作的,化学也没有好到哪里去。我在品葱被封了,才跑这里的,不会回品葱的了
评论于关于2049被恐怖袭击的声明 @rebecca #19
https://2049bbs.xyz/t/3845
前辈可以看看这个帖子的20楼,merlin前辈读phd,也没用过我说的那两个软件
我觉得应该毕业无望了,,,
评论于关于2049被恐怖袭击的声明 @rebecca #16 我上大学才开始学编程。但是我在高一就注册了v2ex。所以我已经在v2ex混了7年了~
我学的工商管理,很简单的,反而她的化学我觉得难的可怕,我高数学的不差,微积分也很好,但是她课本里的数学公式和符号都是我不曾见过的!其实她成绩很好的,只是编程没有怎么实战。她让我帮忙写写代码而已。
我专门搜了psi4和pyscf的api文档和demo来看,果然不是web的crud级别的,根本看不懂!
她估计会跟我回老家找工作,不是她的问题,而是化学专业找工作不容易罢了!
评论于关于2049被恐怖袭击的声明 @rebecca #11 别和他理论了,他不去安慰熊熊,处处针对你,把脏水都泼你身上,有机会就排挤你。
现在最重要的是保护好熊熊,安抚她受伤的心,而不是去借题发挥攻击其他人。
他连这点情商都没有。你和他浪费感情干嘛
评论于关于2049被恐怖袭击的声明 @rebecca #13 不不不,化学那块,不论是你还是我,都不可能半个星期搞定。他们的化学课不是高中那种过家家。难得我觉得很恐怖的。最起码,我不知道化学里的共轭是个什么鬼!这一切化学的东西都是她自己搞定,我们只要敲代码实现就可以了。她导师给的估计是大概要4/5千行就可以了。我们应该可以搞定的。
我和她没钱,我们两个自己搞定吧,不找你了
评论于征集antispam方案 恐怖分子,它是一个个自己人工注册的,不是写脚本批量注册。现在通过限制注册的方式,对恐怖分子无效,缘木求鱼!
更多应该是识别出这个账号是恐怖分子!最简单的办法,就是敏感词。
个人认为,像“肉棒”这个词汇,明显不是合理词汇,有这类词汇就自动转垃圾区,就可以了。
评论于关于2049被恐怖袭击的声明 @rebecca #9 我是工商管理,她是化学。她答辩,我负责写代码帮她。但是这东西我也不会,她学的化学难的要死,我反正看不懂
评论于站内提醒能不能搞个不读了睡大觉(一键全部已读) 你可以自己改代码,开源的
评论于征集antispam方案 大神,我觉得限制注册的手段没用!因为这次捣乱分子是活人注册。如果你能拦住它注册,也就是拦住了普通人类注册。
还是和隔壁品葱一样,增加敏感词吧。发出未成年不宜的词汇,就自动发到垃圾区。这个开发量,对你来说最小,也最简单。
评论于关于2049被恐怖袭击的声明 @rebecca #4 你放心好了,这里不是品葱。共产党没有盯上这里。我也从来没有说过反动的话,国安顶不上我们的
评论于关于2049被恐怖袭击的声明 rbc前辈,你现在回品葱又能如何?不如留下来?
晚辈下周就要入职上班了,我还能陪你半个星期!
晚辈希望,这半个星期,我们两个可以完成《聚乙烯吡咯烷酮 与含-COOH官能团的分子间π interaction的能量成分分析》论文,基于Psi4 或者 PySCF开发!这个关系到晚辈的女友能不能本科毕业!我希望她顺利毕业后我们两个人结婚~
评论于关于2049被恐怖袭击的声明 算了,你在品葱已经混不下去了。留下来陪我好了
评论于【转载】找出不同的硬币 @饱读书名 #10 你说的对
评论于总统应该取消两届八年的任期限制 @陈士杰 #12 前辈,我的理念是这样的。首先,政党的注册参考结婚制度。退党和解散,走离婚制度。无党派当总统的例子我没见过。
其实我脑子里整个流程很复杂,打好多字,不想打。
实际上无党派总统根本不可能,这就好比你去装修房子,找个人不是公司,你不要售后了?
评论于疫情影响下的中国,失业非常严重,没人敢消费 @南半球怎么了 #10 别人不说,我是刚毕业,连找工作都难,发钱以后,我还是没工作。有什么意思
评论于总统应该取消两届八年的任期限制 我觉得,管理国家的本来就不是一个人。应该是一个团体,某些人管这个叫政党。我觉得限制政党连任才对,一个政党最多连任16年。总统不过是临时代表了这个政党。类似企业法人
评论于流量跟踪码是什么,有什么危害,是否等同于钓鱼 @BE4 #13 前辈,我英语不好。不会发英语帖子。。。
能不能前辈翻译好以后发过去。我自己会订阅问题,有了答复自己看,就不劳烦前辈翻译了。
评论于流量跟踪码是什么,有什么危害,是否等同于钓鱼 @BE4 #12 好吧,前辈。我用Charles抓包分析下看看。我对cnbeta比较感兴趣。拿它练手了!
代码我看不懂的,我只会Java,不会JavaScript!我只是工商管理毕业!
评论于流量跟踪码是什么,有什么危害,是否等同于钓鱼 @BE4 #10 我有好多问题啊,为什么Tor浏览器集成了noscript却不集成uBlockOrigin?为什么不同网站的同一个跟踪码可以生存同一个跟踪ID,还有这个跟踪ID是如何产生的?如果我在win10下,一直每隔20分钟切换一个沙盒,那么是不是每20分钟一个跟踪ID?会重复么?我觉得沙盒比虚拟机好用很多,跑在内存上,类似docker
评论于从B站的av到BV说起~ @小二 #9 小二大神,如果是单纯加标记,是无法做到后面的0和验证是无法获取标记的,所以这段逻辑肯定很复杂。还是要严谨。前辈不用睡觉么,我刚起床
评论于从B站的av到BV说起~ @小二 #6 我看完你发的文档了,有一个问题是我不理解的。椭圆曲线加密的是整型数据,但是货币是浮点型的。我想了解下这个过程是如何转换的。这个文档里没有找到,我打算去看看源码实现研究下。另外它的抗ASIC特性,是值得我去研究的。其中nocgo和cgo实现也需要我重点阅读。我对go语言支持simd感觉到很不可思议。这段时间我会花大量时间研究这个开源项目。我在大学学的是公司管理,学校要求我们学习Java。我自己无聊把Java虚拟机源码略读过一遍,重点全放在Java虚拟机如何自己生成simd代码,支持Intel的avx2指令集。还去看了一些jvm加速技术,比如pgo加速。也看了Java虚拟机的tls实现,所以对椭圆加密算法已经比较熟了
评论于流量跟踪码是什么,有什么危害,是否等同于钓鱼 前辈,我不理解,在墙内部署Google,Facebook等公司的跟踪码,Google和Facebook能获取到收集的数据么?
不能的话,为什么有站长部署呢?这个部署了,会有什么后果?如何工作?原理是什么?代码在哪里?是不是可以找一个跟踪码,分析下源码,告诉我,都采集了什么,如何实现,原理,最后采集的数据发到哪里?
评论于疫情影响下的中国,失业非常严重,没人敢消费 @1200073 #8 现在的问题,是瘟疫导致没有消费动力,生产停止,失业问题。发钱,还是买不到东西,没有恢复生产。现在应该是解决需求
评论于中文互联网中“讨论”的消亡 @饱读书名 #31 如果都是锥形,也有ipv6,对ipv6做nat的很稀有
评论于给自己发个树洞帖子,方便之后来树洞,之前都没怎么来过 你直接添加到收藏夹就行了
这里基本都是吵架,进来纯属浪费时间。
我也要赶论文去了。。。
评论于【转载】找出不同的硬币 @饱读书名 #8 在我看来,比较轻和比较重不是一样么?
评论于从B站的av到BV说起~ @小二 #6 我学过TLS 的椭圆曲线算法,包括secp256。我看你发来的文档了,基本可以接受!明天继续阅读。
但是我更感兴趣的是基于CKKS算法的零知识证明。不过为了和小二大神交流,我可以暂缓自己的目标,先学习grin coin的源码和设计思想
评论于从B站的av到BV说起~ @小二 #1 我最近在BE4前辈的网站,学习区块链技术的零知识证明,感觉很有兴趣。IPFS应该不存在零知识证明技术,和我的学习目的差距太大了。还是谢谢小二大神的推荐。我个人觉得BE4前辈,人挺好的,技术也很牛逼,为什么和小二大神矛盾如此巨大?
评论于【转载】找出不同的硬币 又写错了
$ C_{11}^2$
评论于【转载】找出不同的硬币 写错了
$ C_11^2 = 55 $