From 015ab4a0386cafc3539c772c164d9b9dfa8a694e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jaime=20P=C3=A9rez=20Crespo?= <jaime.perez@uninett.no>
Date: Fri, 17 Jan 2014 15:40:02 +0000
Subject: [PATCH] Start using the redirectTrustedURL() and
 redirectUntrustedURL() wrappers.

git-svn-id: https://simplesamlphp.googlecode.com/svn/trunk@3326 44740490-163a-0410-bde0-09ae8108e29a
---
 lib/SimpleSAML/Auth/BWC.php                              | 9 ++++-----
 lib/SimpleSAML/Auth/Default.php                          | 6 +++---
 lib/SimpleSAML/Auth/ProcessingChain.php                  | 2 +-
 lib/SimpleSAML/Auth/Simple.php                           | 2 +-
 lib/SimpleSAML/Auth/State.php                            | 6 +++---
 lib/SimpleSAML/IdP.php                                   | 2 +-
 lib/SimpleSAML/IdP/LogoutIFrame.php                      | 2 +-
 lib/SimpleSAML/IdP/LogoutTraditional.php                 | 2 +-
 lib/SimpleSAML/XHTML/IdPDisco.php                        | 8 ++++----
 modules/InfoCard/lib/Auth/Source/ICAuth.php              | 2 +-
 modules/adfs/lib/IdP/ADFS.php                            | 2 +-
 modules/aselect/lib/Auth/Source/aselect.php              | 2 +-
 modules/authYubiKey/lib/Auth/Source/YubiKey.php          | 2 +-
 modules/authfacebook/lib/Auth/Source/Facebook.php        | 2 +-
 modules/authorize/lib/Auth/Process/Authorize.php         | 2 +-
 modules/authwindowslive/lib/Auth/Source/LiveID.php       | 2 +-
 modules/cas/lib/Auth/Source/CAS.php                      | 4 ++--
 modules/casserver/www/login.php                          | 2 +-
 modules/cdc/lib/Server.php                               | 2 +-
 modules/consent/lib/Auth/Process/Consent.php             | 2 +-
 modules/consent/lib/Logout.php                           | 2 +-
 modules/core/lib/Auth/Process/WarnShortSSOInterval.php   | 2 +-
 modules/core/lib/Auth/UserPassBase.php                   | 2 +-
 modules/core/lib/Auth/UserPassOrgBase.php                | 2 +-
 modules/core/www/as_login.php                            | 2 +-
 modules/core/www/bwc_resumeauth.php                      | 2 +-
 modules/core/www/cleardiscochoices.php                   | 2 +-
 modules/core/www/login-admin.php                         | 2 +-
 modules/discopower/lib/PowerIdPDisco.php                 | 6 +++---
 modules/exampleauth/lib/Auth/Process/RedirectTest.php    | 2 +-
 modules/exampleauth/lib/Auth/Source/External.php         | 2 +-
 modules/expirycheck/lib/Auth/Process/ExpiryDate.php      | 4 ++--
 modules/multiauth/lib/Auth/Source/MultiAuth.php          | 2 +-
 modules/oauth/lib/Consumer.php                           | 2 +-
 modules/oauth/www/authorize.php                          | 4 ++--
 modules/openid/lib/Auth/Source/OpenIDConsumer.php        | 4 ++--
 modules/openidProvider/lib/Server.php                    | 2 +-
 modules/openidProvider/www/user.php                      | 4 ++--
 modules/preprodwarning/lib/Auth/Process/Warning.php      | 2 +-
 .../lib/Auth/Process/ExpectedAuthnContextClassRef.php    | 2 +-
 modules/saml/lib/Auth/Source/SP.php                      | 4 ++--
 modules/saml/www/sp/saml2-acs.php                        | 2 +-
 www/auth/login-admin.php                                 | 2 +-
 www/auth/login-cas-ldap.php                              | 4 ++--
 www/auth/login-ldapmulti.php                             | 2 +-
 www/auth/login-radius.php                                | 2 +-
 www/auth/login-tlsclient.php                             | 2 +-
 www/auth/login-wayf-ldap.php                             | 2 +-
 www/auth/login.php                                       | 2 +-
 www/authmemcookie.php                                    | 2 +-
 www/errorreport.php                                      | 2 +-
 www/example-simple/attributequery.php                    | 2 +-
 www/example-simple/saml2-example.php                     | 2 +-
 www/example-simple/shib13-example.php                    | 2 +-
 www/example-simple/wsfed-example.php                     | 2 +-
 www/index.php                                            | 2 +-
 www/saml2/sp/AssertionConsumerService.php                | 4 ++--
 www/saml2/sp/SingleLogoutService.php                     | 2 +-
 www/saml2/sp/initSLO.php                                 | 4 ++--
 www/saml2/sp/initSSO.php                                 | 4 ++--
 www/shib13/sp/AssertionConsumerService.php               | 2 +-
 www/shib13/sp/initSSO.php                                | 6 +++---
 www/wsfed/sp/initSLO.php                                 | 4 ++--
 www/wsfed/sp/initSSO.php                                 | 4 ++--
 www/wsfed/sp/prp.php                                     | 4 ++--
 65 files changed, 92 insertions(+), 93 deletions(-)

