Blaine Gabbert tried to respond for the 49ers, but a wayward pass intended for Quinton Patton ended up in the hands of Cardinals safety Tyrann Mathieu, who also had two interceptions when the sides met earlier in the season.
John Brown thought that he had a touchdown for the visiting side when he made a run down the right, but the wide receiver stepped out of bounds, forcing Arizona to settle for another kick.
The NFC West leaders extended their advantage at the start of the second half as Palmer made a series of passes to Fitzgerald before David Johnson eventually muscled his way over from one yard out.
After forcing a quick punt from Arizona, the home side got the ball back before the end of the third quarter, looking to take the lead for the first time, but Torrey Smith was brought down at the 22-yard line after hauling in a deep pass from Gabbert.
Bell tried to break free to find the endzone, but a pass interference penalty saw the play called back, resulting in another field goal from Dawson, which tied the scores.
The 49ers defense restricted the Cardinals as they tried to restore their advantage, with NaVorro Bowman pushing Johnson out of bounds as he tried to break down the sideline, while Palmer came under pressure in the pocket.
After both sides had a further punt, JJ Nelson picked up 34 yards to leave the Cardinals just a yard short of the endzone, setting up Palmer for a run to the corner for the touchdown, but Catanzaro missed the extra point.
The 49ers got the ball back with two minutes remaining, but Gabbert was sacked before Boldin came up short looking for the first down, allowing the visitors to hold on for the win.
The result leaves the Cardinals at the top of the division with a 9-2 record, while the 49ers slip to 3-8.