I was wondering what security issues appear when the end user of a website can upload files to the server.
For instance if my website allows the users to upload a profile picture, and one user uploads something harmful instead, what could happen? What kind of security should I set up to prevent attacks like this? I’m talking here about images, but what about the case where a user can upload anything into a file-vault kind of application?
It’s more a general question than a question about a specific situation, so what are the best practices in that situation? What do you usually do?
I suppose: type validation on upload, different permissions for uploaded files… what else?
EDIT: To clear up the context, I am thinking about a web application where a user can upload any kind of file and then display it in the browser. The file would be stored on the server. The users are whoever uses the website, so there is no trust involved.
I am looking for general answers that could apply for different languages/framework and production environments.
Your first line of defense will be to limit the size of uploaded files, and kill any transfer that is larger than that amount.
File extension validation is probably a good second line of defense. Type validation can be done later… as long as you aren’t relying on the (user-supplied) mime-type for said validation.
Why file extension validation? Because that’s what most web servers use to identify which files are executable. If your executables aren’t locked down to a specific directory (and most likely, they aren’t), files with certain extensions will execute anywhere under the site’s document root.
File extension checking is best done with a whitelist of the file types you want to accept.
Once you validate the file extension, you can then check to verify that said file is the type its extension claims, either by checking for magic bytes or using the unix file command.
I’m sure there are other concerns that I missed, but hopefully this helps.