Changeset 1161
- Timestamp:
- 12/04/08 07:48:32 (3 years ago)
- Location:
- trunk
- Files:
-
- 3 edited
-
UnitTestContrib/test/unit/Fn_URLPARAM.pm (modified) (3 diffs)
-
core/data/System/VarURLPARAM.txt (modified) (2 diffs)
-
core/lib/Foswiki.pm (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/UnitTestContrib/test/unit/Fn_URLPARAM.pm
r816 r1161 55 55 '%URLPARAM{"foo" default="bar"}%', $this->{test_web}, $this->{test_topic}); 56 56 $this->assert_str_equals('', "$str"); 57 58 $this->{request}->param( -name=>'foo', -value=>'<evil script>\'\"%'); 59 $str = $this->{twiki}->handleCommonTags( 60 '%URLPARAM{"foo" default="bar"}%', $this->{test_web}, $this->{test_topic}); 61 $this->assert_str_equals('<evil script>'\"%', "$str"); 57 62 } 58 63 … … 62 67 my $str; 63 68 64 $this->{request}->param( -name=>'foo', -value=>' &?*!"');69 $this->{request}->param( -name=>'foo', -value=>'<>\'%&?*!"'); 65 70 $str = $this->{twiki}->handleCommonTags( 66 71 '%URLPARAM{"foo" encode="entity"}%', $this->{test_web}, $this->{test_topic}); 67 $this->assert_str_equals('&# 38;?*!"', "$str");72 $this->assert_str_equals('<>'%&?*!"', "$str"); 68 73 69 74 $this->{request}->param( -name=>'foo', -value=>'&?*!" '); … … 76 81 '%URLPARAM{"foo" encode="quote"}%', $this->{test_web}, $this->{test_topic}); 77 82 $this->assert_str_equals('&?*!\" ', "$str"); 83 84 $this->{request}->param( -name=>'foo', -value=>'<evil script>\'\"%'); 85 $str = $this->{twiki}->handleCommonTags( 86 '%URLPARAM{"foo" default="bar" encode="safe"}%', $this->{test_web}, $this->{test_topic}); 87 $this->assert_str_equals('<evil script>'\"%', "$str"); 88 89 $this->{request}->param( -name=>'foo', -value=>'<evil script>\'\"%'); 90 $str = $this->{twiki}->handleCommonTags( 91 '%URLPARAM{"foo" default="bar" encode="off"}%', $this->{test_web}, $this->{test_topic}); 92 $this->assert_str_equals('<evil script>\'\"%', "$str"); 93 94 $this->{request}->param( -name=>'foo', -value=>'<evil script>\'\"%'); 95 $str = $this->{twiki}->handleCommonTags( 96 '%URLPARAM{"foo" default="bar" encode="none"}%', $this->{test_web}, $this->{test_topic}); 97 $this->assert_str_equals('<evil script>\'\"%', "$str"); 78 98 } 79 99 -
trunk/core/data/System/VarURLPARAM.txt
r1022 r1161 10 10 | =default="..."= | Default value in case parameter is empty or missing | empty string | 11 11 | =newline="<br />"= | Convert newlines in textarea to other delimiters | no conversion | 12 | =encode="entity"= | Encode special characters into HTML entities. See [[%IF{"'%INCLUDINGTOPIC%'='Macros'" then="#"}%VarENCODE][ENCODE]] for more details. | no encoding | 13 | =encode="url"= | Encode special characters for URL parameter use, like a double quote into =%22= | no encoding | 14 | =encode="quote"= | Escape double quotes with backslashes (=\"=), does not change other characters; required when feeding URL parameters into other macros | no encoding | 12 | =encode="off"= <br /> =encode="entity"= <br /> =encode="safe"= <br /> =encode="url"= <br /> =encode="quote"= | Control how special characters are encoded <hr /> =off=: No encoding. Avoid using this when possible. See the security warning below. <hr /> =entity=: Encode special characters into HTML entities. See [[%IF{"'%INCLUDINGTOPIC%'='Macros'" then="#"}%VarENCODE][ENCODE]] for more details. <hr /> =safe=: Encode characters ='"<>= into HTML entities. <hr /> =url=: Encode special characters for URL parameter use, like a double quote into =%22= <hr /> =quote=: Escape double quotes with backslashes (=\"=), does not change other characters; required when feeding URL parameters into other macros. | "safe" | 15 13 | =multiple="on"= %BR% =multiple="[<nop>[$item]]"= | If set, gets all selected elements of a =<select multiple="multiple">= tag. A format can be specified, with =$item= indicating the element, e.g. =multiple="Option: $item"= | first element | 16 14 | =separator=", "= | Separator between multiple selections. Only relevant if multiple is specified | ="\n"= (new line) | … … 18 16 * __%X% Notes:__ 19 17 * URL parameters passed into HTML form fields must be entity [[%IF{"'%INCLUDINGTOPIC%'='Macros'" then="#"}%VarENCODE][ENCODEd]]. 20 * Double quotes in URL parameters must be escaped when passed into other macros.%BR% Example: =%<nop>SEARCH{ "%<nop>URLPARAM{ "search" encode="quote s" }%" noheader="on" }%=18 * Double quotes in URL parameters must be escaped when passed into other macros.%BR% Example: =%<nop>SEARCH{ "%<nop>URLPARAM{ "search" encode="quote" }%" noheader="on" }%= 21 19 * When used in a template topic, this macro will be expanded when the template is used to create a new topic. See TemplateTopics#TemplateTopicsVars for details. 22 20 * Watch out for internal parameters, such as =rev=, =skin=, =template=, =topic=, =web=; they have a special meaning in Foswiki. Common parameters and view script specific parameters are documented at CommandAndCGIScripts. 23 21 * If you have =%<nop>URLPARAM{= in the value of a URL parameter, it will be modified to =%<nop>URLPARAM{=. This is to prevent an infinite loop during expansion. 24 * There is a risk that this macro could be misused for cross-site scripting.22 * Security warning! Using URLPARAM can easily be misused for cross-site scripting unless specific characters are entity encoded. By default URLPARAM encodes the characters ='"<>= into HTML entities (same as encode="safe") which is relatively safe. The safest is to use encode="entity". When passing URLPARAM inside another macro always use double quotes ("") combined with using URLPARAM with encode="quote". For maximum security against cross-site scripting you are adviced to install the Foswiki:Extensions.SafeWikiPlugin. 25 23 * Related: [[%IF{"'%INCLUDINGTOPIC%'='Macros'" then="#"}%VarENCODE][ENCODE]], [[%IF{"'%INCLUDINGTOPIC%'='Macros'" then="#"}%VarSEARCH][SEARCH]], FormattedSearch, [[%IF{"'%INCLUDINGTOPIC%'='Macros'" then="#"}%VarQUERYSTRING][QUERYSTRING]] -
trunk/core/lib/Foswiki.pm
r1127 r1161 3867 3867 my $param = $params->{_DEFAULT} || ''; 3868 3868 my $newLine = $params->{newline}; 3869 my $encode = $params->{encode} ;3869 my $encode = $params->{encode} || 'safe'; 3870 3870 my $multiple = $params->{multiple}; 3871 3871 my $separator = $params->{separator}; … … 3897 3897 if ( defined $value ) { 3898 3898 $value =~ s/\r?\n/$newLine/go if ( defined $newLine ); 3899 if ($encode) { 3900 if ( $encode =~ /^entit(y|ies)$/i ) { 3901 $value = entityEncode($value); 3902 } 3903 elsif ( $encode =~ /^quotes?$/i ) { 3904 $value =~ s/\"/\\"/go 3905 ; # escape quotes with backslash (Bugs:Item3383 fix) 3906 } 3907 else { 3908 $value =~ s/\r*\n\r*/<br \/>/; # Legacy 3909 $value = urlEncode($value); 3910 } 3899 if ( $encode =~ /^entit(y|ies)$/i ) { 3900 $value = entityEncode($value); 3901 } 3902 elsif ( $encode =~ /^quotes?$/i ) { 3903 $value =~ s/\"/\\"/go 3904 ; # escape quotes with backslash (Bugs:Item3383 fix) 3905 } 3906 elsif ( $encode =~ /^(off|none)$/i ) { 3907 # no encoding 3908 } 3909 elsif ( $encode =~ /^url$/i ) { 3910 $value =~ s/\r*\n\r*/<br \/>/; # Legacy 3911 $value = urlEncode($value); 3912 } 3913 else { # safe or default 3914 # entity encode ' " < > and % 3915 $value =~ s/([<>%'"])/'&#'.ord($1).';'/ge; 3911 3916 } 3912 3917 }
Note: See TracChangeset
for help on using the changeset viewer.
