Всё, нашёл решение... Как и подозревал дело в том что браузеры кэшировали страницу и при следующем обращении к скрипту не обновляли картинку, так как адрес картинки оставался тем же и они брали картинку уже из кэша эту же самую. До этого везде в скриптах писал
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', FALSE);
header('Pragma: no-cache');
Но мазила и опера не реагировали.
Сделал вот так и сразу заработало

:
<img src="secpic.php?f=<?$f = rand(1,9000);echo $f;?>" alt="защитный код" />