According to the "Useful tips" section (on page 7) of the
official specs, you should be able to read the first 11 bytes of the file and match this pattern:
/\xff.\xff...JFIF\x0/
Based on looking at a small number of "*.jpg" files I happen to have uploaded from a camera (via "iPhoto", which may have been involved in "updating" some of those pictures after the upload), I would actually change that to:
/\xff.\xff...(?:JFIF|Exif)\x0/
And apparently, you might expect "JFXX" as well. But frankly, I'd be content to trust the file name, and so would focus on the first reply above.
UPDATE: The above assumes that the file is being read in :raw mode (what we commonly understand as the default behavior of doing binmode FH). Also, I agree with what afoken says below: use a module to validate jpeg files, in case there is any doubt about their validity.