No, non esiste una soluzione corretta che non includa modificare il tuo codice per ricevere TUTTI i parametri che modificano i dati sempre e solo tramite POST.
In effetti, è proprio per questo che i browser sono costruiti per non richiedere mai una conferma se inviano di nuovo una richiesta GET, e per richiedere sempre conferma se riinviano una richiesta POST.
Non vedo però quale sia la difficoltà nel modificare il tuo codice perchè queste operazioni avvengano via post: un link <a> che aggiunge un articolo al carrello può essere sostituito da un <form action="la stessa url del link"><input type="hidden" name value>...<input type=submit value="aggiungi al carrello"></form>, e nel codice della pagina di destinazione dovrai sostituire qualche $_GET con $_POST...
Mi sembra una correzione fattibilissima!