Comment éviter l'injection de code en C ++

La première règle d'éviter Code injecter dans les programmes C ++ est jamais, déjà, permettre une entrée d'utilisateur à traiter par un interprète de langue d'usage général. Une erreur courante avec SQL-injection est que le programme accepte la saisie de l'utilisateur comme si elle était toujours acceptable et l'insère dans une requête SQL qu'elle a ensuite navires au large au moteur pour le traitement de base de données.

A titre d'exemple, un programme demandant l'entrée d'utilisateur sur une date pourrait être piraté. L'approche conviviale sûr et le plus serait de fournir à l'utilisateur un graphique de calendrier à partir de laquelle il pourrait choisir les dates de début et de fin. Le programme serait alors de créer une date basée sur ce que l'utilisateur a cliqué.

Si cela est impossible, le programme doit vérifier soigneusement l'entrée pour vous assurer que l'entrée était dans le bon format pour une date, dans ce cas, aaaa / mm / jj - en d'autres termes, les quatre chiffres suivis par une barre oblique suivie de deux chiffres et une barre oblique et, enfin, deux autres chiffres. Rien d'autre ne devrait être considérée comme entrée acceptable.




Parfois, vous pouvez # 8242-t-être spécifique sur le format. Si vous devez permettre à l'utilisateur de saisir du texte flexible, alors vous pouvez au moins éviter les caractères spéciaux. Par exemple, il # 8242-s à peu près impossible de faire l'injection de code SQL sans l'aide d'un guillemet simple ou double.

Vous pouvez # 8242-t balises insert HTML sans l'aide d'un moins (lt;) et supérieur à (>) signe. Ou vous pouvez simplement prendre l'approche que d'autres que texte ASCII rien ne sera toléré:

// Vérifier une chaîne de caractères # 8242-de la # 8242- pour vous assurer qu'il # 8242 s-ASCIIsize_type emblée = s.find_first_not_of ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890 _") - if (! Off = string :: npos) {cerr lt; lt; "Erreur n" -}

Ce code recherche la chaîne s pour un personnage qui # 8242-S pas un des caractères A à Z, a à z, 0 à 9, ou de soulignement. Si elle constate un tel caractère, alors le programme rejette l'entrée.

Si vous autorisez seuls les caractères latins présentés ici, votre demande ne sera pas utilisable dans de nombreux marchés étrangers tels que ceux que Don # Utiliser ensembles 8242-t Anglais de caractères (comme l'arabe, le chinois, l'hébreu ou le russe, pour ne citer que quelques-uns ). Vous pourriez avoir à prendre l'approche opposée et il suffit de regarder pour les mauvais caractères.


» » » » Comment éviter l'injection de code en C ++