The problem really is that none of us have come up with a solution yet. People have quickly tossed some "solutions" out there, but those are generally very easy to get around and might make the code more complex, performance worse, overall experience worse, while not actually stopping the intended practice because people get around it. Sometimes they even open the door to worse exploits.
This is a VERY challenging problem.
Ultimately I think we are trying to find a programatic way to solve the problems of human nature.
As far as I know no one has solved those problems throughout recorded history.
We can resist them, we can be vocal about them, we can try to be a positive example standing against the negative, but we cannot truly eliminate it.
The potential for these faults to rise lies inside each of us.