@@ -150,6 +150,13 @@ Server.prototype.verify = function (req, upgrade, fn) {
150
150
return fn ( Server . errors . UNKNOWN_TRANSPORT , false ) ;
151
151
}
152
152
153
+ // 'Origin' header check
154
+ var isOriginInvalid = checkInvalidHeaderChar ( req . headers . origin ) ;
155
+ if ( isOriginInvalid ) {
156
+ req . headers . origin = null ;
157
+ return fn ( Server . errors . BAD_REQUEST , false ) ;
158
+ }
159
+
153
160
// sid check
154
161
var sid = req . _query . sid ;
155
162
if ( sid ) {
@@ -512,3 +519,61 @@ function abortConnection (socket, code) {
512
519
}
513
520
socket . destroy ( ) ;
514
521
}
522
+
523
+ /* eslint-disable */
524
+
525
+ /**
526
+ * From https://github.com/nodejs/node/blob/v8.4.0/lib/_http_common.js#L303-L354
527
+ *
528
+ * True if val contains an invalid field-vchar
529
+ * field-value = *( field-content / obs-fold )
530
+ * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ]
531
+ * field-vchar = VCHAR / obs-text
532
+ *
533
+ * checkInvalidHeaderChar() is currently designed to be inlinable by v8,
534
+ * so take care when making changes to the implementation so that the source
535
+ * code size does not exceed v8's default max_inlined_source_size setting.
536
+ **/
537
+ var validHdrChars = [
538
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , // 0 - 15
539
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , // 16 - 31
540
+ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , // 32 - 47
541
+ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , // 48 - 63
542
+ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , // 64 - 79
543
+ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , // 80 - 95
544
+ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , // 96 - 111
545
+ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , // 112 - 127
546
+ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , // 128 ...
547
+ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,
548
+ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,
549
+ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,
550
+ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,
551
+ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,
552
+ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,
553
+ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 // ... 255
554
+ ] ;
555
+
556
+ function checkInvalidHeaderChar ( val ) {
557
+ val += '' ;
558
+ if ( val . length < 1 )
559
+ return false ;
560
+ if ( ! validHdrChars [ val . charCodeAt ( 0 ) ] )
561
+ return true ;
562
+ if ( val . length < 2 )
563
+ return false ;
564
+ if ( ! validHdrChars [ val . charCodeAt ( 1 ) ] )
565
+ return true ;
566
+ if ( val . length < 3 )
567
+ return false ;
568
+ if ( ! validHdrChars [ val . charCodeAt ( 2 ) ] )
569
+ return true ;
570
+ if ( val . length < 4 )
571
+ return false ;
572
+ if ( ! validHdrChars [ val . charCodeAt ( 3 ) ] )
573
+ return true ;
574
+ for ( var i = 4 ; i < val . length ; ++ i ) {
575
+ if ( ! validHdrChars [ val . charCodeAt ( i ) ] )
576
+ return true ;
577
+ }
578
+ return false ;
579
+ }
0 commit comments