2010-07-25 8 views
3

Je pensais à écrire un bot irc/extension bot qui permet aux utilisateurs de jouer à certains jeux à base de texte en commençant le jeu,assainissant Entrée de irc

envoyer des parties de certaines lignes qu'ils entrent (match regexp pour le signal de jeu si pas dans le canal des bots ex.rbot nom de famille entrer dans la forêt.envoie "entrer dans la forêt" pour std in of game,

alors que la norme hors du jeu est mise en cache par bot et canalisée vers le canal (ex: "laissez-nous se réjouir pour le canard a été vaincu " obtient lu dans un cache de ligne à l'intérieur du bot, puis le bot l'envoie sur le canal approprié comme

gamename: exultons pour

gamename: le canard a été vaincu » )

Mais je suis un peu inquiet au sujet des choses difficiles les gens sur irc pourraient faire, serait non imprimable en éliminant tous les les caractères sont-ils assez sûrs? Si un programme se ferme (disons qu'ils entrent dans la commande Quitter pour le jeu), que se passe-t-il lorsque vous essayez d'écrire dans le descripteur de fichier pour les programmes std dans (erreur)? D'autres problèmes potentiels? Remarque: Je vais lancer ceci sur linux ou sur * bsd, donc je n'ai pas besoin de m'inquiéter des choses spécifiques à Windows.

Répondre

1

échapper à des citations et des tuyaux vous garder à l'abri de la plupart des choses

" ' | 
+0

Que fait le tuyau? Je peux voir les guillemets simples et doubles pour l'injection de sql ... (mais ceci pourrait ne pas être un système actionné par DB). Cependant, si c'était mysql injection, vous oubliez le backslash qui est tout aussi dangereux. – rook

+0

désolé, oublié le backslash. Mais de toute façon, pour le tuyau: je suppose que c'est un script irssi exécuté à partir de la ligne de commande ... sortir des guillemets + | = attaquant ayant un jour de champ dans votre coquille –

+1

un tuyau est juste un "ou" le & est un "et". Il y a aussi beaucoup plus de caractères dont vous avez besoin: '# &; | *? ~ <> ^() [] {} $ \, \ X0A et \ xFF. 'et "' (http://php.net/manual/en/function.escapeshellcmd.php) – rook

2

Quelques notions de base que vous pouvez envisager:

  • Il est beaucoup plus sûr pour permettre le texte à travers que vous connaissez est sûr, que pour essayer de filtrer le texte que vous pensez ne pas être en sécurité. Les jeux n'acceptent probablement que des caractères alphanumériques, vérifiez donc si l'entrée ne contient que ces valeurs et refusez toute autre chose.
  • Exécutez le bot sous un compte disposant des autorisations les plus faibles possibles et d'un accès limité au reste de la machine. Si vous pouvez bac à sable ou virtualiser complètement, encore mieux.
  • Vous devriez être en train de regarder le PID du processus enfant pour la fin, et de décider ce qu'il faut faire si elle sort, redémarrez ou échec d'autres commandes, quitter le bot, etc.

Il y a un certain nombre de possibles problèmes de sécurité lors de l'exposition des services sur le réseau, vous feriez bien de lire sur les sujets de programmation sécurisés généraux, une recherche rapide google apparaît this how-to par exemple.

Il est payant d'être paranoïaque. Sans suivre les bonnes pratiques de programmation sécurisées, tout ce que vous pouvez espérer, c'est que personne ne tente honnêtement de le casser.

+0

est un shell restreint (comme rbash) vaut n'importe quoi? –

1

Peu importe d'où vient l'entrée de l'utilisateur, cela dépend de son utilisation. La seule attaque affectant l'IRC est CRLF injection. Cela viendra pour vous si vous renvoyez l'entrée de l'utilisateur sur IRC. Un attaquant pourrait essayer d'injecter un retour chariot (\ r) en retour chariot (\ n). Ce type d'injection affecte de nombreux protocoles, y compris HTTP et SMTP. Dans le cas d'IRC, l'attaquant pourrait forcer votre bot à envoyer une commande à l'IRCD (comme/join ou/kick ou/ban :). Assurez-vous de regarder un ASCII table et de filtrer tous 0x0A (\ n) et 0x0D (\ r).Dans la plupart des cas, la nouvelle ligne est suffisante, alors assurez-vous de filtrer les deux. Assurez-vous de lire OWASP A1: Injection. Surtout si vous utilisez une entrée utilisateur dans une requête sql ou si vous invoquez un processus sur la ligne de commande.