Security checklist for developers/cs

Tento dokument je poskytován jako doplněk k . Toto je seznam běžných vývojových úkolů a bezpečnostních opatření, která je třeba přijmout.



Bezpečnostní kontrolní seznam
{| class="wikitable" | ! Pokud pracujete s... ! získáte ...


 * valign="top" |
 * valign="top" |



Soubory cookie prohlížeče

 * valign="top" |
 * Snížení obav recenzenta použitím místo  ?
 * Načetli jste soubory cookie pomocí ?
 * Nastavujete cookies pomocí ?


 * valign="top" |
 * valign="top" |



Dynamické generování kódu
Nepoužívejte funkce jako  a   a také   modifikátor vzoru za. Přestože jsou tyto funkce výkonné a pohodlné, jsou ze své podstaty nejisté:
 * valign="top" |


 * Je snazší vkládat libovolné řetězce do textu zpracovaného regulárními výrazy, což – v kombinaci s modifikátorem vzoru  – může vést k útokům vkládání kódu.
 * Je těžší číst a udržovat kód, který je součástí řetězce.
 * Nástroje pro statickou analýzu nezachytí varování a chyby v kódu.
 * Mezipaměti operačních kódů (jako APC) nemohou ukládat kód smíšený do řetězců.
 * má někdy problémy se svozem odpadu.
 * Smyčka, která má uvnitř, vytvoří při každé iteraci novou funkci.

Někdy tyto funkce opravdu potřebujete (samozřejmě  potřebuje ke spuštění  ), ale ve většině případů bychom raději viděli funkci rozbitou a označovanou jako zpětné volání.

Inline funkce lambda usnadní vložení zpětného volání a zároveň si zachovají výhody kódu, který je napsán v nativní syntaxi namísto řetězců.


 * Cokoli externího, co se používá v části regulárního výrazu, by mělo být escapováno s preg_quote ($externalStr, $delimiter). It puts a backslash in front of every character that is part of the regular expression syntax, and escapes also the delimiter given as second parameter:


 * valign="top" |
 * valign="top" |

External programs

 * valign="top" |
 * executed the program via from namespace  ?
 * quoted all arguments to external programs using the above's secure parameter passing facilities (which is basically everything except for )?

Note that old /  are not recommended because they make it easier for developers to miss escaping a parameter.
 * valign="top" |
 * valign="top" |

Forms

 * valign="top" |
 * used  to implement anti-CSRF measures?
 * used when checking the token to avoid timing attacks?
 * reduced reviewer anxiety by using or extending MediaWiki's existing form functionality?


 * valign="top" |
 * valign="top" |

GET data

 * valign="top" |
 * reduced reviewer anxiety by using  instead of  ?


 * valign="top" |
 * valign="top" |

Output (API, CSS, JavaScript, HTML, XML, etc.)
Any content that MediaWiki generates can be a vector for XSS attacks.
 * valign="top" |
 * used the  and   helper classes?


 * reduced reviewer anxiety by using ResourceLoader to deliver CSS and JavaScript resources?
 * valign="top" |
 * valign="top" |

User provided CSS
User provided CSS (Say for use in a  attribute) needs to be sanitized to prevent XSS, as well as to disallow insertion of tracking images (via background-image), etc
 * valign="top" |
 * Use the Sanitizer::checkCss method for any css received from a user, possibly along with the Html class.


 * For CSS provided by the extension (and not the user), this is not needed (and will remove some valid things like ). However, extension provided CSS should go in stylesheets loaded by ResourceLoader, and not in   attributes.
 * valign="top" |
 * valign="top" |

POST data

 * valign="top" |
 * reduced reviewer anxiety by using  instead of
 * Always validate that any POST data received is what you expect it to be


 * valign="top" |
 * valign="top" |

Query strings

 * valign="top" |
 * See #GET data above


 * valign="top" |
 * valign="top" |

Sessions

 * valign="top" |


 * valign="top" |
 * valign="top" |

Reviewer anxiety

 * valign="top" |
 * Clearly added comments to explain unexpected or odd parts of your code?


 * valign="top" |
 * valign="top" |

SQL queries

 * valign="top" |
 * used MediaWiki's database wrappers?


 * }

Automated checking
Some of these issues can be checked with phan-taint-check-plugin, which is required for all MediaWiki code in Wikimedia production. This is of course just a tool, and it cannot detect all issue types, and may miss issues even in the issue types it can check for.