diff --git a/app/Template/analytic/layout.php b/app/Template/analytic/layout.php index 7159094..11d5b9b 100644 --- a/app/Template/analytic/layout.php +++ b/app/Template/analytic/layout.php @@ -1,6 +1,6 @@ projectHeader->render($project, 'TaskListController', 'show') ?> diff --git a/tests/units/Core/TemplateTest.php b/tests/units/Core/TemplateTest.php index a065aa8..bdce8aa 100644 --- a/tests/units/Core/TemplateTest.php +++ b/tests/units/Core/TemplateTest.php @@ -3,6 +3,7 @@ namespace KanboardTests\units\Core; use KanboardTests\units\Base; +use Kanboard\Core\Http\Request; use Kanboard\Core\Security\Role; use Kanboard\Core\Template; @@ -82,4 +83,26 @@ class TemplateTest extends Base $html ); } + + public function testAnalyticAjaxLayoutEscapesProjectNameInTitle() + { + $this->container['request'] = new Request($this->container, array( + 'HTTP_X_REQUESTED_WITH' => 'XMLHttpRequest', + )); + + $html = $this->container['helper']->layout->analytic('analytic/task_distribution', array( + 'project' => array('id' => 1, 'name' => ''), + 'metrics' => array(), + 'title' => 'Task distribution', + )); + + $this->assertStringNotContainsString( + '', + $html + ); + $this->assertStringContainsString( + '

<img src=x onerror=alert(document.domain)> > Task distribution

', + $html + ); + } }