Thanks for the reply. I have some comments for each section.
1 and 2) I know attackers can simply blank out the hash check code with NOP or skip over it with JMP, so I've not made it that simple. All of my anti-cheat and hash check code is spread out across other normal game functions that are called periodically. Some of it gets its own thread. This means that the hacker has to work 50 times as hard to patch up all the checks. It'll eventually be done, but by then version n+1 will be out and their changes will be void. I plan to significantly alter the underlying client-server communications protocol every month or so to force the use of an updated client version. This is easily done with conditional compilation statements (#if(...) #endif) within my communication class. I can switch the defined communication protocol constant (e.g. undefine COMMS_CSV and define COMMS_XML) to change the entire function of the class. It's not a particularly large amount of effort on my part, but it messes up all previous versions of the client enough for them to have to use the new one.
3) This works in the same sense of any other game. I'm not sending every click there, but rather anything that affects the player's account or any other players in game. For example, I want to buy an item. I click the buy button and the client sends a request to the server to buy that item. The server checks if the player that the client is logged in as has enough money, and if so buys the item. There should never really be a case when the client sends a request to buy something that it cannot afford, as the game application won't usually allow the request to be sent if the cost is more than the money value stored in memory.
4) It's not something I designed to be utter rubbish, it's actually on a par with WoW's packet encryption algorithm (but mathematically stronger). Funny story about that - I designed the algorithm about a year ago and posted my findings on some crypto site somewhere. Somebody came back and posted the code to WoW's packet encryption and it compared quite admirably. I'm proud I came up with something better than Blizzard did with all their money and expertise.
5) In certain cases some requests should never be sent by the client. For example, a request to start random_applet v5 when the player only has random_applet v2 can only be a case of someone attempting to hack the game. Also, badly formed messages (ones that do not fit the usual protocol) and bad handshake responses (I use challenge/response hashing) are deemed violations. Too many violations gets you an IP ban. The idea (mainly) behind this is that it's much harder to reverse engineer the game protocol if you're getting IP banned all the time when you try to test it. It also deters normal players from using hacked clients, because if they get caught they get their account permabanned.
6) Again true, but they have their work cut out. The crash code is split across the rest of the game code and resides in some really odd places. In some cases the crash code doesn't even appear to be something that should crash.
7) I always use secondary session IDs and "secret values" to prevent session ID theft and of course just in case a flaw is found with PHP's session ID code.
8) This one is a little different to #4. The reason for encrypting them is to prevent the "larger crowd" from using memory editors to find the value in memory. It uses a few tricks to make tracking the value from a static pointer a little harder, and the encryption algorithm is a combination of my own and another. On XP and Vista, depending on security settings, the value can be stored in protected LSA memory. Of course, on XP it may be possible for someone to use an auditing tool like Cain to retrieve the contents of LSA memory. Anyway, editing these values isn't a security risk as such, as the values are server side. It simply makes it easier for me to detect the real cheaters from the idiots that think their money value is ever sent from client to server and stored.