Although I always check that someone is allowed to access a record, I normally use a UID in query strings as I feel it discourages the temptation to "poke around" that ?id=1, ?id=2 does.
I find though that it makes it a bit convoluted to do lookups across multiple tables as you need to store the UID as well instead of just the record id.
If I was to pass an encrypted string of the id number through the query string and then decrypt it to do a database query would this add massive overhead?
This would mean I can just work with the primary key (though I would still obviously check that they have permission to view the record) and could make unique links each session (or change anytime throughout a session) - which would be useful if there's a lot of AJAX driven content you don't want them trying to play with.
Is this a really bad idea?