<?php
$str = <<<XML
<?xml version="1.0"?>
<!DOCTYPE doc [
<!ENTITY e SYSTEM "/tmp/exp">
]>
<tag>&e;</tag>
XML;
$xml = new SimpleXMLElement($str);
echo $xml;
?>
這應該列印出來的內容,/tmp/exp但不,我不明白為什么,甚至當我運行該腳本sudo或更改/tmp/exp檔案權限777。
uj5u.com熱心網友回復:
默認情況下禁用加載外部物體,因為它可能導致各種安全漏洞。
為了安全啟用它,您需要注冊一個自定義物體加載器,它可以檢查預期的物體路徑并決定是否加載它們。例如,您可能允許特定目錄中的任何檔案,但不允許磁盤其他地方的任何檔案 - 您可能不需要允許參考系統檔案,如/etc/passwd. 或者,您可以將提供的路徑映射到系統上完全不同的位置。
然后,您還需要提供告訴決議器通過處理程式擴展物體的LIBXML_NOENT選項。
例如:
libxml_set_external_entity_loader(function($public, $system, $context) {
if ($system === '/tmp/exp') {
return fopen('/tmp/exp', 'r');
}
else {
return null;
}
});
$xml = new SimpleXMLElement($str, LIBXML_NOENT);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/365921.html
上一篇:JSON陣列到逗號分隔的字串
