Even though ghash is now at 30% I don't think this question is answered at all and this still very much an issue. This is because an attacker could could potentially gain control over more than one pool or more than one pool could collaborate to execute an attack. I would really like to see the pools such that not even any given 5 pools total to 51%. Ideally we get rid of centralized pools altogether or some serious protocol change is made to make it easier to solo mine, or so that 51% attack doesn't work any more alltogether.
It isn't a protocol issue, it is more a human behavior issue and that is a lot harder to "fix". Logically a miners largest cost is the electrical bill and electrical bills are only due once a month. Even a pool with 2% of the hashrate will have a 95% confidence to be +/- 10% of the expected revenue after 30 days. However most miners want a reward now, right now. That probably isn't going to change. p2pool is a good example. Right now p2pool shares are ~1000x easier than solo mining however most miners do use it. Logically even if you radically changed the protocol such that solo mining was 1000x easier most miners would probably not use it.
Still the risk of 51% attack from pools is overstated. Lets say right now ghash had 70% of the hashrate. How would they produce an attack chain? Well they would need to stop mining the main chain. ghash on average would go from producing say 8 blocks in a 2 hour period to producing zero. They can't mine both the main chain and attack chain at the same time.
The risk is small but it could be made even smaller by making it easy for miners to verify they are extending the longest chain. For example the current block hash of the last block in the longest chain is 0000000000000000302b107dcfdaf35d3b09366638e19aa24ffa91dd7f91d57c and thus all miners should currently be working on a block that extends that block. Right now if all pool miners are extending block 0000000000000000302b107dcfdaf35d3b09366638e19aa24ffa91dd7f91d57c then you know that no 51% attack is ongoing. Even if all pools were infiltrated the only thing an attacker could do is steal the mining revenue (by changing the coinbase tx).
It would be possible to modify the blockheader so that miners (and third party observers) can verify that they are mining the longest legit chain. This could be done in a backwards compatible manner (won't break existing ASIC hardware) by including a partial block hash of the prior block in the last segment of the block header. There is limited space in the final segment of the blockheader (the one that the miner adds the nonce and thus must always be provided in full by the pool) so the full blockheader is far too long. By extending the blockheader and putting the rightmost 8 bytes of the prior blockhash (i.e. 4ffa91dd7f91d57c for the block above) in the last segment it would be easy to spot attempted misuse of miner computing power. The mining software (using SPV protocol) would maintain an independent record of the longest chain (and the last block extending it) and would verify the work provided by the pool, extends that chain. If the software detects a scenario where they are not mining the longest chain they would stop mining (or switch pools to a pool that is extending the longest block) and warn the user.
This type of "verify I am on the longest chain" can be done without a change in the blockheader but it would require pools to send the full blockheader to miners. For efficiency reasons they don't and that is unlikely to change. Also if a pool doesn't it can't be forced to do so and most miners wouldn't see a lack of the verifying information as sufficient reason to not use the pool. Changing the blockheader would ensure the necessary information is always sent to the miner.