You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

204 lines
6.1 KiB

<?php
/**
* Escaping Functions
*
* @package OpenEMR
* @link https://www.open-emr.org
* @author Boyd Stephen Smith Jr.
* @author Brady Miller <brady.g.miller@gmail.com>
* @copyright Copyright (c) 2011 Boyd Stephen Smith Jr.
* @copyright Copyright (c) 2018 Brady Miller <brady.g.miller@gmail.com>
* @license https://github.com/openemr/openemr/blob/master/LICENSE GNU General Public License 3
*/
/**
* Escape a javascript literal.
*/
function js_escape($text)
{
return json_encode($text);
}
/**
* Escape a javascript literal within html onclick attribute.
*/
function attr_js($text)
{
return attr(json_encode($text));
}
/**
* Escape html and url encode a url item.
*/
function attr_url($text)
{
return attr(urlencode($text ?? ''));
}
/**
* Escape js and url encode a url item.
*/
function js_url($text)
{
return js_escape(urlencode($text));
}
/**
* Escape variables that are outputted into the php error log.
*/
function errorLogEscape($text)
{
return attr($text);
}
/**
* Escape variables that are outputted into csv and spreadsheet files.
* See here: https://www.owasp.org/index.php/CSV_Injection
* Based mitigation strategy on this report: https://asecurityz.blogspot.com/2017/12/csv-injection-mitigations.html
* 1. Remove all the following characters: = + " |
* 2. Only remove leading - characters (since need in dates)
* 3. Only remove leading @ characters (since need in email addresses)
* 4. Surround with double quotes (no reference link, but seems very reasonable, which will prevent commas from breaking things).
* If needed in future, will add a second parameter called 'options' which will be an array of option tokens that will allow
* less stringent (or more stringent) mechanisms to escape for csv.
*/
function csvEscape($text)
{
// 1. Remove all the following characters: = + " |
$text = preg_replace('/[=+"|]/', '', $text);
// 2. Only remove leading - characters (since need in dates)
// 3. Only remove leading @ characters (since need in email addresses)
$text = preg_replace('/^[\-@]+/', '', $text);
// 4. Surround with double quotes (no reference link, but seems very reasonable, which will prevent commas from breaking things).
return '"' . $text . '"';
}
/**
*
* references: https://stackoverflow.com/questions/3426090/how-do-you-make-strings-xml-safe
* https://www.php.net/htmlspecialchars
* https://www.php.net/XMLWriter
*
*
* Escapes & < > ' "
* TODO: not sure if need to escape ' and ", which are escaping for now (via the ENT_QUOTES flag)
*/
function xmlEscape($text)
{
return htmlspecialchars(($text ?? ''), ENT_XML1 | ENT_QUOTES);
}
/**
* Escape a PHP string for use as (part of) an HTML / XML text node.
*
* It only escapes a few special chars: the ampersand (&) and both the left-
* pointing angle bracket (<) and the right-pointing angle bracket (>), since
* these are the only characters that are special in a text node. Minimal
* quoting is preferred because it produces smaller and more easily human-
* readable output.
*
* Some characters simply cannot appear in valid XML documents, even
* as entities but, this function does not attempt to handle them.
*
* NOTE: Attribute values are NOT text nodes, and require additional escaping.
*
* @param string $text The string to escape, possibly including "&", "<",
* or ">".
* @return string The string, with "&", "<", and ">" escaped.
*/
function text($text)
{
return htmlspecialchars(($text ?? ''), ENT_NOQUOTES);
}
/**
* Escape a PHP string for use as (part of) an HTML / XML attribute value.
*
* It escapes several special chars: the ampersand (&), the double quote
* ("), the singlequote ('), and both the left-pointing angle bracket (<)
* and the right-pointing angle bracket (>), since these are the characters
* that are special in an attribute value.
*
* Some characters simply cannot appear in valid XML documents, even
* as entities but, this function does not attempt to handle them.
*
* NOTE: This can be used as a "generic" HTML escape since it does maximal
* quoting. However, some HTML and XML contexts (CDATA) don't provide
* escape mechanisms. Also, further pre- or post-escaping might need to
* be done when embdedded other languages (like JavaScript) inside HTML /
* XML documents.
*
* @param string $text The string to escape, possibly including (&), (<),
* (>), ('), and (").
* @return string The string, with (&), (<), (>), ("), and (') escaped.
*/
function attr($text)
{
return htmlspecialchars(($text ?? ''), ENT_QUOTES);
}
/**
* Don't call this function. You don't see this function. This function
* doesn't exist.
*
* TODO: Hide this function so it can be called from this file but not from
* PHP that includes / requires this file. Either that, or write reasonable
* documentation and clean up the name.
*/
function hsc_private_xl_or_warn($key)
{
if (function_exists('xl')) {
return xl($key);
} else {
trigger_error(
'Translation via xl() was requested, but the xl()'
. ' function is not defined, yet.',
E_USER_WARNING
);
return $key;
}
}
/**
* Translate via xl() and then escape via text().
*
* @param string $key The string to escape, possibly including "&", "<",
* or ">".
* @return string The string, with "&", "<", and ">" escaped.
*/
function xlt($key)
{
return text(hsc_private_xl_or_warn($key));
}
/**
* Translate via xl() and then escape via attr().
*
* @param string $key The string to escape, possibly including (&), (<),
* (>), ('), and (").
* @return string The string, with (&), (<), (>), ("), and (') escaped.
*/
function xla($key)
{
return attr(hsc_private_xl_or_warn($key));
}
/*
* Translate via xl() and then escape via js_escape for use with javascript literals
*/
function xlj($key)
{
return js_escape(hsc_private_xl_or_warn($key));
}
/*
* Deprecated
*Translate via xl() and then escape via addslashes for use with javascript literals
*/
function xls($key)
{
return addslashes(hsc_private_xl_or_warn($key));
}