$scriptElem->parentNode->removeChild($scriptElem);
}
+ // Remove data or JavaScript iFrames
+ $badIframes = $xPath->query('//*[contains(@src, \'data:\')] | //*[contains(@src, \'javascript:\')]');
+ foreach ($badIframes as $badIframe) {
+ $badIframe->parentNode->removeChild($badIframe);
+ }
+
// Remove 'on*' attributes
$onAttributes = $xPath->query('//@*[starts-with(name(), \'on\')]');
foreach ($onAttributes as $attr) {
]);
$user = $this->userRepo->getById($id);
- $user->fill($request->all());
+ $user->fill($request->except(['email']));
+
+ // Email updates
+ if (userCan('users-manage') && $request->filled('email')) {
+ $user->email = $request->get('email');
+ }
// Role updates
if (userCan('users-manage') && $request->filled('roles')) {
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
- Options -MultiViews
+ Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
*
-!.gitignore
\ No newline at end of file
+!.gitignore
+!.htaccess
\ No newline at end of file
--- /dev/null
+Options -Indexes
\ No newline at end of file
<input type="text" id="{{ $name }}" name="{{ $name }}"
@if($errors->has($name)) class="text-neg" @endif
@if(isset($placeholder)) placeholder="{{$placeholder}}" @endif
+ @if(isset($disabled) && $disabled) disabled="disabled" @endif
@if(isset($tabindex)) tabindex="{{$tabindex}}" @endif
@if(isset($model) || old($name)) value="{{ old($name) ? old($name) : $model->$name}}" @endif>
@if($errors->has($name))
<div>
@if($authMethod !== 'ldap' || userCan('users-manage'))
<label for="email">{{ trans('auth.email') }}</label>
- @include('form.text', ['name' => 'email'])
+ @include('form.text', ['name' => 'email', 'disabled' => !userCan('users-manage')])
@endif
</div>
</div>
$page->save();
$pageView = $this->get($page->getUrl());
+ $pageView->assertStatus(200);
$pageView->assertDontSee($script);
$pageView->assertSee('abc123abc123');
}
$page->save();
$pageView = $this->get($page->getUrl());
+ $pageView->assertStatus(200);
$pageView->assertElementNotContains('.page-content', '<script>');
$pageView->assertElementNotContains('.page-content', '</script>');
}
}
+ public function test_iframe_js_and_base64_urls_are_removed()
+ {
+ $checks = [
+ '<iframe src="javascript:alert(document.cookie)"></iframe>',
+ '<iframe SRC=" javascript: alert(document.cookie)"></iframe>',
+ '<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgnaGVsbG8nKTwvc2NyaXB0Pg==" frameborder="0"></iframe>',
+ '<iframe src=" data:text/html;base64,PHNjcmlwdD5hbGVydCgnaGVsbG8nKTwvc2NyaXB0Pg==" frameborder="0"></iframe>',
+
+ ];
+
+ $this->asEditor();
+ $page = Page::first();
+
+ foreach ($checks as $check) {
+ $page->html = $check;
+ $page->save();
+
+ $pageView = $this->get($page->getUrl());
+ $pageView->assertStatus(200);
+ $pageView->assertElementNotContains('.page-content', '<iframe>');
+ $pageView->assertElementNotContains('.page-content', '</iframe>');
+ $pageView->assertElementNotContains('.page-content', 'src=');
+ $pageView->assertElementNotContains('.page-content', 'javascript:');
+ $pageView->assertElementNotContains('.page-content', 'data:');
+ $pageView->assertElementNotContains('.page-content', 'base64');
+ }
+
+ }
+
public function test_page_inline_on_attributes_removed_by_default()
{
$this->asEditor();
$page->save();
$pageView = $this->get($page->getUrl());
+ $pageView->assertStatus(200);
$pageView->assertDontSee($script);
$pageView->assertSee('<p>Hello</p>');
}
'<div>Lorem ipsum dolor sit amet.<p onclick="console.log(\'test\')">Hello</p></div>',
'<div><div><div><div>Lorem ipsum dolor sit amet.<p onclick="console.log(\'test\')">Hello</p></div></div></div></div>',
'<div onclick="console.log(\'test\')">Lorem ipsum dolor sit amet.</div><p onclick="console.log(\'test\')">Hello</p><div></div>',
+ '<a a="<img src=1 onerror=\'alert(1)\'> ',
];
$this->asEditor();
$page->save();
$pageView = $this->get($page->getUrl());
+ $pageView->assertStatus(200);
$pageView->assertElementNotContains('.page-content', 'onclick');
}
$this->actingAs($this->user)->visit('/')->dontSee($usersLink);
}
+ public function test_user_cannot_change_email_unless_they_have_manage_users_permission()
+ {
+ $userProfileUrl = '/settings/users/' . $this->user->id;
+ $originalEmail = $this->user->email;
+ $this->actingAs($this->user);
+
+ $this->visit($userProfileUrl)
+ ->assertResponseOk()
+ ->seeElement('input[name=email][disabled]');
+ $this->put($userProfileUrl, [
+ 'name' => 'my_new_name',
+ ]);
+ $this->seeInDatabase('users', [
+ 'id' => $this->user->id,
+ 'email' => $originalEmail,
+ 'name' => 'my_new_name',
+ ]);
+
+ $this->giveUserPermissions($this->user, ['users-manage']);
+
+ $this->visit($userProfileUrl)
+ ->assertResponseOk()
+ ->dontSeeElement('input[name=email][disabled]')
+ ->seeElement('input[name=email]');
+ $this->put($userProfileUrl, [
+ 'name' => 'my_new_name_2',
+ ]);
+
+ $this->seeInDatabase('users', [
+ 'id' => $this->user->id,
+ 'name' => 'my_new_name_2',
+ ]);
+ }
+
public function test_user_roles_manage_permission()
{
$this->actingAs($this->user)->visit('/settings/roles')