PHP非字符串URL/HTML安全性 问题
是否有任何其他不安全的情况下打印到HTML页面或URL而不转义?忽略具有自定义toString方法的对象 出身背景 我正在编写一个内部库来神奇地清理任何简单的字符串、int、float等、数组、嵌套数组、对象等等。。。将数据的目的地指定给HTML页面或URL 对于字符串,很明显我必须应用和/或某些字符串 如果可能的话,我想保留变量的类型,因此如果可能的话,我不想转换int、float等 示例代码 下面是我的部分类的当前状态。请注意,下面的代码还没有说明对象函数和属性PHP非字符串URL/HTML安全性 问题,php,html,url,types,escaping,Php,Html,Url,Types,Escaping,是否有任何其他不安全的情况下打印到HTML页面或URL而不转义?忽略具有自定义toString方法的对象 出身背景 我正在编写一个内部库来神奇地清理任何简单的字符串、int、float等、数组、嵌套数组、对象等等。。。将数据的目的地指定给HTML页面或URL 对于字符串,很明显我必须应用和/或某些字符串 如果可能的话,我想保留变量的类型,因此如果可能的话,我不想转换int、float等 示例代码 下面是我的部分类的当前状态。请注意,下面的代码还没有说明对象函数和属性 似乎没有人有这方面的经验,或
似乎没有人有这方面的经验,或者我使用的搜索词不正确,所以我决定做一些研究 是的,在一些情况下。 <>当输出变量消毒时应考虑的情况: 嵌套数组元素 对象函数和属性 URL中的资源不安全 特定上下文的安全字符 返回一个字符串,其中除-\之外的所有非字母数字字符均为该字符串。已被替换 安全字符:0-9a-za-Z-30; 执行的翻译是: “&”符号变为“&” 未设置ENT\u NOQUOTES时,“”双引号变为“”。 “单引号变为”或&apos;仅当设置了ENT_引号时。 大于变成'>' 不安全字符:&'<> 非字符串变量类型 可能的字符:1 可能的字符:0-9- 可能的字符:0-9- 输出源:构造函数、\uuuuToString、其他函数、属性,每个都必须检查 似乎不需要打印资源,但为了完整起见,这里提供了一些信息 输出:资源ID[0-9]在URL中不安全 输出:
class HogwartsExpress {
private static $URL = 0;
private static $HTML = 1;
// ...
private static function escape_array($arr, $method){
$escaped_arr = array();
foreach ($arr as $k=>$v){
$safe_k = self::escape_non_array($k, $method);
$escaped_arr[$safe_k] = is_array($v) ? self::escape_array($v, $method): self::escape_non_array($v, $method);
}
return $escaped_arr;
}
private static function escape_non_array($val, $method){
if (is_string($val)){
switch ($method){
case self::$URL: return urlencode($val);
case self::$HTML: return htmlspecialchars($val);
}
}
else {
return $val;
}
}
}
// boolean (TRUE|FALSE)
echo TRUE; //1
echo FALSE; //
// decimal non-zero /[+-]?[1-9][0-9]*/
echo 1; //1
echo 83; //83
echo -7; //-7
echo +30; //30
// decimal zero /[+-]0/
echo 0; //0
echo +0; //0
echo -0; //0
// hexadecimal /[+-]?0[xX][0-9a-fA-F]+/
echo 0x0; //0
echo -0x0; //0
echo 0x0A; //10
echo -0X13; //-19
echo +0x22; //34
// octal /[+-]?0[0-7]+/
echo 00; //0
echo -00; //0
echo +00; //0
echo 07; //7
echo 09; //0
echo -02; //-2
echo 020; //16
echo +015; //13
// binary /[+-]?0b[01]/
echo 0b0; //0
echo +0b0; //0
echo -0b0; //0
echo 0b111; //7
echo -0b101; //-5
echo +0b1101; //13
// Float /[+-]?({REQ}|(({OPT}\.{REQ})|({REQ}\.{OPT})))[eE][+-]?{REQ}/
// OPT /[0-9]*/
// REQ /[0-9]+/
echo .53; //0.53
echo 42; //42
echo 64.; //64
echo 25.11; //25.11
echo -5.2; //-5.2
echo +8.8; //8.8
echo -3.2E1 //-32
echo +2.e-2 //0.02
echo array('a' => 3.2, 'b' => 5); //Array
$foo = array('bar' => '<');
echo $foo['bar']; //<
class Foo {}
echo new Foo(); //{error}
class Bird {
function __construct() { $this->beak_len = 3.5; echo 'hoot'; }
function __toString(){ return 'hedwig'; }
function tweet(){ echo 'HOOT'; }
}
$owl = new Bird(); //hoot
echo $owl; //hedwig
$owl->tweet(); //HOOT
echo $owl->beak_len; //3.5
$doc = xml_parser_create();
echo $doc; //Resource id #4
$tmp = tmpfile();
echo $tmp; //Resource id #4
// NULL
echo NULL; // {null}