XSS Vulnerability in PHP scripts

巧了我就是萌 提交于 2021-01-27 14:32:32

问题


I have been searching everywhere to try and find a solution to this. I have recently been running scans on our websites to find any vulnerabilities to XSS and SQL Injection. Some items have been brought to my attention.

Any data which is user inputted is now validated and sanitized using filter_var().

My issue now is with XSS and persons manipulating the URL. The simple one which seems to be everywhere is:

http://www.domainname.com/script.php/">< script>alert('xss');< /script >

This then changes some of the $_SERVER variables and causes all of my relative paths to CSS, links, images, etc.. to be invalid and the page doesn't load correctly.

I clean any variables that are used within the script, but I am not sure how I get around removing this unwanted data in the URL.

Thanks in advance.

Addition: This then causes a simple link in a template file:

<a href="anotherpage.php">Link</a>

to actually link to:

"http://www.domainname.com/script.php/">< script>alert('xss');< /script >/anotherpage.php


回答1:


To your concern about XSS: The altered URL won't get into your page unless you blindly use the related $_SERVER variables. The fact that the relative links seem to include the URL injected script is a browser behavior that risks only breaking your relative links. Since you are not blinding using the $_SERVER variables, you don't have to worry.

To your concern about your relative paths breaking: Don't use relative paths. Reference all your resources with at least a root-of-domain path (starting with a slash) and this sort of URL corruption will not break your site in the way you described.




回答2:


This then changes some of the $_SERVER variables and causes all of my relative paths to CSS, links, images, etc.. to be invalid and the page doesn't load correctly.

This sounds you made a big mistake with your website and should re-think how you inject link-information from the input into your output.

Filtering input alone does not help here, you need to filter the output as well.

Often it's more easy if your application recieves a request that does not match the superset of allowed requests to return a 404 error.

I am not sure how I get around removing this unwanted data in the URL.

Actually, the request has been already send, so the URL is set. You can't "change" it. It's just the information what was requested.

It's now your part to deal upon it, not to blindly pass it around any longer, e.g. into your output (and then your links are broken).


Edit: You now wrote more specifically what you're concerned about. I would go in one with dqhendricks here: Who cares?

If you really feel uncomfortable with the fact that a user is just using her browser and enters any URL she feels free to do so, well, the technically correct response is:

400 Bad Request (ref)

And return a page with no or only fully-qualified URIs (absolute URIs) or a redefinition of the Base-URI, otherwise the browser will take the URI entered into it's address bar as the Base-URI. See Uniform Resource Identifier (URI): Generic Syntax RFC 3986; Section 5. Reference Resolution­Specs.




回答3:


first, if someone adds that crap to their url, who cares if the page doesn't load images correctly? also if the request isn't valid, why would it load any page? why are you using SERVER vars to get paths anyways?

second, you should also be escaping any user submitted database input with the appropriate method for your particular database to avoid sql injection. filter_var generally will not help.

third, xss is simple to protect from. Any user submitted data that is to be displayed on any page needs to be escaped with htmlspecialchars(). this is easier to ensure if you use a view class that you can build this escaping in to.



来源:https://stackoverflow.com/questions/8764696/xss-vulnerability-in-php-scripts

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!