我正在编写一个在PHP中使用XML API的Web应用程序,我担心三个特定的漏洞,都与内联DOCTYPE定义有关:本地文件包含,二次实体爆炸和指数实体爆炸.我喜欢使用PHP的(5.3)内置库,但我想确保我不会受这些影响.
我发现我可以使用libxml_disable_entity_loader消除LFI,但这对内联ENTITY声明没有帮助,包括引用其他实体的实体.
SimpleXML库(SimpleXMLElement,simplexml_load_string等)很棒,因为它是一个DOM解析器,我的所有输入都很小; 它允许我使用xpath并非常容易地操作DOM.我无法想象如何停止ENTITY声明.(如果可能,我很乐意禁用所有内联DOCTYPE定义.)
XML Parser库(xml_parser_create,xml_set_element_handler等)允许我使用xml_set_default_handler设置包含实体的默认处理程序.我可以破解它,因此对于无法识别的实体,它只返回原始字符串(即"&ent;").这个库令人沮丧:因为它是一个SAX解析器,我必须编写一堆处理程序(多达9 ..).
那么是否可以使用内置库,获取类似DOM的对象,并保护自己免受这些各种DoS漏洞的影响?谢谢
这个页面描述了三个漏洞,并提供了一个解决方案...如果我只使用.NET:http://msdn.microsoft.com/en-us/magazine/ee335713.aspx
更新:
<?php
$s = <<<EOF
<?xml version="1.0?>
<!DOCTYPE data [
<!ENTITY en "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....">
]>
<data>&en;&en;&en;&en;&en;&en;&en;&en;&en;&en;&en;&en;.....</data>
EOF;
$doc = new DOMDocument();
$doc->loadXML($s);
var_dump($d->lastChild->nodeValue);
?>
Run Code Online (Sandbox Code Playgroud)
我也试过loadXML($s, LIBXML_NOENT);了.在这两种情况下,我最终倾销300多MB.有什么东西我还在遗失吗?
我试图按照这里的说明https://medium.com/@tom.cook/edge-lambda-cloudfront-custom-headers-3d134a2c18a2
我让CloudFront成功地坐在静态S3"hello world"HTML文件前面,我想使用lambda edge设置其他标头,但是我收到错误.真正令人沮丧的是,我找不到任何错误日志来调试出错的地方.这是浏览器显示的内容.
ERROR
The request could not be satisfied.
The Lambda function returned an invalid request or response to CloudFront.
Generated by cloudfront (CloudFront)
Request ID: 2Cqex7euzH0Iigps58i9tMVxdqAaLznL2ZjwqR1sW1AZHz6x2EwfMA==
Run Code Online (Sandbox Code Playgroud)
这是我的简单lambda的代码:
exports.handler = (event, context, callback) => {
console.log(event)
callback(null, 'Hello from Lambda');
};
Run Code Online (Sandbox Code Playgroud)
触发器类型是viewer-response并且附加到我的CloudFront分配(Cache Behavior: *如果这很重要的话).lambda具有AWSLambdaBasicExecutionRole与之对应的角色,从而为Cloudwatch提供写入权限.
一旦启用触发器,对Web请求的响应就会从我的"Hello world"HTML变为上面的错误,所以我知道它正在触发lambda.但是在lambda仪表板中,它没有显示任何调用或错误.Cloudwatch中不显示任何日志.CloudFront仪表板显示errors(5xx),但没有lambda.
如果我然后通过单击已部署的函数在lambda控制台中测试我的函数,将测试事件配置为"CloudFront Modify Response Header"并按下Test,则表示该函数成功.Cloudwatch显示测试的日志和控制台输出!但是在实时调用的日志中仍然没有任何内容.
我唯一的理论是权限有问题,CloudFront实际上无法调用lambda(解释为什么lambda仪表板中没有任何内容).最后一件事是CloudFront日志(在S3中)显示带有502错误的Web请求LambdaValidationError,但我无法弄清楚这是否有帮助.
我了解我可能会在网站主页上设置CSP标头https://example.com,以限制从何处加载脚本和其他资源。但是,如果主页上没有CSP,浏览器将如何处理后续请求的策略?
这是两个示例合二为一:
https://example.com并获取一些HTML(没有CSP标头)https://example.com/script.js[*]中的脚本https://api.example.com[*] 发出GET来从API请求一些数据https://api.example.comhttps://api.analytics.com[*]在步骤2和3中,如果script.js或JSON响应返回了带有限制的CSP,会发生什么Content-Security-Policy: default-src 'none'?下游要求会改变吗?浏览器是否采取任何措施来阻止脚本的任何请求?还是因为原始页面加载不包含任何CSP而被允许?
谢谢!