Aza wrote about this way back in 2007: http://alistapart.com/article/neveruseawarning
99% of the time when I want to delete something, it's intentional instead of accidental, so why should have I have to confirm the action 99% of the time, to potentially save me 1% of the time.
Allowing the user to undo is a much better solution, as even if you confirm something, it's only after deleting it you realise you selected the wrong list to delete, or though you where on the development server instead of production. And there's no reason this should only apply to destructive actions such as deleting something. GMail let's you undo sending an email (or more specifically, it delays sending the email for a few seconds to give you a chance to realise you sent it to the wrong person, forgot an attachment or realise you're drunk emailing).
I aware that there's additional work involved in developing something to allow you to undo, as well as added overhead, such as how long do you store "deleted" files, how do you undo an action which has since had other actions performed on it etc.
1 - use the correct dialog button layout: cancel on the left, confirm on the right. always.
2 - default to the cancel button - highlight / color it & attach to the enter key
3. show an alert icon - something obvious, don't just show plain text
4. if it's really serious, allow undo / history