Goalkeeper Thomas Sorensen denied fourth-placed Spurs the chance to open up a six-point gap over Arsenal as Aston Villa ended the game with 10 men.
Baros had Villa's only shot in the game
The Danish keeper made two good saves in the latter stages of the first half, tipping over Teemu Tainio's lob and then pushing away a Robbie Keane shot.
Sorensen saved his best for last, thwarting Michael Carrick, Tainio and Michael Brown with three great saves.
On 83 minutes Gareth Barry was sent off after being booked for a second time.
With Mido away on African Cup of Nations duty, Jermain Defoe started only his second match in the last 12, partnering Robbie Keane in attack.
But the Keane and Defoe partnership never quite struck the right chord, while Mido's ability to hold up the ball was also missed.
With a quarter of an hour to go, Spurs coach Martin Jol replaced Defoe with Grzegorz Rasiak in an attempt to unsettle the Villa defence with a greater physical presence, but the Pole was unable to change the course of the game.
Milan Baros and Juan Pablo Angel had an even more frustrating time of it than Keane and Defoe.
Villa were so intent on their defensive duties that neither Baros nor Angel had a clear sight of goal.
It took 73 minutes for Villa to have their first shot on goal - a woefully wide effort from Baros.
An Edgar Davids shot and Jermaine Jenas's strong running down the right were the highlights of a quiet opening.
Twice Jenas got clear, but he fluffed his first cross, with his second effort well cleared by Mark Delaney.
With Spurs labouring it took them nearly half-an-hour to force a save from Sorensen.
The Villa keeper displayed great athleticism, the Dane backpedalling to punch over the bar Tainio's lob.
A dipping volley from Keane was also well saved by the Aston Villa goalkeeper.
Just before the break Jenas was stretchered with a head injury after challenging Angel for the ball, with the England international replaced by Aaron Lennon.
Spurs had to further rejig their midfield when Brown replaced Davids after the Dutchman limped off with a knee injury.
The introduction of Rasiak prompted a flurry of Spurs activity, the Pole crossing for Tainio, whose first-time flick produced another fine save from Sorensen.
Just before Villa's goalkeeper had flung himself across his goal to palm away a rising Carrick shot.
With seven minutes to go Barry was red-carded after he picked up two bookings in the space of a couple of minutes, his second yellow card for a cynical challenge on Lennon.
Spurs tested Sorensen one last time as Brown tried his luck, but the Dane once more frustrated the home side.
Tottenham manager Martin Jol:
"There were a lot of positives to come out of it for us.
"Their keeper made some marvellous saves and he had the luck with him - sometimes it happens like that.
"The only frustration is we could not make a gap with Arsenal in fourth place after they lost at Everton."
Aston Villa manager David O'Leary:
"When teams come to Spurs these days they know they are in for some hard work.
"They have bought high quality and always play good football.
"Our centre-backs played very well, while Thomas Sorensen made some great saves although by his standards it was just what I expected."
Tottenham: Robinson, Kelly, Dawson, King, Lee, Jenas (Lennon 45), Carrick, Davids (Brown 64), Tainio, Keane, Defoe (Rasiak 76).
Subs Not Used: Cerny, Gardner.
Aston Villa: Sorensen, Hughes, Mellberg, Delaney, Barry, Hendrie, Davis, McCann, Milner, Baros (Moore 80), Angel, Moore (Samuel 85).
Subs Not Used: Taylor, Ridgewell, Gardner.
Sent Off: Barry (83).
Booked: Angel, Barry.
Ref: G Poll (Hertfordshire).