On NTFS, a given filepath can have multiple associated data streams. Apart from the main stream, also known as $DATA
, there can be others, typically used to store metadata like the Internet Zone marker in downloaded files.
Alternate Data Streams are accessed using a colon separator, eg. file.dat:$DATA
is an alternative way of saying file.dat
. The presense of ADSs through the web has caused Microsoft some security issues in the past (eg. returning the source code of ASP pages instead of executing them), so as a precaution they're blocking the use of colon in the path part of the URL, as the path part often maps to the filesystem (though not in your case). This is less likely to occur from the query string so is not blocked there.
This is far from the worst false positive Request Validation will generate. Its anti-injection features are much worse. I personally would always disable it, as it's a stupid broken feature that can never actually make your webapp secure; only proper attention to string-escaping (and heavy sanitisation of anything you plan to use as a filename) can do that.
There are other characters that even if you turn Request Validation off you can't put in a path part for routing purposes. In particular, slashes (%2F
, %5C
, and byte sequences that would be invalid overlong UTF-8 sequences resolving to the same) and the zero byte. It's best to be conservative about what you put in paths in general.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…