I haven't found a good way with bounding box collision. Bounding boxes are simple, but they're actually kind of harder to work with for some things (like this). I abandoned them long ago for this and other reasons.
The only way I can think of to prevent tunnelling would be to move the object in "steps" that are no larger than its size.
For example, say you have an object that is 10 pixels wide, and is moving 40 pixels to the right in one step. To prevent tunnelling, you would move him in 10 pixel steps... so move 10, check collision, move 10 move, check again, move 10 more, etc.
Of course that's somewhat impractical, especially if you have tons of small and fast objects (bullets).
A way to optimize this would be to do a broad collision check first. Coming back to the 10 pixel object example... rather than only checking where the object moved to, you would check a larger rect that covers all the space between where the object was and where it moved to. So if he's 10 pixels wide and moving 40 pixels, you would make a new rect that is 50 pixels wide and check that for any wall collisions. If there is one, then you could go back to the "move 10 - check - move 10 - check" approach.
But this approach is poor if the movement is diagonal, because the rect you construct will be overly huge. For example a 10x10 object moving 50 right and 50 down would have a 60x60 broad-check rect that you'd have to cover -- but only a fraction of that space was actually passed through by the object.
What's worse -- moving diagonally opens up some new tunnelling possibilities. Even if the object is moving slow.
Take for instance, this situation:
http://i41.tinypic.com/344d0mg.png
black = walls
object = red
The object can squeeze through a space it shouldn't be able to.
So how do you solve this? In my early attempts, I moved the object along one axis, then another (ie: move it right first, check for collision, then move it down, and check for collision again). But this sucks if the object is moving fast, because then you'll hit walls you shouldn't. (in the same example as that picture, if the object
was small enough to make it through that hole, it wouldn't be able to because moving right first would make it hit that wall -- false positive)
Really, I've just found this approach for collision detection inadequate if you want "perfect" collision. If you want to stick with bounding boxes, you'll have to suck it up and accept that it's imperfect and there will be ways to break it. The best you can do is minimize the problems.
I've since moved on to line based collision and never looked back. It's more complicated to understand and set up, but once in place it works great.