diff --git a/lib/SimpleSAML/Auth/BWC.php b/lib/SimpleSAML/Auth/BWC.php
index 2866f11c2..290c514b5 100644
--- a/lib/SimpleSAML/Auth/BWC.php
+++ b/lib/SimpleSAML/Auth/BWC.php
@@ -120,7 +120,7 @@ class SimpleSAML_Auth_BWC extends SimpleSAML_Auth_Simple {
 
 		$config = SimpleSAML_Configuration::getInstance();
 		$authurl = '/' . $config->getBaseURL() . $this->auth;
-		SimpleSAML_Utilities::redirect($authurl, array(
+		SimpleSAML_Utilities::redirectTrustedURL($authurl, array(
 			'RelayState' => $relayState,
 			'AuthId' => $authId,
 			'protocol' => 'saml2',
@@ -143,20 +143,19 @@ class SimpleSAML_Auth_BWC extends SimpleSAML_Auth_Simple {
 		$session = SimpleSAML_Session::getInstance();
 		if (!$session->isValid($this->authority)) {
 			/* Not authenticated to this authentication source. */
-			SimpleSAML_Utilities::redirect($url);
+			SimpleSAML_Utilities::redirectUntrustedURL($url);
 			assert('FALSE');
 		}
 
 		if ($this->authority === 'saml2') {
 			$config = SimpleSAML_Configuration::getInstance();
-			SimpleSAML_Utilities::redirect('/' . $config->getBaseURL() . 'saml2/sp/initSLO.php',
+			SimpleSAML_Utilities::redirectUntrustedURL('/' . $config->getBaseURL() . 'saml2/sp/initSLO.php',
 				array('RelayState' => $url)
 			);
 		}
 
 		$session->doLogout($this->authority);
-
-		SimpleSAML_Utilities::redirect($url);
+		SimpleSAML_Utilities::redirectUntrustedURL($url);
 	}
 
 }
diff --git a/lib/SimpleSAML/Auth/Default.php b/lib/SimpleSAML/Auth/Default.php
index 39cc174f3..34686aa2d 100644
--- a/lib/SimpleSAML/Auth/Default.php
+++ b/lib/SimpleSAML/Auth/Default.php
@@ -121,7 +121,7 @@ class SimpleSAML_Auth_Default {
 
 		if (is_string($return)) {
 			/* Redirect... */
-			SimpleSAML_Utilities::redirect($return);
+			SimpleSAML_Utilities::redirectUntrustedURL($return);
 		} else {
 			call_user_func($return, $state);
 			assert('FALSE');
@@ -184,7 +184,7 @@ class SimpleSAML_Auth_Default {
 		self::initLogoutReturn($returnURL, $authority);
 
 		/* Redirect... */
-		SimpleSAML_Utilities::redirect($returnURL);
+		SimpleSAML_Utilities::redirectUntrustedURL($returnURL);
 	}
 
 
@@ -202,7 +202,7 @@ class SimpleSAML_Auth_Default {
 		$returnURL = $state['SimpleSAML_Auth_Default.ReturnURL'];
 
 		/* Redirect... */
-		SimpleSAML_Utilities::redirect($returnURL);
+		SimpleSAML_Utilities::redirectUntrustedURL($returnURL);
 	}
 
 
diff --git a/lib/SimpleSAML/Auth/ProcessingChain.php b/lib/SimpleSAML/Auth/ProcessingChain.php
index 238b58f84..da0453264 100644
--- a/lib/SimpleSAML/Auth/ProcessingChain.php
+++ b/lib/SimpleSAML/Auth/ProcessingChain.php
@@ -248,7 +248,7 @@ class SimpleSAML_Auth_ProcessingChain {
 			 * in $state['ReturnURL'].
 			 */
 			$id = SimpleSAML_Auth_State::saveState($state, self::COMPLETED_STAGE);
-			SimpleSAML_Utilities::redirect($state['ReturnURL'], array(self::AUTHPARAM => $id));
+			SimpleSAML_Utilities::redirectUntrustedURL($state['ReturnURL'], array(self::AUTHPARAM => $id));
 		} else {
 			/* Pass the state to the function defined in $state['ReturnCall']. */
 
diff --git a/lib/SimpleSAML/Auth/Simple.php b/lib/SimpleSAML/Auth/Simple.php
index 0041dddb9..8577379e8 100644
--- a/lib/SimpleSAML/Auth/Simple.php
+++ b/lib/SimpleSAML/Auth/Simple.php
@@ -219,7 +219,7 @@ class SimpleSAML_Auth_Simple {
 				$params[$state['ReturnStateParam']] = $stateID;
 			}
 
-			SimpleSAML_Utilities::redirect($state['ReturnTo'], $params);
+			SimpleSAML_Utilities::redirectUntrustedURL($state['ReturnTo'], $params);
 		}
 	}
 
diff --git a/lib/SimpleSAML/Auth/State.php b/lib/SimpleSAML/Auth/State.php
index 5eb1b555e..57387665d 100644
--- a/lib/SimpleSAML/Auth/State.php
+++ b/lib/SimpleSAML/Auth/State.php
@@ -232,7 +232,7 @@ class SimpleSAML_Auth_State {
 				throw new SimpleSAML_Error_NoState();
 			}
 
-			SimpleSAML_Utilities::redirect($restartURL);
+			SimpleSAML_Utilities::redirectTrustedURL($restartURL);
 		}
 
 		$state = unserialize($state);
@@ -256,7 +256,7 @@ class SimpleSAML_Auth_State {
 				throw new Exception($msg);
 			}
 
-			SimpleSAML_Utilities::redirect($restartURL);
+			SimpleSAML_Utilities::redirectTrustedURL($restartURL);
 		}
 
 		return $state;
@@ -301,7 +301,7 @@ class SimpleSAML_Auth_State {
 			$id = self::saveState($state, self::EXCEPTION_STAGE);
 
 			/* Redirect to the exception handler. */
-			SimpleSAML_Utilities::redirect($state[self::EXCEPTION_HANDLER_URL], array(self::EXCEPTION_PARAM => $id));
+			SimpleSAML_Utilities::redirectTrustedURL($state[self::EXCEPTION_HANDLER_URL], array(self::EXCEPTION_PARAM => $id));
 
 		} elseif (array_key_exists(self::EXCEPTION_HANDLER_FUNC, $state)) {
 			/* Call the exception handler. */
diff --git a/lib/SimpleSAML/IdP.php b/lib/SimpleSAML/IdP.php
index de19898bf..630662dd7 100644
--- a/lib/SimpleSAML/IdP.php
+++ b/lib/SimpleSAML/IdP.php
@@ -529,7 +529,7 @@ class SimpleSAML_IdP {
 	public static function finishLogoutRedirect(SimpleSAML_IdP $idp, array $state) {
 		assert('isset($state["core:Logout:URL"])');
 
-		SimpleSAML_Utilities::redirect($state['core:Logout:URL']);
+		SimpleSAML_Utilities::redirectUntrustedURL($state['core:Logout:URL']);
 		assert('FALSE');
 	}
 
diff --git a/lib/SimpleSAML/IdP/LogoutIFrame.php b/lib/SimpleSAML/IdP/LogoutIFrame.php
index 094c1a4b4..d0c7eee45 100644
--- a/lib/SimpleSAML/IdP/LogoutIFrame.php
+++ b/lib/SimpleSAML/IdP/LogoutIFrame.php
@@ -49,7 +49,7 @@ class SimpleSAML_IdP_LogoutIFrame extends SimpleSAML_IdP_LogoutHandler {
 		}
 
 		$url = SimpleSAML_Module::getModuleURL('core/idp/logout-iframe.php', $params);
-		SimpleSAML_Utilities::redirect($url);
+		SimpleSAML_Utilities::redirectTrustedURL($url);
 	}
 
 
diff --git a/lib/SimpleSAML/IdP/LogoutTraditional.php b/lib/SimpleSAML/IdP/LogoutTraditional.php
index 5a4846608..86ce301e9 100644
--- a/lib/SimpleSAML/IdP/LogoutTraditional.php
+++ b/lib/SimpleSAML/IdP/LogoutTraditional.php
@@ -30,7 +30,7 @@ class SimpleSAML_IdP_LogoutTraditional extends SimpleSAML_IdP_LogoutHandler {
 		try {
 			$idp = SimpleSAML_IdP::getByState($association);
 			$url = call_user_func(array($association['Handler'], 'getLogoutURL'), $idp, $association, $relayState);
-			SimpleSAML_Utilities::redirect($url);
+			SimpleSAML_Utilities::redirectTrustedURL($url);
 		} catch (Exception $e) {
 			SimpleSAML_Logger::warning('Unable to initialize logout to ' . var_export($id, TRUE) . '.');
 			$this->idp->terminateAssociation($id);
diff --git a/lib/SimpleSAML/XHTML/IdPDisco.php b/lib/SimpleSAML/XHTML/IdPDisco.php
index 4b7e51494..c1c5be0c4 100644
--- a/lib/SimpleSAML/XHTML/IdPDisco.php
+++ b/lib/SimpleSAML/XHTML/IdPDisco.php
@@ -463,7 +463,7 @@ class SimpleSAML_XHTML_IdPDisco {
 			$extDiscoveryStorage = $this->config->getString('idpdisco.extDiscoveryStorage', NULL);
 			if ($extDiscoveryStorage !== NULL) {
 				$this->log('Choice made [' . $idp . '] (Forwarding to external discovery storage)');
-				SimpleSAML_Utilities::redirect($extDiscoveryStorage, array(
+				SimpleSAML_Utilities::redirectTrustedURL($extDiscoveryStorage, array(
 //					$this->returnIdParam => $idp,
 					'entityID' => $this->spEntityId,
 					'IdPentityID' => $idp,
@@ -474,7 +474,7 @@ class SimpleSAML_XHTML_IdPDisco {
 				
 			} else {
 				$this->log('Choice made [' . $idp . '] (Redirecting the user back. returnIDParam=' . $this->returnIdParam . ')');
-				SimpleSAML_Utilities::redirect($this->returnURL, array($this->returnIdParam => $idp));
+				SimpleSAML_Utilities::redirectUntrustedURL($this->returnURL, array($this->returnIdParam => $idp));
 			}
 			
 			return;
@@ -482,7 +482,7 @@ class SimpleSAML_XHTML_IdPDisco {
 		
 		if ($this->isPassive) {
 			$this->log('Choice not made. (Redirecting the user back without answer)');
-			SimpleSAML_Utilities::redirect($this->returnURL);
+			SimpleSAML_Utilities::redirectUntrustedURL($this->returnURL);
 			return;
 		}
 
@@ -500,7 +500,7 @@ class SimpleSAML_XHTML_IdPDisco {
         
         if(sizeof($idpintersection)  == 1) {
             $this->log('Choice made [' . $idpintersection[0] . '] (Redirecting the user back. returnIDParam=' . $this->returnIdParam . ')');
-            SimpleSAML_Utilities::redirect($this->returnURL, array($this->returnIdParam => $idpintersection[0]));
+            SimpleSAML_Utilities::redirectUntrustedURL($this->returnURL, array($this->returnIdParam => $idpintersection[0]));
         }
 
 		/*
diff --git a/modules/InfoCard/lib/Auth/Source/ICAuth.php b/modules/InfoCard/lib/Auth/Source/ICAuth.php
index 5f11dc2ae..39e746c56 100644
--- a/modules/InfoCard/lib/Auth/Source/ICAuth.php
+++ b/modules/InfoCard/lib/Auth/Source/ICAuth.php
@@ -37,7 +37,7 @@ class sspmod_InfoCard_Auth_Source_ICAuth extends SimpleSAML_Auth_Source {
 		$state[self::AUTHID] = $this->authId;
 		$id = SimpleSAML_Auth_State::saveState($state, self::STAGEID);
 		$url = SimpleSAML_Module::getModuleURL('InfoCard/login-infocard.php');
-		SimpleSAML_Utilities::redirect($url, array('AuthState' => $id));
+		SimpleSAML_Utilities::redirectTrustedURL($url, array('AuthState' => $id));
 	}
 	
 
diff --git a/modules/adfs/lib/IdP/ADFS.php b/modules/adfs/lib/IdP/ADFS.php
index 1353d01bc..0594cc78e 100644
--- a/modules/adfs/lib/IdP/ADFS.php
+++ b/modules/adfs/lib/IdP/ADFS.php
@@ -171,7 +171,7 @@ class sspmod_adfs_IdP_ADFS {
 		// NB:: we don't know from which SP the logout request came from
 		$metadata = SimpleSAML_Metadata_MetaDataStorageHandler::getMetadataHandler();
 		$idpMetadata = $idp->getConfig();
-		SimpleSAML_Utilities::redirect($idpMetadata->getValue('redirect-after-logout', SimpleSAML_Utilities::getBaseURL()));
+		SimpleSAML_Utilities::redirectTrustedURL($idpMetadata->getValue('redirect-after-logout', SimpleSAML_Utilities::getBaseURL()));
 	}
 	
 	public static function receiveLogoutMessage(SimpleSAML_IdP $idp) {
diff --git a/modules/aselect/lib/Auth/Source/aselect.php b/modules/aselect/lib/Auth/Source/aselect.php
index c7cb88d2f..c503361e1 100644
--- a/modules/aselect/lib/Auth/Source/aselect.php
+++ b/modules/aselect/lib/Auth/Source/aselect.php
@@ -52,7 +52,7 @@ class sspmod_aselect_Auth_Source_aselect extends SimpleSAML_Auth_Source {
 			$app_url = SimpleSAML_Module::getModuleURL('aselect/credentials.php', array('ssp_state' => $id));
 			$as_url = $this->request_authentication($app_url);
 
-			SimpleSAML_Utilities::redirect($as_url);
+			SimpleSAML_Utilities::redirectTrustedURL($as_url);
 		} catch(Exception $e) {
 			// attach the exception to the state
 			SimpleSAML_Auth_State::throwException($state, $e);
diff --git a/modules/authYubiKey/lib/Auth/Source/YubiKey.php b/modules/authYubiKey/lib/Auth/Source/YubiKey.php
index 1381ee68f..ae98920d6 100644
--- a/modules/authYubiKey/lib/Auth/Source/YubiKey.php
+++ b/modules/authYubiKey/lib/Auth/Source/YubiKey.php
@@ -104,7 +104,7 @@ class sspmod_authYubiKey_Auth_Source_YubiKey extends SimpleSAML_Auth_Source {
 		$id = SimpleSAML_Auth_State::saveState($state, self::STAGEID);
 
 		$url = SimpleSAML_Module::getModuleURL('authYubiKey/yubikeylogin.php');
-		SimpleSAML_Utilities::redirect($url, array('AuthState' => $id));
+		SimpleSAML_Utilities::redirectTrustedURL($url, array('AuthState' => $id));
 	}
 	
 	
diff --git a/modules/authfacebook/lib/Auth/Source/Facebook.php b/modules/authfacebook/lib/Auth/Source/Facebook.php
index 67ab3cbf0..5c2e62dd1 100644
--- a/modules/authfacebook/lib/Auth/Source/Facebook.php
+++ b/modules/authfacebook/lib/Auth/Source/Facebook.php
@@ -80,7 +80,7 @@ class sspmod_authfacebook_Auth_Source_Facebook extends SimpleSAML_Auth_Source {
 		$url = $facebook->getLoginUrl(array('redirect_uri' => $linkback, 'scope' => $this->req_perms));
 		SimpleSAML_Auth_State::saveState($state, self::STAGE_INIT);
 
-		SimpleSAML_Utilities::redirect($url);
+		SimpleSAML_Utilities::redirectTrustedURL($url);
 	}
 		
 
diff --git a/modules/authorize/lib/Auth/Process/Authorize.php b/modules/authorize/lib/Auth/Process/Authorize.php
index cd8155601..ab573fed3 100644
--- a/modules/authorize/lib/Auth/Process/Authorize.php
+++ b/modules/authorize/lib/Auth/Process/Authorize.php
@@ -129,7 +129,7 @@ class sspmod_authorize_Auth_Process_Authorize extends SimpleSAML_Auth_Processing
 			'authorize:Authorize');
 		$url = SimpleSAML_Module::getModuleURL(
 			'authorize/authorize_403.php');
-		SimpleSAML_Utilities::redirect($url, array('StateId' => $id));
+		SimpleSAML_Utilities::redirectTrustedURL($url, array('StateId' => $id));
 	}
 }
 
diff --git a/modules/authwindowslive/lib/Auth/Source/LiveID.php b/modules/authwindowslive/lib/Auth/Source/LiveID.php
index 2dcd532bf..cbbff0ffb 100644
--- a/modules/authwindowslive/lib/Auth/Source/LiveID.php
+++ b/modules/authwindowslive/lib/Auth/Source/LiveID.php
@@ -72,7 +72,7 @@ class sspmod_authwindowslive_Auth_Source_LiveID extends SimpleSAML_Auth_Source {
 				. '&wrap_scope=WL_Profiles.View,Messenger.SignIn'
 		;
 
-                SimpleSAML_Utilities::redirect($authorizeURL);
+                SimpleSAML_Utilities::redirectTrustedURL($authorizeURL);
 	}
 
 
diff --git a/modules/cas/lib/Auth/Source/CAS.php b/modules/cas/lib/Auth/Source/CAS.php
index faa52d09c..e1f2a93a0 100644
--- a/modules/cas/lib/Auth/Source/CAS.php
+++ b/modules/cas/lib/Auth/Source/CAS.php
@@ -206,7 +206,7 @@ class sspmod_cas_Auth_Source_CAS  extends SimpleSAML_Auth_Source  {
 
 		$serviceUrl = SimpleSAML_Module::getModuleURL('cas/linkback.php', array('stateID' => $stateID));
 
-		SimpleSAML_Utilities::redirect($this->_loginMethod, array(
+		SimpleSAML_Utilities::redirectTrustedURL($this->_loginMethod, array(
 			'service' => $serviceUrl));
 	}
 
@@ -230,7 +230,7 @@ class sspmod_cas_Auth_Source_CAS  extends SimpleSAML_Auth_Source  {
 
 		SimpleSAML_Auth_State::deleteState($state);
 		// we want cas to log us out
-		SimpleSAML_Utilities::redirect($logoutUrl, array());
+		SimpleSAML_Utilities::redirectTrustedURL($logoutUrl);
 	}
 
 }
diff --git a/modules/casserver/www/login.php b/modules/casserver/www/login.php
index be417d336..e59c33248 100644
--- a/modules/casserver/www/login.php
+++ b/modules/casserver/www/login.php
@@ -48,7 +48,7 @@ storeTicket($ticket, $path, array('service' => $service,
 	'proxies' => array(),
 	'validbefore' => time() + 5));
 
-SimpleSAML_Utilities::redirect(
+SimpleSAML_Utilities::redirectUntrustedURL(
 	SimpleSAML_Utilities::addURLparameter($service,
 		array('ticket' => $ticket)
 	)
diff --git a/modules/cdc/lib/Server.php b/modules/cdc/lib/Server.php
index 5f7636ccc..403ff950b 100644
--- a/modules/cdc/lib/Server.php
+++ b/modules/cdc/lib/Server.php
@@ -325,7 +325,7 @@ class sspmod_cdc_Server {
 
 		$url = SimpleSAML_Utilities::addURLparameter($to, $params);
 		if (strlen($url) < 2048) {
-			SimpleSAML_Utilities::redirect($url);
+			SimpleSAML_Utilities::redirectUntrustedURL($url);
 		} else {
 			SimpleSAML_Utilities::postRedirect($to, $params);
 		}
diff --git a/modules/consent/lib/Auth/Process/Consent.php b/modules/consent/lib/Auth/Process/Consent.php
index 25067ec97..eaacd3eb7 100644
--- a/modules/consent/lib/Auth/Process/Consent.php
+++ b/modules/consent/lib/Auth/Process/Consent.php
@@ -278,7 +278,7 @@ class sspmod_consent_Auth_Process_Consent extends SimpleSAML_Auth_ProcessingFilt
         // Save state and redirect
         $id  = SimpleSAML_Auth_State::saveState($state, 'consent:request');
         $url = SimpleSAML_Module::getModuleURL('consent/getconsent.php');
-        SimpleSAML_Utilities::redirect($url, array('StateId' => $id));
+        SimpleSAML_Utilities::redirectTrustedURL($url, array('StateId' => $id));
     }
 
     /**
diff --git a/modules/consent/lib/Logout.php b/modules/consent/lib/Logout.php
index ad7ca4e11..f605e9892 100644
--- a/modules/consent/lib/Logout.php
+++ b/modules/consent/lib/Logout.php
@@ -10,7 +10,7 @@ class sspmod_consent_Logout {
 
 	public static function postLogout(SimpleSAML_IdP $idp, array $state) {
 		$url = SimpleSAML_Module::getModuleURL('consent/logout_completed.php');
-		SimpleSAML_Utilities::redirect($url);
+		SimpleSAML_Utilities::redirectTrustedURL($url);
 	}
 
 }
diff --git a/modules/core/lib/Auth/Process/WarnShortSSOInterval.php b/modules/core/lib/Auth/Process/WarnShortSSOInterval.php
index 6d250ed0e..6ac34d7c1 100644
--- a/modules/core/lib/Auth/Process/WarnShortSSOInterval.php
+++ b/modules/core/lib/Auth/Process/WarnShortSSOInterval.php
@@ -47,7 +47,7 @@ class sspmod_core_Auth_Process_WarnShortSSOInterval extends SimpleSAML_Auth_Proc
 		/* Save state and redirect. */
 		$id = SimpleSAML_Auth_State::saveState($state, 'core:short_sso_interval');
 		$url = SimpleSAML_Module::getModuleURL('core/short_sso_interval.php');
-		SimpleSAML_Utilities::redirect($url, array('StateId' => $id));
+		SimpleSAML_Utilities::redirectTrustedURL($url, array('StateId' => $id));
 	}
 
 }
diff --git a/modules/core/lib/Auth/UserPassBase.php b/modules/core/lib/Auth/UserPassBase.php
index 80eae48ee..633a7484a 100644
--- a/modules/core/lib/Auth/UserPassBase.php
+++ b/modules/core/lib/Auth/UserPassBase.php
@@ -158,7 +158,7 @@ abstract class sspmod_core_Auth_UserPassBase extends SimpleSAML_Auth_Source {
 		 */
 		$url = SimpleSAML_Module::getModuleURL('core/loginuserpass.php');
 		$params = array('AuthState' => $id);
-		SimpleSAML_Utilities::redirect($url, $params);
+		SimpleSAML_Utilities::redirectTrustedURL($url, $params);
 
 		/* The previous function never returns, so this code is never executed. */
 		assert('FALSE');
diff --git a/modules/core/lib/Auth/UserPassOrgBase.php b/modules/core/lib/Auth/UserPassOrgBase.php
index dc3a92eb6..f79c3aefa 100644
--- a/modules/core/lib/Auth/UserPassOrgBase.php
+++ b/modules/core/lib/Auth/UserPassOrgBase.php
@@ -157,7 +157,7 @@ abstract class sspmod_core_Auth_UserPassOrgBase extends SimpleSAML_Auth_Source {
 
 		$url = SimpleSAML_Module::getModuleURL('core/loginuserpassorg.php');
 		$params = array('AuthState' => $id);
-		SimpleSAML_Utilities::redirect($url, $params);
+		SimpleSAML_Utilities::redirectTrustedURL($url, $params);
 	}
 
 
diff --git a/modules/core/www/as_login.php b/modules/core/www/as_login.php
index 143dde6c1..a30bd1f77 100644
--- a/modules/core/www/as_login.php
+++ b/modules/core/www/as_login.php
@@ -35,4 +35,4 @@ if (!empty($_REQUEST['saml:idp'])) {
 $as = new SimpleSAML_Auth_Simple($_REQUEST['AuthId']);
 $as->requireAuth($options);
 
-SimpleSAML_Utilities::redirect($_REQUEST['ReturnTo']);
+SimpleSAML_Utilities::redirectUntrustedURL($_REQUEST['ReturnTo']);
diff --git a/modules/core/www/bwc_resumeauth.php b/modules/core/www/bwc_resumeauth.php
index 5da50c3dc..68b205504 100644
--- a/modules/core/www/bwc_resumeauth.php
+++ b/modules/core/www/bwc_resumeauth.php
@@ -20,7 +20,7 @@ if ($requestcache['ForceAuthn'] && $requestcache['core:prevSession'] === $sessio
 }
 
 if (isset($state['ReturnTo'])) {
-	SimpleSAML_Utilities::redirect($state['ReturnTo']);
+	SimpleSAML_Utilities::redirectUntrustedURL($state['ReturnTo']);
 }
 
 foreach ($session->getAuthState($authority) as $k => $v) {
diff --git a/modules/core/www/cleardiscochoices.php b/modules/core/www/cleardiscochoices.php
index 7cf7fa03f..c94e411e2 100644
--- a/modules/core/www/cleardiscochoices.php
+++ b/modules/core/www/cleardiscochoices.php
@@ -33,5 +33,5 @@ if(array_key_exists('ReturnTo', $_REQUEST)) {
 }
 
 /* Redirect to destination. */
-SimpleSAML_Utilities::redirect($returnTo);
+SimpleSAML_Utilities::redirectUntrustedURL($returnTo);
 
diff --git a/modules/core/www/login-admin.php b/modules/core/www/login-admin.php
index 16acc1e0f..83886a181 100644
--- a/modules/core/www/login-admin.php
+++ b/modules/core/www/login-admin.php
@@ -10,5 +10,5 @@ $returnTo = $_REQUEST['ReturnTo'];
 
 SimpleSAML_Utilities::requireAdmin();
 
-SimpleSAML_Utilities::redirect($returnTo);
+SimpleSAML_Utilities::redirectUntrustedURL($returnTo);
 
diff --git a/modules/discopower/lib/PowerIdPDisco.php b/modules/discopower/lib/PowerIdPDisco.php
index 072e6afb3..bb33a3c6d 100644
--- a/modules/discopower/lib/PowerIdPDisco.php
+++ b/modules/discopower/lib/PowerIdPDisco.php
@@ -193,7 +193,7 @@ class sspmod_discopower_PowerIdPDisco extends SimpleSAML_XHTML_IdPDisco {
 			if ($this->config->getBoolean('idpdisco.extDiscoveryStorage', NULL) != NULL) {
 				$extDiscoveryStorage = $this->config->getBoolean('idpdisco.extDiscoveryStorage');
 				$this->log('Choice made [' . $idp . '] (Forwarding to external discovery storage)');
-				SimpleSAML_Utilities::redirect($extDiscoveryStorage, array(
+				SimpleSAML_Utilities::redirectTrustedURL($extDiscoveryStorage, array(
 					'entityID' => $this->spEntityId,
 					'IdPentityID' => $idp,
 					'returnIDParam' => $this->returnIdParam,
@@ -203,7 +203,7 @@ class sspmod_discopower_PowerIdPDisco extends SimpleSAML_XHTML_IdPDisco {
 				
 			} else {
 				$this->log('Choice made [' . $idp . '] (Redirecting the user back. returnIDParam=' . $this->returnIdParam . ')');
-				SimpleSAML_Utilities::redirect($this->returnURL, array($this->returnIdParam => $idp));
+				SimpleSAML_Utilities::redirectUntrustedURL($this->returnURL, array($this->returnIdParam => $idp));
 			}
 			
 			return;
@@ -211,7 +211,7 @@ class sspmod_discopower_PowerIdPDisco extends SimpleSAML_XHTML_IdPDisco {
 		
 		if ($this->isPassive) {
 			$this->log('Choice not made. (Redirecting the user back without answer)');
-			SimpleSAML_Utilities::redirect($this->returnURL);
+			SimpleSAML_Utilities::redirectUntrustedURL($this->returnURL);
 			return;
 		}
 
diff --git a/modules/exampleauth/lib/Auth/Process/RedirectTest.php b/modules/exampleauth/lib/Auth/Process/RedirectTest.php
index 02a4220d6..1ed810394 100644
--- a/modules/exampleauth/lib/Auth/Process/RedirectTest.php
+++ b/modules/exampleauth/lib/Auth/Process/RedirectTest.php
@@ -22,7 +22,7 @@ class sspmod_exampleauth_Auth_Process_RedirectTest extends SimpleSAML_Auth_Proce
 		/* Save state and redirect. */
 		$id = SimpleSAML_Auth_State::saveState($state, 'exampleauth:redirectfilter-test');
 		$url = SimpleSAML_Module::getModuleURL('exampleauth/redirecttest.php');
-		SimpleSAML_Utilities::redirect($url, array('StateId' => $id));
+		SimpleSAML_Utilities::redirectTrustedURL($url, array('StateId' => $id));
 	}
 
 }
diff --git a/modules/exampleauth/lib/Auth/Source/External.php b/modules/exampleauth/lib/Auth/Source/External.php
index fee9489aa..d3b16f020 100644
--- a/modules/exampleauth/lib/Auth/Source/External.php
+++ b/modules/exampleauth/lib/Auth/Source/External.php
@@ -156,7 +156,7 @@ class sspmod_exampleauth_Auth_Source_External extends SimpleSAML_Auth_Source {
 		 * Note the 'ReturnTo' parameter. This must most likely be replaced with
 		 * the real name of the parameter for the login page.
 		 */
-		SimpleSAML_Utilities::redirect($authPage, array(
+		SimpleSAML_Utilities::redirectTrustedURL($authPage, array(
 			'ReturnTo' => $returnTo,
 		));
 
diff --git a/modules/expirycheck/lib/Auth/Process/ExpiryDate.php b/modules/expirycheck/lib/Auth/Process/ExpiryDate.php
index 65a56ca17..113261759 100644
--- a/modules/expirycheck/lib/Auth/Process/ExpiryDate.php
+++ b/modules/expirycheck/lib/Auth/Process/ExpiryDate.php
@@ -136,7 +136,7 @@ class sspmod_expirycheck_Auth_Process_ExpiryDate extends SimpleSAML_Auth_Process
 			$state['netId'] = $netId;
 			$id = SimpleSAML_Auth_State::saveState($state, 'expirywarning:about2expire');
 			$url = SimpleSAML_Module::getModuleURL('expirycheck/about2expire.php');
-			SimpleSAML_Utilities::redirect($url, array('StateId' => $id));
+			SimpleSAML_Utilities::redirectTrustedURL($url, array('StateId' => $id));
 		}
 
 		if (!self::checkDate($expireOnDate)) {
@@ -149,7 +149,7 @@ class sspmod_expirycheck_Auth_Process_ExpiryDate extends SimpleSAML_Auth_Process
 			$state['netId'] = $netId;
 			$id = SimpleSAML_Auth_State::saveState($state, 'expirywarning:expired');
 			$url = SimpleSAML_Module::getModuleURL('expirycheck/expired.php');
-			SimpleSAML_Utilities::redirect($url, array('StateId' => $id));
+			SimpleSAML_Utilities::redirectTrustedURL($url, array('StateId' => $id));
 
 		}
 	}
diff --git a/modules/multiauth/lib/Auth/Source/MultiAuth.php b/modules/multiauth/lib/Auth/Source/MultiAuth.php
index 2b975d4fe..ea74df5a8 100644
--- a/modules/multiauth/lib/Auth/Source/MultiAuth.php
+++ b/modules/multiauth/lib/Auth/Source/MultiAuth.php
@@ -121,7 +121,7 @@ class sspmod_multiauth_Auth_Source_MultiAuth extends SimpleSAML_Auth_Source {
 			$params['source'] = $_GET['source'];
 		}
 
-		SimpleSAML_Utilities::redirect($url, $params);
+		SimpleSAML_Utilities::redirectTrustedURL($url, $params);
 
 		/* The previous function never returns, so this code is never
 		executed */
diff --git a/modules/oauth/lib/Consumer.php b/modules/oauth/lib/Consumer.php
index 734fd4336..36065fec2 100644
--- a/modules/oauth/lib/Consumer.php
+++ b/modules/oauth/lib/Consumer.php
@@ -94,7 +94,7 @@ class sspmod_oauth_Consumer {
 		}
 		$authorizeURL = SimpleSAML_Utilities::addURLparameter($url, $params);
 		if ($redirect) {
-			SimpleSAML_Utilities::redirect($authorizeURL);
+			SimpleSAML_Utilities::redirectTrustedURL($authorizeURL);
 			exit;
 		}	
 		return $authorizeURL;
diff --git a/modules/oauth/www/authorize.php b/modules/oauth/www/authorize.php
index a2329d1ba..9b3e032e1 100644
--- a/modules/oauth/www/authorize.php
+++ b/modules/oauth/www/authorize.php
@@ -56,11 +56,11 @@ try {
 
 	if ($url) {
 		// If authorize() returns a URL, take user there (oauth1.0a)
-		SimpleSAML_Utilities::redirect($url);
+		SimpleSAML_Utilities::redirectUntrustedURL($url);
 	} 
 	else if (isset($_REQUEST['oauth_callback'])) {
 		// If callback was provided in the request (oauth1.0)
-		SimpleSAML_Utilities::redirect($_REQUEST['oauth_callback']);
+		SimpleSAML_Utilities::redirectUntrustedURL($_REQUEST['oauth_callback']);
 	
 	} else {
 		// No callback provided, display standard template
diff --git a/modules/openid/lib/Auth/Source/OpenIDConsumer.php b/modules/openid/lib/Auth/Source/OpenIDConsumer.php
index 2144ad1b0..ce5a758be 100644
--- a/modules/openid/lib/Auth/Source/OpenIDConsumer.php
+++ b/modules/openid/lib/Auth/Source/OpenIDConsumer.php
@@ -123,7 +123,7 @@ class sspmod_openid_Auth_Source_OpenIDConsumer extends SimpleSAML_Auth_Source {
 		$id = SimpleSAML_Auth_State::saveState($state, 'openid:init');
 
 		$url = SimpleSAML_Module::getModuleURL('openid/consumer.php');
-		SimpleSAML_Utilities::redirect($url, array('AuthState' => $id));
+		SimpleSAML_Utilities::redirectTrustedURL($url, array('AuthState' => $id));
 	}
 
 
@@ -251,7 +251,7 @@ class sspmod_openid_Auth_Source_OpenIDConsumer extends SimpleSAML_Auth_Source {
 
 			// For OpenID 2 failover to POST if redirect URL is longer than 2048
 			if ($should_send_redirect || strlen($redirect_url) <= 2048) {
-				SimpleSAML_Utilities::redirect($redirect_url);
+				SimpleSAML_Utilities::redirectTrustedURL($redirect_url);
 				assert('FALSE');
 			}
 		}
diff --git a/modules/openidProvider/lib/Server.php b/modules/openidProvider/lib/Server.php
index 417191e17..f0596d18f 100644
--- a/modules/openidProvider/lib/Server.php
+++ b/modules/openidProvider/lib/Server.php
@@ -401,7 +401,7 @@ class sspmod_openidProvider_Server {
 			}
 
 			$trustURL = $this->getStateURL('trust.php', $state);
-			SimpleSAML_Utilities::redirect($trustURL);
+			SimpleSAML_Utilities::redirectTrustedURL($trustURL);
 		}
 
 		if (!$trusted) {
diff --git a/modules/openidProvider/www/user.php b/modules/openidProvider/www/user.php
index 696476286..74aa1a7c8 100644
--- a/modules/openidProvider/www/user.php
+++ b/modules/openidProvider/www/user.php
@@ -15,7 +15,7 @@ if (!$userId && $identity) {
 	 * We are accessing the front-page, but are logged in.
 	 * Redirect to the correct page.
 	 */
-	SimpleSAML_Utilities::redirect($identity);
+	SimpleSAML_Utilities::redirectTrustedURL($identity);
 }
 
 /* Determine whether we are at the users own page. */
@@ -39,7 +39,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
 		}
 	}
 
-	SimpleSAML_Utilities::redirect($identity);
+	SimpleSAML_Utilities::redirectTrustedURL($identity);
 }
 
 if ($ownPage) {
diff --git a/modules/preprodwarning/lib/Auth/Process/Warning.php b/modules/preprodwarning/lib/Auth/Process/Warning.php
index 089801534..b9ea10ed9 100644
--- a/modules/preprodwarning/lib/Auth/Process/Warning.php
+++ b/modules/preprodwarning/lib/Auth/Process/Warning.php
@@ -29,7 +29,7 @@ class sspmod_preprodwarning_Auth_Process_Warning extends SimpleSAML_Auth_Process
 		/* Save state and redirect. */
 		$id = SimpleSAML_Auth_State::saveState($state, 'warning:request');
 		$url = SimpleSAML_Module::getModuleURL('preprodwarning/showwarning.php');
-		SimpleSAML_Utilities::redirect($url, array('StateId' => $id));
+		SimpleSAML_Utilities::redirectTrustedURL($url, array('StateId' => $id));
 	}
 	
 
diff --git a/modules/saml/lib/Auth/Process/ExpectedAuthnContextClassRef.php b/modules/saml/lib/Auth/Process/ExpectedAuthnContextClassRef.php
index 4ee754bb5..bfc2dc180 100644
--- a/modules/saml/lib/Auth/Process/ExpectedAuthnContextClassRef.php
+++ b/modules/saml/lib/Auth/Process/ExpectedAuthnContextClassRef.php
@@ -80,6 +80,6 @@ class sspmod_saml_Auth_Process_ExpectedAuthnContextClassRef extends SimpleSAML_A
 		$id = SimpleSAML_Auth_State::saveState($request, 'saml:ExpectedAuthnContextClassRef:unauthorized');
 		$url = SimpleSAML_Module::getModuleURL(
 			'saml/sp/wrong_authncontextclassref.php');
-		SimpleSAML_Utilities::redirect($url, array('StateId' => $id));
+		SimpleSAML_Utilities::redirectTrustedURL($url, array('StateId' => $id));
 	}
 }
diff --git a/modules/saml/lib/Auth/Source/SP.php b/modules/saml/lib/Auth/Source/SP.php
index 9bc623468..a2b223588 100644
--- a/modules/saml/lib/Auth/Source/SP.php
+++ b/modules/saml/lib/Auth/Source/SP.php
@@ -168,7 +168,7 @@ class sspmod_saml_Auth_Source_SP extends SimpleSAML_Auth_Source {
 
 		SimpleSAML_Logger::debug('Starting SAML 1 SSO to ' . var_export($idpEntityId, TRUE) .
 			' from ' . var_export($this->entityId, TRUE) . '.');
-		SimpleSAML_Utilities::redirect($url);
+		SimpleSAML_Utilities::redirectTrustedURL($url);
 	}
 
 
@@ -355,7 +355,7 @@ class sspmod_saml_Auth_Source_SP extends SimpleSAML_Auth_Source {
 			$params['isPassive'] = 'true';
 		}
 
-		SimpleSAML_Utilities::redirect($discoURL, $params);
+		SimpleSAML_Utilities::redirectTrustedURL($discoURL, $params);
 	}
 
 
diff --git a/modules/saml/www/sp/saml2-acs.php b/modules/saml/www/sp/saml2-acs.php
index 4c4b6db29..a3c8200bc 100644
--- a/modules/saml/www/sp/saml2-acs.php
+++ b/modules/saml/www/sp/saml2-acs.php
@@ -45,7 +45,7 @@ if ($prevAuth !== NULL && $prevAuth['id'] === $response->getId() && $prevAuth['i
 	 * instead of displaying a confusing error message.
 	 */
 	SimpleSAML_Logger::info('Duplicate SAML 2 response detected - ignoring the response and redirecting the user to the correct page.');
-	SimpleSAML_Utilities::redirect($prevAuth['redirect']);
+	SimpleSAML_Utilities::redirectTrustedURL($prevAuth['redirect']);
 }
 
 $idpMetadata = array();
diff --git a/www/auth/login-admin.php b/www/auth/login-admin.php
index f660dd941..42ac0ecf0 100644
--- a/www/auth/login-admin.php
+++ b/www/auth/login-admin.php
@@ -59,7 +59,7 @@ if (isset($_POST['password'])) {
 		else 
 			SimpleSAML_Logger::stats('AUTH-login-admin OK');
 		
-		SimpleSAML_Utilities::redirect($relaystate);
+		SimpleSAML_Utilities::redirectUntrustedURL($relaystate);
 		exit(0);
 	} else {
 		SimpleSAML_Logger::stats('AUTH-login-admin Failed');
diff --git a/www/auth/login-cas-ldap.php b/www/auth/login-cas-ldap.php
index dff33f1fd..2ba907ade 100644
--- a/www/auth/login-cas-ldap.php
+++ b/www/auth/login-cas-ldap.php
@@ -104,7 +104,7 @@ function casValidate($cas) {
 	 */
 	} else {
 		SimpleSAML_Logger::info("AUTH - cas-ldap: redirecting to {$cas['login']}");
-		SimpleSAML_Utilities::redirect($cas['login'], array(
+		SimpleSAML_Utilities::redirectTrustedURL($cas['login'], array(
 			'service' => $service
 		));		
 	}
@@ -132,7 +132,7 @@ try {
 	$session->setNameID(array(
 			'value' => SimpleSAML_Utilities::generateID(),
 			'Format' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient'));
-	SimpleSAML_Utilities::redirect($relaystate);
+	SimpleSAML_Utilities::redirectUntrustedURL($relaystate);
 
 } catch(Exception $exception) {
 	throw new SimpleSAML_Error_Error('CASERROR', $exception);
diff --git a/www/auth/login-ldapmulti.php b/www/auth/login-ldapmulti.php
index 9e070b41a..aab198afc 100644
--- a/www/auth/login-ldapmulti.php
+++ b/www/auth/login-ldapmulti.php
@@ -71,7 +71,7 @@ if (isset($_POST['username'])) {
 				
 				
 		$returnto = $_REQUEST['RelayState'];
-		SimpleSAML_Utilities::redirect($returnto);
+		SimpleSAML_Utilities::redirectUntrustedURL($returnto);
 
 	} catch (Exception $e) {
 		
diff --git a/www/auth/login-radius.php b/www/auth/login-radius.php
index 73e24b601..b95c7ae92 100644
--- a/www/auth/login-radius.php
+++ b/www/auth/login-radius.php
@@ -110,7 +110,7 @@ if (isset($_POST['username'])) {
 
 	
 				$returnto = $_REQUEST['RelayState'];
-				SimpleSAML_Utilities::redirect($returnto);
+				SimpleSAML_Utilities::redirectUntrustedURL($returnto);
 				
 	
 			case RADIUS_ACCESS_REJECT:
diff --git a/www/auth/login-tlsclient.php b/www/auth/login-tlsclient.php
index 3fe22faf1..42e2678ae 100644
--- a/www/auth/login-tlsclient.php
+++ b/www/auth/login-tlsclient.php
@@ -69,7 +69,7 @@ try {
 		
 
 	$returnto = $_REQUEST['RelayState'];
-	SimpleSAML_Utilities::redirect($returnto);	
+	SimpleSAML_Utilities::redirectUntrustedURL($returnto);
 	
 	
 } catch (Exception $e) {
diff --git a/www/auth/login-wayf-ldap.php b/www/auth/login-wayf-ldap.php
index 980e482a1..73d5f57a4 100644
--- a/www/auth/login-wayf-ldap.php
+++ b/www/auth/login-wayf-ldap.php
@@ -59,7 +59,7 @@ if ($username = $_POST['username']) {
 			$session->setNameID(array(
 					'value' => SimpleSAML_Utilities::generateID(),
 					'Format' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient'));
-			SimpleSAML_Utilities::redirect($relaystate);
+			SimpleSAML_Utilities::redirectUntrustedURL($relaystate);
 		}
 	} catch(Exception $e) {
 			throw new SimpleSAML_Error_Error('LDAPERROR', $e);
diff --git a/www/auth/login.php b/www/auth/login.php
index 308cc283f..57ccd3b58 100644
--- a/www/auth/login.php
+++ b/www/auth/login.php
@@ -126,7 +126,7 @@ if (isset($_POST['username'])) {
 			
 
 		$returnto = $_REQUEST['RelayState'];
-		SimpleSAML_Utilities::redirect($returnto);	
+		SimpleSAML_Utilities::redirectUntrustedURL($returnto);	
 		
 		
 	} catch (Exception $e) {
diff --git a/www/authmemcookie.php b/www/authmemcookie.php
index b6b398fdf..a4e877a7c 100644
--- a/www/authmemcookie.php
+++ b/www/authmemcookie.php
@@ -109,7 +109,7 @@ try {
 	$session->registerLogoutHandler('SimpleSAML_AuthMemCookie', 'logoutHandler');
 
 	/* Redirect the user back to this page to signal that the login is completed. */
-	SimpleSAML_Utilities::redirect(SimpleSAML_Utilities::selfURL());
+	SimpleSAML_Utilities::redirectTrustedURL(SimpleSAML_Utilities::selfURL());
 } catch(Exception $e) {
 	throw new SimpleSAML_Error_Error('CONFIG', $e);
 }
diff --git a/www/errorreport.php b/www/errorreport.php
index 101eae951..580a2bd39 100644
--- a/www/errorreport.php
+++ b/www/errorreport.php
@@ -99,4 +99,4 @@ if ($config->getBoolean('errorreporting', TRUE) && $toAddress !== 'na@example.or
 }
 
 /* Redirect the user back to this page to clear the POST request. */
-SimpleSAML_Utilities::redirect(SimpleSAML_Utilities::selfURLNoQuery());
+SimpleSAML_Utilities::redirectTrustedURL(SimpleSAML_Utilities::selfURLNoQuery());
diff --git a/www/example-simple/attributequery.php b/www/example-simple/attributequery.php
index 8ec2fc614..835baa3b1 100644
--- a/www/example-simple/attributequery.php
+++ b/www/example-simple/attributequery.php
@@ -61,7 +61,7 @@ function handleResponse() {
 	$data['attributes'] = $assertion->getAttributes();
 	$GLOBALS['session']->setData('attributequeryexample:data', $dataId, $data, 3600);
 
-	SimpleSAML_Utilities::redirect(SimpleSAML_Utilities::selfURLNoQuery(),
+	SimpleSAML_Utilities::redirectTrustedURL(SimpleSAML_Utilities::selfURLNoQuery(),
 		array('dataId' => $dataId));
 }
 
diff --git a/www/example-simple/saml2-example.php b/www/example-simple/saml2-example.php
index c0483c9e8..8c80d1bdc 100644
--- a/www/example-simple/saml2-example.php
+++ b/www/example-simple/saml2-example.php
@@ -41,7 +41,7 @@ $session = SimpleSAML_Session::getInstance();
  * retrieving attributes from the session.
  */
 if (!$session->isValid('saml2') ) {
-	SimpleSAML_Utilities::redirect(
+	SimpleSAML_Utilities::redirectTrustedURL(
 		'/' . $config->getBaseURL() . 'saml2/sp/initSSO.php',
 		array('RelayState' => SimpleSAML_Utilities::selfURL())
 	);
diff --git a/www/example-simple/shib13-example.php b/www/example-simple/shib13-example.php
index dbec3bc41..0dfa07daa 100644
--- a/www/example-simple/shib13-example.php
+++ b/www/example-simple/shib13-example.php
@@ -41,7 +41,7 @@ $session = SimpleSAML_Session::getInstance();
  * retrieving attributes from the session.
  */
 if (!$session->isValid('shib13') ) {
-	SimpleSAML_Utilities::redirect(
+	SimpleSAML_Utilities::redirectTrustedURL(
 		'/' . $config->getBaseURL() . 'shib13/sp/initSSO.php',
 		array('RelayState' => SimpleSAML_Utilities::selfURL())
 	);
diff --git a/www/example-simple/wsfed-example.php b/www/example-simple/wsfed-example.php
index 6962ab884..c75884871 100644
--- a/www/example-simple/wsfed-example.php
+++ b/www/example-simple/wsfed-example.php
@@ -6,7 +6,7 @@ $config = SimpleSAML_Configuration::getInstance();
 $session = SimpleSAML_Session::getInstance();
 
 if (!$session->isValid('wsfed') ) {
-	SimpleSAML_Utilities::redirect(
+	SimpleSAML_Utilities::redirectTrustedURL(
 		'/' . $config->getBaseURL() . 'wsfed/sp/initSSO.php',
 		array('RelayState' => SimpleSAML_Utilities::selfURL())
 	);
diff --git a/www/index.php b/www/index.php
index 017a0d737..4ca3a3baa 100644
--- a/www/index.php
+++ b/www/index.php
@@ -3,4 +3,4 @@
 require_once('_include.php');
 
 
-SimpleSAML_Utilities::redirect(SimpleSAML_Module::getModuleURL('core/frontpage_welcome.php'));
+SimpleSAML_Utilities::redirectTrustedURL(SimpleSAML_Module::getModuleURL('core/frontpage_welcome.php'));
diff --git a/www/saml2/sp/AssertionConsumerService.php b/www/saml2/sp/AssertionConsumerService.php
index bb5a3c1da..e024489ba 100644
--- a/www/saml2/sp/AssertionConsumerService.php
+++ b/www/saml2/sp/AssertionConsumerService.php
@@ -47,7 +47,7 @@ function finishLogin($authProcState) {
 	global $session;
 	$session->doLogin('saml2', $authData);
 
-	SimpleSAML_Utilities::redirect($authProcState['core:saml20-sp:TargetURL']);
+	SimpleSAML_Utilities::redirectUntrustedURL($authProcState['core:saml20-sp:TargetURL']);
 }
 
 SimpleSAML_Logger::info('SAML2.0 - SP.AssertionConsumerService: Accessing SAML 2.0 SP endpoint AssertionConsumerService');
@@ -116,7 +116,7 @@ try {
 		$status = $response->getStatus();
 		if(array_key_exists('OnError', $info)) {
 			/* We have an error handler. Return the error to it. */
-			SimpleSAML_Utilities::redirect($info['OnError'], array('StatusCode' => $status['Code']));
+			SimpleSAML_Utilities::redirectTrustedURL($info['OnError'], array('StatusCode' => $status['Code']));
 		}
 
 		/* We don't have an error handler. Show an error page. */
diff --git a/www/saml2/sp/SingleLogoutService.php b/www/saml2/sp/SingleLogoutService.php
index a2546f74e..0bd8c731e 100644
--- a/www/saml2/sp/SingleLogoutService.php
+++ b/www/saml2/sp/SingleLogoutService.php
@@ -88,7 +88,7 @@ if ($message instanceof SAML2_LogoutRequest) {
 		throw new SimpleSAML_Error_Error('LOGOUTINFOLOST');
 	}
 
-	SimpleSAML_Utilities::redirect($returnTo);
+	SimpleSAML_Utilities::redirectUntrustedURL($returnTo);
 
 } else {
 	throw new SimpleSAML_Error_Error('SLOSERVICEPARAMS');
diff --git a/www/saml2/sp/initSLO.php b/www/saml2/sp/initSLO.php
index 688680ed9..8402a36c0 100644
--- a/www/saml2/sp/initSLO.php
+++ b/www/saml2/sp/initSLO.php
@@ -25,7 +25,7 @@ try {
 	$idpEntityId = $session->getAuthData('saml2', 'saml:sp:IdP');
 	if ($idpEntityId === NULL) {
 		SimpleSAML_Logger::info('SAML2.0 - SP.initSLO: User not authenticated with an IdP.');
-		SimpleSAML_Utilities::redirect($returnTo);
+		SimpleSAML_Utilities::redirectUntrustedURL($returnTo);
 	}
 	$idpMetadata = $metadata->getMetaDataConfig($idpEntityId, 'saml20-idp-remote');
 	$SLOendpoint = $idpMetadata->getEndpointPrioritizedByBinding('SingleLogoutService', array(
@@ -35,7 +35,7 @@ try {
 	if ($SLOendpoint === NULL) {
 		$session->doLogout('saml2');
 		SimpleSAML_Logger::info('SAML2.0 - SP.initSLO: No supported SingleLogoutService endpoint in IdP.');
-		SimpleSAML_Utilities::redirect($returnTo);
+		SimpleSAML_Utilities::redirectUntrustedURL($returnTo);
 	}
 
 	$spEntityId = isset($_GET['spentityid']) ? $_GET['spentityid'] : $metadata->getMetaDataCurrentEntityID();
diff --git a/www/saml2/sp/initSSO.php b/www/saml2/sp/initSSO.php
index 491a18d17..880674837 100644
--- a/www/saml2/sp/initSSO.php
+++ b/www/saml2/sp/initSSO.php
@@ -96,7 +96,7 @@ if ($idpentityid === NULL) {
 		
 		$extDiscoveryStorage = $config->getBoolean('idpdisco.extDiscoveryStorage');
 		
-		SimpleSAML_Utilities::redirect($extDiscoveryStorage, array(
+		SimpleSAML_Utilities::redirectTrustedURL($extDiscoveryStorage, array(
 			'entityID' => $spentityid,
 			'return' => SimpleSAML_Utilities::addURLparameter($discourl, array(
 				'return' => SimpleSAML_Utilities::selfURL(),
@@ -120,7 +120,7 @@ if ($idpentityid === NULL) {
 		$discoparameters['IDPList'] = $reachableIDPs;
 	}
 
-	SimpleSAML_Utilities::redirect($discourl, $discoparameters);
+	SimpleSAML_Utilities::redirectTrustedURL($discourl, $discoparameters);
 }
 
 
diff --git a/www/shib13/sp/AssertionConsumerService.php b/www/shib13/sp/AssertionConsumerService.php
index c392cebc6..f523c28a4 100644
--- a/www/shib13/sp/AssertionConsumerService.php
+++ b/www/shib13/sp/AssertionConsumerService.php
@@ -34,7 +34,7 @@ function finishLogin($authProcState) {
 	global $session;
 	$session->doLogin('shib13', $authData);
 
-	SimpleSAML_Utilities::redirect($authProcState['core:shib13-sp:TargetURL']);
+	SimpleSAML_Utilities::redirectTrustedURL($authProcState['core:shib13-sp:TargetURL']);
 }
 
 
diff --git a/www/shib13/sp/initSSO.php b/www/shib13/sp/initSSO.php
index d8fc8720b..d666b8b86 100644
--- a/www/shib13/sp/initSSO.php
+++ b/www/shib13/sp/initSSO.php
@@ -58,7 +58,7 @@ if (!isset($session) || !$session->isValid('shib13') ) {
 			$discservice = '/' . $config->getBaseURL() . 'shib13/sp/idpdisco.php';
 		}
 
-		SimpleSAML_Utilities::redirect($discservice, array(
+		SimpleSAML_Utilities::redirectTrustedURL($discservice, array(
 			'entityID' => $spentityid,
 			'return' => SimpleSAML_Utilities::selfURL(),
 			'returnIDParam' => 'idpentityid',
@@ -75,7 +75,7 @@ if (!isset($session) || !$session->isValid('shib13') ) {
 		SimpleSAML_Logger::info('Shib1.3 - SP.initSSO: SP (' . $spentityid . ') is sending AuthNRequest to IdP (' . $idpentityid . ')');
 
 		$url = $ar->createRedirect($idpentityid);
-		SimpleSAML_Utilities::redirect($url);
+		SimpleSAML_Utilities::redirectTrustedURL($url);
 	
 	} catch(Exception $exception) {		
 		throw new SimpleSAML_Error_Error('CREATEREQUEST', $exception);
@@ -88,7 +88,7 @@ if (!isset($session) || !$session->isValid('shib13') ) {
 	
 	if (isset($relaystate) && !empty($relaystate)) {
 		SimpleSAML_Logger::info('Shib1.3 - SP.initSSO: Already Authenticated, Go back to RelayState');
-		SimpleSAML_Utilities::redirect($relaystate);
+		SimpleSAML_Utilities::redirectUntrustedURL($relaystate);
 	} else {
 		throw new SimpleSAML_Error_Error('NORELAYSTATE');
 	}
diff --git a/www/wsfed/sp/initSLO.php b/www/wsfed/sp/initSLO.php
index 9aef7fc26..f31ebaaca 100644
--- a/www/wsfed/sp/initSLO.php
+++ b/www/wsfed/sp/initSLO.php
@@ -38,7 +38,7 @@ if (isset($session) ) {
 			
 		$idpmeta = $metadata->getMetaData($idpentityid, 'wsfed-idp-remote');
 		
-		SimpleSAML_Utilities::redirect($idpmeta['prp'], array(
+		SimpleSAML_Utilities::redirectTrustedURL($idpmeta['prp'], array(
 			'wa' => 'wsignout1.0',
 			'wct' =>  gmdate('Y-m-d\TH:i:s\Z', time()),
 			'wtrealm' => $spentityid,
@@ -53,7 +53,7 @@ if (isset($session) ) {
 } else {
 
 	SimpleSAML_Logger::info('WS-Fed - SP.initSLO: User is already logged out. Go back to relaystate');
-	SimpleSAML_Utilities::redirect($returnTo);
+	SimpleSAML_Utilities::redirectUntrustedURL($returnTo);
 	
 }
 
diff --git a/www/wsfed/sp/initSSO.php b/www/wsfed/sp/initSSO.php
index fd038b5d9..0e0b8613f 100644
--- a/www/wsfed/sp/initSSO.php
+++ b/www/wsfed/sp/initSSO.php
@@ -38,7 +38,7 @@ if ($idpentityid == null) {
 
 	SimpleSAML_Logger::info('WS-Fed - SP.initSSO: No chosen or default IdP, go to WSFeddisco');
 
-	SimpleSAML_Utilities::redirect('/' . $config->getBaseURL() . 'wsfed/sp/idpdisco.php', array(
+	SimpleSAML_Utilities::redirectTrustedURL('/' . $config->getBaseURL() . 'wsfed/sp/idpdisco.php', array(
 		'entityID' => $spentityid,
 		'return' => SimpleSAML_Utilities::selfURL(),
 		'returnIDParam' => 'idpentityid')
@@ -51,7 +51,7 @@ try {
 	$idpmeta = $metadata->getMetaData($idpentityid, 'wsfed-idp-remote');
 	$spmeta = $metadata->getMetaData($spentityid, 'wsfed-sp-hosted');
 
-	SimpleSAML_Utilities::redirect($idpmeta['prp'], array(
+	SimpleSAML_Utilities::redirectTrustedURL($idpmeta['prp'], array(
 		'wa' => 'wsignin1.0',
 		'wct' =>  gmdate('Y-m-d\TH:i:s\Z', time()),
 		'wtrealm' => $spentityid,
diff --git a/www/wsfed/sp/prp.php b/www/wsfed/sp/prp.php
index 06c1aa5cc..56b9b2496 100644
--- a/www/wsfed/sp/prp.php
+++ b/www/wsfed/sp/prp.php
@@ -28,7 +28,7 @@ if (!empty($_GET['wa']) and ($_GET['wa'] == 'wsignoutcleanup1.0')) {
 		$session->doLogout('wsfed');
 	}
 	if (!empty($_GET['wreply'])) {
-		SimpleSAML_Utilities::redirect(urldecode($_GET['wreply']));
+		SimpleSAML_Utilities::redirectUntrustedURL(urldecode($_GET['wreply']));
 	}
 	exit;
 }
@@ -147,7 +147,7 @@ try {
 	$session->doLogin('wsfed', $authData);
 
 	/* Redirect the user back to the page which requested the login. */
-	SimpleSAML_Utilities::redirect($wctx);
+	SimpleSAML_Utilities::redirectUntrustedURL($wctx);
 
 } catch(Exception $exception) {		
 	throw new SimpleSAML_Error_Error('PROCESSASSERTION', $exception);
-- 
GitLab