Robb's suggestion of segmentations is great for this if the leads are already in Marketo (as opposed to leads that match a client domain but aren't themselves in the db yet). It won't stop users from posting the form, but it will ensure that they see the correct content. However, note that they may not see the content immediately (that's another technical story).
There are some other approaches, but their acceptability will depend on your definition of "prevent."
See, Marketo doesn't do server-side form validation at the point of submission (you can check posted values in a Smart List and discard the lead, but you can't stop the form from submitting as far as the browser knows). And client-side form validation in the browser can always be circumvented by mildly technical users.
But if your goal is just casual validation -- you're not trying to stop people who'd make a malicious attempt to get around validation -- then you can check the Email against any list you want. It's like the "stop people from entering freemail addresses" concept. Easy for a person with minor technical skills to get around, but if you're trying to dissuade leads so anyone doing anything dirty knows they're being dirty, it'll work fine. You can store the list as a JS variable right on the page (though that's really easy for someone to see with view-source) or in a separate file (harder to "accidentally" see). Or you could store hashes in a separate file, though the complexity is probably not worth it given that it can still be circumvented.
Re: passwords, Marketo isn't equipped to create extranets or authenticated asset libraries. If you don't care about real security but just "suggested security," you're free to put a random... let's call it, "keycode" as opposed to "password"... in a custom field. Comparing a posted password to the stored password, though, requires a webhook. This isn't a road worth going down IMO.