The Portuguese side will take a one-point advantage to the French capital after goals from Lucho Gonzalez, Joao Moutinho and Silvestre Varela heaped more woe on the Croatians, who remain pointless after five games.
Porto started brightly against their beleaguered opponents, Jackson Martinez coming close with a fourth-minute header, but Zagreb had their early chances with Jorge Sammir hitting the post with his 12th-minute effort.
Porto responded with Moutinho bringing a fine save out of Ivan Kelava, who tipped his shot round the post, before Gonzalez opened the scoring in the 20th minute by firing high into the roof of the net from a Moutinho lay-off.
Kelava caught a long-range effort from James Rodriguez then it was the turn of Porto keeper Da Silva Helton to maintain his side's lead when he parried a close-range header from Domagoj Vida.
Rodriguez and Martinez both came close for Porto in the opening minutes of the second half before both Rodriguez and Da Silva Danilo were denied by excellent saves by Kelava on the hour mark.
Moutinho made it 2-0 in the 67th minute when he drilled home a low 30-yard free-kick after Josip Simunic's foul on Martinez, then with the pressure off Porto pushed forward with Danilo and Alex Sandro also coming close.
Varela mis-kicked in the box when he should have done better, before the same player atoned for his error five minutes from time when he fired home from 12 yards after picking up a throw-in by Danilo.
Martinez almost made it four when his late free-kick was parried by the busy Kelava, then an injury-time effort from Rodriguez was blocked in the box by Vida as Porto were forced to settle for three.