Na większych portalach w grę wchodzi JS, a dokładnie "cudeńko" nazwane XMLHttpRequest. Pozwala ono na wysłanie asynchronicznego requesta, bez odświeżania strony.
Po wysłaniu requesta dzieje się to co normalnie, czyli wywołuje kod (np. php) na serwerze.
ID czegokolwiek [np. postu, które użytkownik chce polubić] jest przesyłane GET-em lub POST-em.
przesyłane wartości są widoczne w konsoli deweloperskiej
Jaki jest w tym problem? Przesłać użytkownikowi ID posta, który chce polubić. Co może zrobić z ID posta? Zmienić go. Spoko, ale wtedy to on polubi jakiś losowy post.
Weryfikacje nadal wykonujesz po stronie serwera. Gdy coś jest nie tak, odrzucasz taki request i po sprawie.
Jeżeli nie chcesz korzystać z XHR to tworzysz a/form i w nim ustalasz link, następnie w odpowiedzi użytkownik dostaje przekierowanie na tę samą stronę i gotowe!
P.S. Jeżeli gdzieś widziałeś, że ktoś użył czystego span do stworzenia przycisku, nie rób tego samego błędu plz. Make przycisk great again :)