Thursday, May 8, 2008, 8:38:56 AM, Peter wrote:
> Any thoughts on this? Does it fill a need or do most
recipe authors prefer
> to just handle their own substitutions on user-supplied
data?
I think it may be good to have a safe function.
How about a convenience function like this:
function FmtSafePageName($pagename, $fmt) {
$fmt =
str_replace('$','$',htmlspecialchars($fmt,
ENT_NOQUOTES));
return FmtPageName($fmt, $pagename );
}
(I reversed the arguments, as I always get confused with
FmtPageName
wanting pagename last, and all other functions want it
first)
You can test it with markup
# (:fmtsafe ....
Markup('fmtsafe','directives',
'/\(:fmtsafe\s(.*?):\)/ei',
" FmtSafePageName($pagename, PSS('$1') )");
compared to
Markup('fmttest','directives',
'/\(:fmttest\s(.*?):\)/ei',
" FmtPageName(PSS('$1'), $pagename )");
Example:
for instance with markup on page Main.TitleTest
(:title {$FullName}
1 {$Title}
2 (:fmtsafe {$Title}
3 (:fmtsafe $Title
4 (:fmttest {$Title}
5 (:fmttest $Title
resulted output is:
1 Main.TitleTest
2 Main.TitleTest
3 $Title
4 Main.TitleTest
5 Main.TitleTest
3 (:fmtsafe $Title shows the
defusing of a global variable as input.
Page variables and page text variables get rendered fine.
5 (:fmttest $Title
substitutes a global variable. Any global can be
shown with (:fmttest ...
Regards to the other issues raised by this topic:
I hope that initialization within functions and variable
substitutions
for capital first letter variables only in FmtPageName can
be
implemented for the PmWiki 2.2 release.
I also think that a less aggressive variable substitution
in
FmtPageName, using
foreach($g as $k => $v)
$fmt = preg_replace( "/\$k\b/", $v,
$fmt);
instead of
$fmt = str_replace(array_keys($g),array_values($g),$fmt);
is not really as inefficient in processing time as Patrick
thinks.
At least my stopwatch tests showed hardly a difference.
Finally i recommend replacing the (:title ... markup
with a safe
alternative which does not allow global var injections. At
the same
time we can change its behaviour, so that the first (:title
markup
always wins over subsequent (:title markups.
Here is my suggestion:
## (:title ... First
title wins, any subsequent (:title ... is
ignored.
Markup('title','directives',
'/\(:title\s(.*?):\)/ei',
"SetRelativeTitle($pagename, PSS('$1')) ");
function SetRelativeTitle ($pagename, $arg) {
static $tset = 1;
$arg =
str_replace('$','$',htmlspecialchars($arg,
ENT_NOQUOTES));
if ($tset==1)
PCache($pagename, $zz=array('title' =>
SetProperty($pagename, 'title', $arg )));
$tset++;
}
Hans
_______________________________________________
pmwiki-devel mailing list
pmwiki-devel pmichaud.com
http://www.pmichaud.com/mailman/listinfo/pmwiki-devel
|