@@ -11,6 +11,7 @@ package main
1111//go:generate depstubber -vendor go.uber.org/zap Logger,SugaredLogger NewProduction
1212
1313import (
14+ "bytes"
1415 "fmt"
1516 "log"
1617 "net/http"
@@ -378,8 +379,43 @@ func handlerGood2(req *http.Request) {
378379 log .Printf ("user %s logged in.\n " , escapedUsername )
379380}
380381
382+ // GOOD: The user-provided value is escaped before being written to the log.
383+ func handlerGood3 (req * http.Request ) {
384+ username := req .URL .Query ()["username" ][0 ]
385+ replacer := strings .NewReplacer ("\n " , "" , "\r " , "" )
386+ log .Printf ("user %s logged in.\n " , replacer .Replace (username ))
387+ log .Printf ("user %s logged in.\n " , replacerLocal1 (username ))
388+ log .Printf ("user %s logged in.\n " , replacerLocal2 (username ))
389+ log .Printf ("user %s logged in.\n " , replacerGlobal1 (username ))
390+ log .Printf ("user %s logged in.\n " , replacerGlobal2 (username ))
391+ }
392+
393+ func replacerLocal1 (s string ) string {
394+ replacer := strings .NewReplacer ("\n " , "" , "\r " , "" )
395+ return replacer .Replace (s )
396+ }
397+
398+ func replacerLocal2 (s string ) string {
399+ replacer := strings .NewReplacer ("\n " , "" , "\r " , "" )
400+ buf := new (bytes.Buffer )
401+ replacer .WriteString (buf , s )
402+ return buf .String ()
403+ }
404+
405+ var globalReplacer = strings .NewReplacer ("\n " , "" , "\r " , "" )
406+
407+ func replacerGlobal1 (s string ) string {
408+ return globalReplacer .Replace (s )
409+ }
410+
411+ func replacerGlobal2 (s string ) string {
412+ buf := new (bytes.Buffer )
413+ globalReplacer .WriteString (buf , s )
414+ return buf .String ()
415+ }
416+
381417// GOOD: User-provided values formatted using a %q directive, which escapes newlines
382- func handlerGood3 (req * http.Request , ctx * goproxy.ProxyCtx ) {
418+ func handlerGood4 (req * http.Request , ctx * goproxy.ProxyCtx ) {
383419 username := req .URL .Query ()["username" ][0 ]
384420 testFlag := req .URL .Query ()["testFlag" ][0 ]
385421 log .Printf ("user %q logged in.\n " , username )
0 commit comments