My login page accepts the "return" parameter, which should contain URI to redirect user if he wasn't logged in and tried to access page which isn't accessible by unauthenticated users. It could be anything from my site.
How do I properly check that parameter in my server code, before I return HTTP 302 status with that URI to user after he successfully authenticated on the login page?
Is it enough to check that uri[0] == '/' && uri[1] != '/'
(so malicious user won't send request like /login?return=http://google.com
)?
Can a malicious user construct some tricky uri which will send victim user to trouble? Of course I assume that other pages do not contain XSS vulnerabilities, GET request do not change anything in the database, etc.
If a malicious user can trick the victim to click on his link and the victim user is already logged in, things will happen anyway and I can't do anything to prevent that except implement known security measures such as CSRF protection, etc.
return= http://google.com
orreturn=%20http://google.com
? Not sure but maybe UTF 8 right-to-left can do something strange here. – PiTheNumber Jan 6 '15 at 14:44