@@ -897,9 +897,7 @@ <h1>template.js</h1>
897
897
898
898
< span class ="hljs-function "> < span class ="hljs-keyword "> function</ span > < span class ="hljs-title "> escapeChar</ span > (< span class ="hljs-params "> match</ span > ) </ span > {
899
899
< span class ="hljs-keyword "> return</ span > < span class ="hljs-string "> '\\'</ span > + escapes[match];
900
- }
901
-
902
- < span class ="hljs-keyword "> var</ span > bareIdentifier = < span class ="hljs-regexp "> /^\s*(\w|\$)+\s*$/</ span > ;</ pre > </ div > </ div >
900
+ }</ pre > </ div > </ div >
903
901
904
902
</ li >
905
903
@@ -910,6 +908,25 @@ <h1>template.js</h1>
910
908
< div class ="pilwrap ">
911
909
< a class ="pilcrow " href ="#section-4 "> ¶</ a >
912
910
</ div >
911
+ < p > In order to prevent third-party code injection through
912
+ < code > _.templateSettings.variable</ code > , we test it against the following regular
913
+ expression. It is intentionally a bit more liberal than just matching valid
914
+ identifiers, but still prevents possible loopholes through defaults or
915
+ destructuring assignment.</ p >
916
+
917
+ </ div >
918
+
919
+ < div class ="content "> < div class ='highlight '> < pre > < span class ="hljs-keyword "> var</ span > bareIdentifier = < span class ="hljs-regexp "> /^\s*(\w|\$)+\s*$/</ span > ;</ pre > </ div > </ div >
920
+
921
+ </ li >
922
+
923
+
924
+ < li id ="section-5 ">
925
+ < div class ="annotation ">
926
+
927
+ < div class ="pilwrap ">
928
+ < a class ="pilcrow " href ="#section-5 "> ¶</ a >
929
+ </ div >
913
930
< p > JavaScript micro-templating, similar to John Resig’s implementation.
914
931
Underscore templating handles arbitrary delimiters, preserves whitespace,
915
932
and correctly escapes quotes within interpolated code.
@@ -924,11 +941,11 @@ <h1>template.js</h1>
924
941
</ li >
925
942
926
943
927
- < li id ="section-5 ">
944
+ < li id ="section-6 ">
928
945
< div class ="annotation ">
929
946
930
947
< div class ="pilwrap ">
931
- < a class ="pilcrow " href ="#section-5 "> ¶</ a >
948
+ < a class ="pilcrow " href ="#section-6 "> ¶</ a >
932
949
</ div >
933
950
< p > Combine delimiters into one regular expression via alternation.</ p >
934
951
@@ -943,11 +960,11 @@ <h1>template.js</h1>
943
960
</ li >
944
961
945
962
946
- < li id ="section-6 ">
963
+ < li id ="section-7 ">
947
964
< div class ="annotation ">
948
965
949
966
< div class ="pilwrap ">
950
- < a class ="pilcrow " href ="#section-6 "> ¶</ a >
967
+ < a class ="pilcrow " href ="#section-7 "> ¶</ a >
951
968
</ div >
952
969
< p > Compile the template source, escaping string literals appropriately.</ p >
953
970
@@ -970,11 +987,11 @@ <h1>template.js</h1>
970
987
</ li >
971
988
972
989
973
- < li id ="section-7 ">
990
+ < li id ="section-8 ">
974
991
< div class ="annotation ">
975
992
976
993
< div class ="pilwrap ">
977
- < a class ="pilcrow " href ="#section-7 "> ¶</ a >
994
+ < a class ="pilcrow " href ="#section-8 "> ¶</ a >
978
995
</ div >
979
996
< p > Adobe VMs need the match returned to produce the correct offset.</ p >
980
997
@@ -985,18 +1002,34 @@ <h1>template.js</h1>
985
1002
source += < span class ="hljs-string "> "';\n"</ span > ;
986
1003
987
1004
< span class ="hljs-keyword "> var</ span > argument = settings.variable;
988
- < span class ="hljs-keyword "> if</ span > (argument) {
989
- < span class ="hljs-keyword "> if</ span > (!bareIdentifier.test(argument)) < span class ="hljs-keyword "> throw</ span > < span class ="hljs-keyword "> new</ span > < span class ="hljs-built_in "> Error</ span > (argument);
1005
+ < span class ="hljs-keyword "> if</ span > (argument) {</ pre > </ div > </ div >
1006
+
1007
+ </ li >
1008
+
1009
+
1010
+ < li id ="section-9 ">
1011
+ < div class ="annotation ">
1012
+
1013
+ < div class ="pilwrap ">
1014
+ < a class ="pilcrow " href ="#section-9 "> ¶</ a >
1015
+ </ div >
1016
+ < p > Insure against third-party code injection.</ p >
1017
+
1018
+ </ div >
1019
+
1020
+ < div class ="content "> < div class ='highlight '> < pre > < span class ="hljs-keyword "> if</ span > (!bareIdentifier.test(argument)) < span class ="hljs-keyword "> throw</ span > < span class ="hljs-keyword "> new</ span > < span class ="hljs-built_in "> Error</ span > (
1021
+ < span class ="hljs-string "> 'variable is not a bare identifier: '</ span > + argument
1022
+ );
990
1023
} < span class ="hljs-keyword "> else</ span > {</ pre > </ div > </ div >
991
1024
992
1025
</ li >
993
1026
994
1027
995
- < li id ="section-8 ">
1028
+ < li id ="section-10 ">
996
1029
< div class ="annotation ">
997
1030
998
1031
< div class ="pilwrap ">
999
- < a class ="pilcrow " href ="#section-8 "> ¶</ a >
1032
+ < a class ="pilcrow " href ="#section-10 "> ¶</ a >
1000
1033
</ div >
1001
1034
< p > If a variable is not specified, place data values in local scope.</ p >
1002
1035
@@ -1025,11 +1058,11 @@ <h1>template.js</h1>
1025
1058
</ li >
1026
1059
1027
1060
1028
- < li id ="section-9 ">
1061
+ < li id ="section-11 ">
1029
1062
< div class ="annotation ">
1030
1063
1031
1064
< div class ="pilwrap ">
1032
- < a class ="pilcrow " href ="#section-9 "> ¶</ a >
1065
+ < a class ="pilcrow " href ="#section-11 "> ¶</ a >
1033
1066
</ div >
1034
1067
< p > Provide the compiled source as a convenience for precompilation.</ p >
1035
1068
0 commit comments