D 2014-03-20T00:51:59.173 L input N text/x-markdown P 75c9a596272241d02aac07e2306ef3ee6248dd0d U mario W 13586
$_REQUEST->text["content"]
Filtering functions can also be chained, as in `$_GET->text->html["title"]`. There are various whitelisting and sanitizing methods for that.
* This approach addresses input constraint validation at the earliest feasible entry point.
* Unifies access through a central verification mechanism.
* Allows reliable input interpolation instantly into many target contexts.
Additionally it can still shadow/audit casual and unverfied accesses. Its overall API simplicity is meant to *encourage* safety; through minimal effort.
| Method | Type | Sample | Usage |
|---|---|---|---|
| int | cast | 123 | Only numeric characters, cast to integer. |
| name | white | abc12_x3 | Alphanumeric symbols only. |
| id | white | xy_2.1 | Alphanumeric chars, dot and underscore. |
| words | white | abc def | Text with minimal interpunction (only spaces allowed). |
| text | white | Hello, World! | Common natural text with basic interpunction (including quotes, but no < >). |
| filename | filter | basename.txt | Replace all non-alphanumeric characters with underscores. |
| float | cast | 3.14159 | Cast to float. |
| boolean | cast | true, false | Converts "false/true" or "0/1" or "off/on" and "no/yes" to boolean. |
| ascii | white | Aa#*:“,\n\0~ | Characters in the ASCII range 0 .. 127 |
| nocontrol | white | Aa#*:“,\n~ | Fiilters out control characters (< 32), except \r \n \t. |
| spaces | filter | Single line | Turns linebreaks / whitespace (\r \n \t) into spaces only. |
| q | black | \“value\“ | Shorthand for addslashes. |
| escape | black | \ []“{}'$`!´&?/><|*~;^ | Broader escaping of well-known meta charactes (quotes and regex). |
| html | filter | & | htmlspecialchars (shorthand) |
| Structural | Following filters constrain specific input formats. | ||
| datetime | white | 1999-12-31T23:59:59Z | HTML5 datetime values |
| date | white | 2015-07-17 | Just date string. |
| time | white | 23:59:20.17 | Time specifier. |
| color | white | #FF5022 | Hex color value. |
| tel | white | "+1-347-2214144 | International-format telephone number. |
| iconv | filter | Convert input to UTF-8 | |
| utf7 | black | Filter some UTF-7 out. | |
| ip | white | ::1 | IPv4 or IPv6 address |
| ipv4 | white | 134.22.7.207 | IPv4 address only |
| public | white | 8.8.4.4 | Validate IP to be public. |
| white | you @gmail.com | Syntactically valid email address. | |
| url | white | Ensure URL syntax xxx:/// | |
| http | white | http:// localhost/ | More conservative http:// URL constraint. |
| uri | white | More generic URI syntax. | |
| xml | cast | Create a SimpleXML object from input. | |
| json | cast | {„key“:“value“} | json_decode() |
| purify | filter | <b>basic</b> | Utilizes HTMLPurifier |
| NOP | Virtual / control filters. | ||
| log | control | Raw value access with logging. | |
| raw | control | Raw access with E_NOTICE (is the default). | |
| disallow | control | Disallow unfiltered variable access (configurable per INPUT_DIRECT). | |
| is | control | Is a meta filter, that applies the following filter chain, then checks if the content would have passed unaffected. Returns a boolean if all constraints were matched. | |
| Parameterized | These filters require method access $_GET->default(„id“, „index“) instead of the plain array key syntax. |
||
| length(ID, 20) | filter | Hello Wo | Cuts strings to maximum given length. |
| range(ID, 1, 15) | white | 17 | Constrains numeric input to the given range. |
| default | filter | … | Uses default value, if no input present. |
| regex | white/black | … | Custom regular expression method ->regex("field", "/(abc)/") |
| in_array | white | a,b,c | Can be used with array parameter, or a simpler comma-separated of allowed values. |
| Multi-Apply | Following filters work on a set of input variables, instead of a single one. | ||
| array | control | Is automatically applied to input subarrays, so filters are run on each entry. | |
| list | control | Combine multiple input variables per name (comma-separated list) and apply filtering collectively; finally return a named result array. | |
| multi | control | Also grabs a list of input variables. But does not run filters on scalars within, but pass the combined set to filter functions. This is used in combination with e.g. http_build_query |
|
| Global functions | |||
| strtolower | filter | Any global function can be chained actually. It just needs to accept one parameter, modify its input (string), and return something in return. Custom userland functions can thus be utilized. | |
| urlencode | filter | ||
| strip_tags | filter | ||
| Inadvised filters | Care should be taken here. Liberal application will lead to a false sense of security. | ||
| sql | filter | Configurable PDO::quote shorthand. |
|
| mysql | filter | Shorthand to mysql_real_escape_string (doubly discouraged). |
|
| xss | black | Minimal XSS blacklist | |
INPUT_DIRECT constant.
* Per default it uses "raw" which just prints a notice.
* It can also be set to "disable" to prevent such uses.
* Another alternative would be "q" to emulate magic quotes (not recommended).
* Or using "sql" to securely use `$_POST["fields"]` in SQL strings, if that's the default target (also not recommended).
Another option is to predefine a filter chain on a particular superglobal with `->always()`:
$_POST->xss->nocontrol->always();
Then any `$_RAW["access"]` would still use these filters. Yet additional more context-specific filters could also be intermixed.
It's equivalent to having the filter chain built up, before accessing an entry:
$_GET->filter->name->and->more;
$_GET["var"]
Btw, to reset a default filter chain, use `->__always = array()`;
$_GET / $_POST / $_REQUEST
Because the whole ArrayAccess and Iterator interfaces are implemented, it's easy to transition existing code to new input(). There are few behavioural discrepancies.
if ($_POST) {
To probe for presence of input data, one should check one of the keys, or rather:
if (count($_POST)) {
Which has the same effect.
->has() ->no() ->keys() isset($_GET["key"]) one can now write: $_GET->has("key"). Or to probe for the opposite $_GET->no("sleep").
In place of array_keys() there's now $_REQUEST->keys(), also slightly shorter.