diff --git a/lib/setup.php b/lib/setup.php index 6edd3d79e86..425d39fe02d 100644 --- a/lib/setup.php +++ b/lib/setup.php @@ -774,6 +774,24 @@ if (empty($CFG->sessiontimeout)) { } \core\session\manager::start(); +// Set default content type and encoding, developers are still required to use +// echo $OUTPUT->header() everywhere, anything that gets set later should override these headers. +// This is intended to mitigate some security problems. +if (AJAX_SCRIPT) { + if (!core_useragent::supports_json_contenttype()) { + // Some bloody old IE. + @header('Content-type: text/plain; charset=utf-8'); + @header('X-Content-Type-Options: nosniff'); + } else if (!empty($_FILES)) { + // Some ajax code may have problems with json and file uploads. + @header('Content-type: text/plain; charset=utf-8'); + } else { + @header('Content-type: application/json; charset=utf-8'); + } +} else if (!CLI_SCRIPT) { + @header('Content-type: text/html; charset=utf-8'); +} + // Initialise some variables that are supposed to be set in config.php only. if (!isset($CFG->filelifetime)) { $CFG->filelifetime = 60*60*6;