#php #simplexml #sanitization #jsonencoder
#php #simplexml #очистка #jsonencoder
Вопрос:
Вот моя проблема:
function parse_xml_to_json($url) {
$fileContents = file_get_contents($url);
$simpleXml = simplexml_load_string($fileContents, null
, LIBXML_NOCDATA);
$json = json_encode($simpleXml);
return $json;
}
$jsonto = parse_xml_to_json('myxmlfile.html');
echo $jsonto;
По сути, мне нужно использовать XML-файл из внешнего источника и перебирать его, чтобы красиво отобразить некоторые данные.
Я создал функцию, которая получает содержимое из внешнего URL-адреса (file_get_contents ), затем я превращаю строку XML в объект (я использую LIBXML_NOCDATA в качестве параметра, потому что он содержит ), сразу после того, как я превращаю объект в файл JSON, и на самом последнем шаге я повторяю результат.
Пока все хорошо, это сработало, но мне интересно, могу ли я что-нибудь сделать, если XML-файл содержит вредоносный скрипт или что-то еще.
Является ли функция simplexml_load_string, а затем кодирование JSON достаточным для предотвращения вредоносного скрипта или недопустимого XML?
Комментарии:
1. О какой инъекции вы говорите? В XML или JSON нет ничего, что означало бы, что вы можете удалять данные с помощью любого типа инъекции. Можно создавать недопустимые структуры, но это совсем другое дело.
2. @NigelRen да, даже для определения недопустимой структуры. Я получаю этот XML-файл с внешнего сервера.. Мне интересно, что может произойти, если они взломают
Ответ №1:
Ваш код подвержен атаке типа «Отказ в обслуживании» (DOS).
$fileContents = file_get_contents($url);
Это может увеличить ваш лимит памяти. Или приблизиться к этому, но это займет много времени (сервер, с которого вы запрашиваете данные, останавливается посередине после предоставления большого количества контента, а затем только несколько маленьких байтов каждые пару секунд). Таким образом, ваш скрипт будет «зависать» при использовании памяти.
Если затем скрипт может быть запущен с другим HTTP-запросом несколько раз, это может потреблять ресурсы вашего сервера (оператор echo предполагает, что это вполне возможно).
Комментарии:
1. Не могли бы вы предложить другой подход для этой цели? curl?
2. Это не просто другой подход, а просто напоминание о необходимости более глубокого понимания обработки данных и используемых протоколов. Рассмотрите случаи ошибок, а не «просто работу». Например. все может выйти из строя, подумайте, где что-то может выйти из строя (например, соответствуют ли возвращаемые значения ожидаемым?). Еще одним местом для проверки являются ограничения. Всегда есть ограничения, найдите существующие. Также рассмотрите свои собственные ограничения: что вы хотите ограничить (например, какой объем данных или время)? Подумайте о более низком уровне, это не техническая проблема (если это не так, но тогда вы знаете об ограничениях — хорошо!)
3. Хорошо, я понял. Могу ли я улучшить код, если я избавлюсь от функции file_get_contents и оставлю только simplexml_load_file? Единственная проблема, которая у меня может возникнуть, — это режим аутентификации: $context = stream_context_create(array( ‘http’ => array( ‘header’ => «Авторизация: базовая » . base64_encode(«$username:$password»), ) )); это ограничено file_get_contents, но выпредлагают ограничить запрос на уровне сервера (каждые несколько секунд), если я не выполняю корректно