PHP接收XML需先判别提交方式:文件上传用$_FILES读取临时文件,原始POST用php://input;解析时必须禁用外部实体(LIBXML_NOENT|LIBXML_NONET)防XXE,并校验根节点与字段有效性。
PHP 接收上传的 XML 文件,核心是正确获取原始请求体(而非表单字段),并确保服务器端能安全、可靠地解析内容。关键不在于“上传文件”本身,而是如何识别并处理以 XML 格式提交的数据。
这是第一步,决定后续处理方式:
上传:XML 会走 PHP 的 $_FILES 流程,文件暂存于临时目录,需用 file_get_contents($_FILES['xml_file']['tmp_name']) 读取内容,再解析。fetch 或 XMLHttpRequest 发送原始 XML(Content-Type: application/xml 或 text/xml):此时 $_POST 为空,必须用 file_get_contents('php://input') 获取原始请求体,再解析。避免直接使用 simplexml_load_string() 或 DOMDocument::loadXML() 解析未经处理的原始数据,防止 XXE(XML 外部实体)攻击:
$xml = simplexml_load_string($raw, 'SimpleXMLElement', LIBXML_NOENT | LIBXML_DTDATTR | LIBXML_NONET);
$dom = new DOMDocument();
$dom->loadXML($raw, LIBXML_NOENT | LIBXML_DTDATTR | LIBXML_NONET);
libxml_use_internal_errors(true) 捕获解析错误,再检查 libxml_get_errors()。根据提交方式选择对应逻辑:
$raw = file_get_contents('php://input');
if (empty($raw)) { die('No XML data received'); }
$xml = simplexml_load_string($raw, 'SimpleXMLElement', LIBXML_NOENT | LIBXML_NONET);
if ($xml === false) { die('Invalid XML'); }
if (isset($_FILES['xml_file']) && $_FILES['xml_file']['error'] === UPLOAD_ERR_OK) {
$content = file_get_contents($_FILES['xml_file']['tmp_name']);
$xml = simplexml_load_string($content, null, LIBXML_NOENT | LIBXML_NONET);
}
仅解析成功还不够,还需保障业务可靠性:
$xml->getName() === 'Order');isset($xml->id)、is_numeric((string)$xml->amount));