OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Google, Inc. All rights reserved. | 2 * Copyright (C) 2011 Google, Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 601 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
612 const ScriptCallFrame& callFrame = stack->at(0); | 612 const ScriptCallFrame& callFrame = stack->at(0); |
613 | 613 |
614 if (callFrame.lineNumber()) { | 614 if (callFrame.lineNumber()) { |
615 KURL source = KURL(ParsedURLString, callFrame.sourceURL()); | 615 KURL source = KURL(ParsedURLString, callFrame.sourceURL()); |
616 init.sourceFile = stripURLForUseInReport(document, source); | 616 init.sourceFile = stripURLForUseInReport(document, source); |
617 init.lineNumber = callFrame.lineNumber(); | 617 init.lineNumber = callFrame.lineNumber(); |
618 init.columnNumber = callFrame.columnNumber(); | 618 init.columnNumber = callFrame.columnNumber(); |
619 } | 619 } |
620 } | 620 } |
621 | 621 |
622 void ContentSecurityPolicy::reportViolation(const String& directiveText, const S
tring& effectiveDirective, const String& consoleMessage, const KURL& blockedURL,
const Vector<KURL>& reportURIs, const String& header) | 622 void ContentSecurityPolicy::reportViolation(const String& directiveText, const S
tring& effectiveDirective, const String& consoleMessage, const KURL& blockedURL,
const Vector<String>& reportEndpoints, const String& header) |
623 { | 623 { |
624 // FIXME: Support sending reports from worker. | 624 // FIXME: Support sending reports from worker. |
625 Document* document = this->document(); | 625 Document* document = this->document(); |
626 if (!document) | 626 if (!document) |
627 return; | 627 return; |
628 | 628 |
629 LocalFrame* frame = document->frame(); | 629 LocalFrame* frame = document->frame(); |
630 if (!frame) | 630 if (!frame) |
631 return; | 631 return; |
632 | 632 |
633 SecurityPolicyViolationEventInit violationData; | 633 SecurityPolicyViolationEventInit violationData; |
634 gatherSecurityPolicyViolationEventData(violationData, document, directiveTex
t, effectiveDirective, blockedURL, header); | 634 gatherSecurityPolicyViolationEventData(violationData, document, directiveTex
t, effectiveDirective, blockedURL, header); |
635 | 635 |
636 if (experimentalFeaturesEnabled()) | 636 if (experimentalFeaturesEnabled()) |
637 frame->domWindow()->enqueueDocumentEvent(SecurityPolicyViolationEvent::c
reate(EventTypeNames::securitypolicyviolation, violationData)); | 637 frame->domWindow()->enqueueDocumentEvent(SecurityPolicyViolationEvent::c
reate(EventTypeNames::securitypolicyviolation, violationData)); |
638 | 638 |
639 if (reportURIs.isEmpty()) | 639 if (reportEndpoints.isEmpty()) |
640 return; | 640 return; |
641 | 641 |
642 // We need to be careful here when deciding what information to send to the | 642 // We need to be careful here when deciding what information to send to the |
643 // report-uri. Currently, we send only the current document's URL and the | 643 // report-uri. Currently, we send only the current document's URL and the |
644 // directive that was violated. The document's URL is safe to send because | 644 // directive that was violated. The document's URL is safe to send because |
645 // it's the document itself that's requesting that it be sent. You could | 645 // it's the document itself that's requesting that it be sent. You could |
646 // make an argument that we shouldn't send HTTPS document URLs to HTTP | 646 // make an argument that we shouldn't send HTTPS document URLs to HTTP |
647 // report-uris (for the same reasons that we supress the Referer in that | 647 // report-uris (for the same reasons that we supress the Referer in that |
648 // case), but the Referer is sent implicitly whereas this request is only | 648 // case), but the Referer is sent implicitly whereas this request is only |
649 // sent explicitly. As for which directive was violated, that's pretty | 649 // sent explicitly. As for which directive was violated, that's pretty |
(...skipping 16 matching lines...) Expand all Loading... |
666 | 666 |
667 RefPtr<JSONObject> reportObject = JSONObject::create(); | 667 RefPtr<JSONObject> reportObject = JSONObject::create(); |
668 reportObject->setObject("csp-report", cspReport.release()); | 668 reportObject->setObject("csp-report", cspReport.release()); |
669 String stringifiedReport = reportObject->toJSONString(); | 669 String stringifiedReport = reportObject->toJSONString(); |
670 | 670 |
671 if (!shouldSendViolationReport(stringifiedReport)) | 671 if (!shouldSendViolationReport(stringifiedReport)) |
672 return; | 672 return; |
673 | 673 |
674 RefPtr<FormData> report = FormData::create(stringifiedReport.utf8()); | 674 RefPtr<FormData> report = FormData::create(stringifiedReport.utf8()); |
675 | 675 |
676 for (size_t i = 0; i < reportURIs.size(); ++i) | 676 for (size_t i = 0; i < reportEndpoints.size(); ++i) |
677 PingLoader::sendViolationReport(frame, reportURIs[i], report, PingLoader
::ContentSecurityPolicyViolationReport); | 677 PingLoader::sendViolationReport(frame, completeURL(reportEndpoints[i]),
report, PingLoader::ContentSecurityPolicyViolationReport); |
678 | 678 |
679 didSendViolationReport(stringifiedReport); | 679 didSendViolationReport(stringifiedReport); |
680 } | 680 } |
681 | 681 |
682 void ContentSecurityPolicy::reportInvalidReferrer(const String& invalidValue) | 682 void ContentSecurityPolicy::reportInvalidReferrer(const String& invalidValue) |
683 { | 683 { |
684 logToConsole("The 'referrer' Content Security Policy directive has the inval
id value \"" + invalidValue + "\". Valid values are \"always\", \"default\", \"n
ever\", and \"origin\"."); | 684 logToConsole("The 'referrer' Content Security Policy directive has the inval
id value \"" + invalidValue + "\". Valid values are \"always\", \"default\", \"n
ever\", and \"origin\"."); |
685 } | 685 } |
686 | 686 |
687 void ContentSecurityPolicy::reportReportOnlyInMeta(const String& header) | 687 void ContentSecurityPolicy::reportReportOnlyInMeta(const String& header) |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
837 // Collisions have no security impact, so we can save space by storing only
the string's hash rather than the whole report. | 837 // Collisions have no security impact, so we can save space by storing only
the string's hash rather than the whole report. |
838 return !m_violationReportsSent.contains(report.impl()->hash()); | 838 return !m_violationReportsSent.contains(report.impl()->hash()); |
839 } | 839 } |
840 | 840 |
841 void ContentSecurityPolicy::didSendViolationReport(const String& report) | 841 void ContentSecurityPolicy::didSendViolationReport(const String& report) |
842 { | 842 { |
843 m_violationReportsSent.add(report.impl()->hash()); | 843 m_violationReportsSent.add(report.impl()->hash()); |
844 } | 844 } |
845 | 845 |
846 } // namespace blink | 846 } // namespace blink |
OLD | NEW |