Dans le développement d'applications PHP typique, la plupart des logiques impliquent des tâches de traitement de données, telles que la confirmation si l'utilisateur s'est connecté avec succès, l'ajout d'articles au panier et le traitement des transactions par carte de crédit.
Les données peuvent provenir d'innombrables sources. En tant que développeur soucieux de la sécurité, vous devez distinguer de manière simple et fiable deux types de données :
l Données filtrées
l Données contaminées
Toutes les données fiables que vous définissez vous-même peuvent être considérées comme des données filtrées. Une donnée que vous définissez vous-même est toute donnée codée en dur, telle que les données d'adresse e-mail suivantes :
$email = 'chris@example.org';
L'adresse e-mail chris@example.org ci-dessus ne provient d'aucune source de données distante. C'est évidemment crédible. Toutes les données provenant d'une source de données distante sont entrées, et toutes les données d'entrée sont entachées et doivent être filtrées avant utilisation.
Les données contaminées font référence à toutes les données dont la légalité ne peut pas être garantie, telles que les formulaires soumis par les utilisateurs, les e-mails reçus des serveurs de messagerie et les documents XML envoyés depuis d'autres applications Web. Dans l'exemple précédent, $email est une variable contenant des données filtrées. Les données sont la clé, pas les variables. Les variables ne sont que des conteneurs de données, qui sont souvent écrasées par des données contaminées lors de l'exécution du programme :
$email = $_POST['email'];
De bien sûr, c'est pourquoi $email est appelé une variable. Si vous ne souhaitez pas que les données changent, vous pouvez utiliser des constantes à la place :
CODE :
define('EMAIL', 'chris@example.org');
S'il est défini avec l'instruction ci-dessus, EMAIL est une constante inchangée avec la valeur chris@example.org tout au long du script et ne changera pas même si vous essayez de le réaffecter (généralement accidentellement). Par exemple, le code suivant génère chris@example.org
(Tenter de redéfinir une constante provoquera un message d'erreur avec un niveau d'avis).
CODE :
Conseils
Pour plus d'informations sur les constantes, veuillez visiter http://www.php . cn/
Comme indiqué au chapitre 1, register_globals peut rendre difficile la détermination de l'origine d'une variable telle que $email. Toutes les données provenant de sources externes doivent être considérées comme contaminées jusqu'à ce qu'elles soient prouvées légitimes.
Bien qu'un utilisateur puisse envoyer des données de différentes manières, la plupart des applications effectuent les opérations les plus importantes en fonction des résultats de la soumission du formulaire. Un autre attaquant peut compromettre simplement en manipulant les données soumises (la base sur laquelle votre application fonctionne), et le formulaire ouvre facilement la conception de votre application et les données que vous devez utiliser. C'est pourquoi la gestion des formulaires est la première préoccupation parmi tous les problèmes de sécurité des applications Web.
Un utilisateur peut transférer des données vers votre application de trois manières :
l Via l'URL (telle que la méthode de données GET)
l Via le contenu d'une requête (telle que la méthode de données POST)
l Via HTTP informations d'en-tête (telles que les cookies)
Étant donné que les informations d’en-tête HTTP ne sont pas directement liées au traitement du formulaire, elles ne seront pas abordées dans ce chapitre. En général, la suspicion des données GET et POST peut être étendue à toutes les entrées, y compris les en-têtes HTTP.
表单通过GET或POST请求方式传送数据。当你建立了一个HTML表单,你需要在form标签的method属性中指定请求方式:
<form action="http://example.org/register.php" method="GET">
在前例中,请求方式被指定为GET,浏览器将通过URL的请求串部分传输数据,例如,考虑下面的表单:
CODE:
<form action="http://example.org/login.php" method="GET"> <p>Username: <input type="text" name="username" /></p> <p>Password: <input type="password" name="password" /></p> <p><input type="submit" /></p> </form>
如果我输入了用户名chris和密码mypass,在表单提交后,我会到达URL为http://www.php.cn/的页面。该URL最简单的合法HTTP/1.1请求信息如下:
CODE:
GET /login.php?username=chris&password=mypass HTTP/1.1 Host: example.org
并不是必须要使用HTML表单来请求这个URL,实际上通过HTML表单的GET请求方式发送数据与用户直接点击链接并没有什么不同。
记住如果你在GET方式提交的表单中的action中试图使用请求串,它会被表单中的数据所取代。
而且,如果你指定了一个非法的请求方式,或者请求方式属性未写,浏览器则会默认以GET方式提交数据。
为说明POST请求方式,只对上例进行简单的更改,考虑把GET请求方式更改为POST的情况:
CODE:
<form action="http://example.org/login.php" method="POST"> <p>Username: <input type="text" name="username" /></p> <p>Password: <input type="password" name="password" /></p> <p><input type="submit" /></p> </form>
如果我再次指定用户名chris和密码mypass,在提交表单后,我会来到http://www.php.cn/页面。表单数据在请求的内部而不是一个URL的请求串。该方式最简单的合法HTTP/1.1请求信息如下
CODE:
POST /login.php HTTP/1.1 Host: example.org Content-Type: application/x-www-form-urlencoded Content-Length: 30 username=chris&password=mypass
现在你已看到用户向你的应用提供数据的主要方式。在下面的小节中,我们将会讨论攻击者是如何利用你的表单和URL作为进入你的应用的缺口的。
以上就是PHP安全-表单与数据的内容,更多相关内容请关注PHP中文网(www.php.cn)!