Using "dynamic" : "strict" to prevent unintended fields from being created?

Maybe dynamic: false is what you are looking for? It will ignore all fields that are not defined in the mappings (but they will still remain accessible via the _source).