1) the cheap way to detect is by extension. The mostly secure way is to read the first few bytes of the header and see if it matches to known image format headers.
2) MSSQL 2008 has a FileStream type which is the best of both worlds. If you are on an older version of sql server then it's a toss up. If the images have to be accessible by multiple web servers and portability / backups are a concern then you have to put it in the database server...
If multiple web servers, but portability/backups are not a concern, then store it on a NAS.
If single web server and you know it won't be scaled up, then on the local web server file system is ok.
3) Trust no one. See Item 1.
4) Buy a library or find an open source one. It will make your life much easier. Incidentally, this helps with item 1 and 3. When the image is uploaded, open it with the library. If the library complains then you can be pretty sure it's not a real image.
You might check into plupload to see what they are doing: http://www.plupload.com/