@@ -11,6 +11,7 @@ package main
11
11
//go:generate depstubber -vendor go.uber.org/zap Logger,SugaredLogger NewProduction
12
12
13
13
import (
14
+ "bytes"
14
15
"fmt"
15
16
"log"
16
17
"net/http"
@@ -378,8 +379,43 @@ func handlerGood2(req *http.Request) {
378
379
log .Printf ("user %s logged in.\n " , escapedUsername )
379
380
}
380
381
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
+
381
417
// 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 ) {
383
419
username := req .URL .Query ()["username" ][0 ]
384
420
testFlag := req .URL .Query ()["testFlag" ][0 ]
385
421
log .Printf ("user %q logged in.\n " , username )
0 commit comments