W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
有兩個(gè)重要的接口中XHP,XHPRoot和XHPChild; 在函數(shù)中添加類型注釋時(shí),您將需要使用這些注釋。
該XHPRoot接口由所有XHP對象實(shí)現(xiàn); 在實(shí)踐中,這意味著:
XHP呈現(xiàn)樹結(jié)構(gòu),該接口定義樹的有效子節(jié)點(diǎn); 這包括:
盡管字符串,整數(shù),浮點(diǎn)數(shù)和數(shù)組都不是對象,但是類型instanceof檢查器和HHVM都認(rèn)為它們可以實(shí)現(xiàn)這個(gè)接口 - 無論是對于參數(shù)/返回類型還是用于檢查。
雖然XHP的安全默認(rèn)功能通常是有益的,但偶爾需要繞過它們; 最常見的情況是:
XHP通常會(huì)阻礙:
該XHPUnsafeRenderable和XHPAlwaysValidChild接口允許繞過這些安全機(jī)制。
如果您需要渲染原始HTML字符串,請將其包裝在實(shí)現(xiàn)此接口的類中,并提供一種toHTMLString(): string方法:
<?hh
/* YOU PROBABLY SHOULDN'T DO THIS
*
* Even with a scary (and accurate) name, it tends to be over-used.
* See below for an alternative.
*/
class ExamplePotentialXSSSecurityHole implements XHPUnsafeRenderable {
public function __construct(
private string $html,
) {
}
public function toHTMLString(): string {
return $this->html;
}
}
echo (
<div class="markdown">
{new ExamplePotentialXSSSecurityHole(
HHVM\UserDocumentation\XHP\Examples\md_render('Markdown goes here')
)}
</div>
)."\n";
我們不提供此接口的實(shí)現(xiàn),因?yàn)橥ㄓ脤?shí)現(xiàn)往往被過度使用 - 相反,考慮進(jìn)行更具體的實(shí)現(xiàn):
<?hh
class ExampleMarkdownXHPWrapper implements XHPUnsafeRenderable {
private string $html;
public function __construct(
string $markdown_source,
) {
$this->html = HHVM\UserDocumentation\XHP\Examples\md_render(
$markdown_source
);
}
public function toHTMLString(): string {
return $this->html;
}
}
echo (
<div class="markdown">
{new ExampleMarkdownXHPWrapper('Markdown goes here')}
</div>
)."\n";
可以通過實(shí)現(xiàn)此接口來繞過XHP的子級驗(yàn)證。實(shí)現(xiàn)此接口的大多數(shù)類也是實(shí)現(xiàn)XHPUnsafeRenderable,因?yàn)樽畛R姷男枨笫钱?dāng)另一個(gè)渲染或模板系統(tǒng)生成子代時(shí)。
這也可以由XHP對象來實(shí)現(xiàn),但這通常表示應(yīng)該用類別替換子類規(guī)范。這個(gè)界面是故意打破XHP安全性的一部分,所以應(yīng)盡量少用。
<?hh
final class XHPUnsafeExample implements XHPUnsafeRenderable {
public function toHTMLString(): string {
return '<script>'.$_GET['I_LOVE_XSS'].'</script>';
}
}
$inputs = Map {
'<div />' => <div />,
'<x:frag />' => <x:frag />,
'"foo"' => 'foo',
'3' => 3,
'true' => true,
'null' => null,
'new stdClass()' => new stdClass(),
'[<li />, <li />, <li />]' => [<li />, <li />, <li />],
'XHPUnsafeExample' => new XHPUnsafeExample(),
};
$max_label_len = max($inputs->mapWithKey(($k, $_) ==> strlen($k)));
print str_repeat(' ', $max_label_len + 1)." | XHPRoot | XHPChild\n";
print str_repeat('-', $max_label_len + 1)."-|---------|----------\n";
foreach ($inputs as $label => $input) {
printf(
" %{$max_label_len}s | %-7s | %s\n",
$label,
$input instanceof XHPRoot ? 'yes' : 'no',
$input instanceof XHPChild ? 'yes' : 'no',
);
}
Output
| XHPRoot | XHPChild
--------------------------|---------|----------
<div /> | yes | yes
<x:frag /> | yes | yes
"foo" | no | yes
3 | no | yes
true | no | no
null | no | no
new stdClass() | no | no
[<li />, <li />, <li />] | no | yes
XHPUnsafeExample | no | yes
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: