清理来自 irc 的输入

Posted

技术标签:

【中文标题】清理来自 irc 的输入【英文标题】:Sanitizing Input from irc 【发布时间】:2011-03-20 15:44:52 【问题描述】:

所以我正在考虑编写一个 irc bot/bot 扩展程序,让用户通过启动游戏来玩某些基于文本的游戏,

发送他们输入的某些行的部分内容(如果不在机器人频道中,则正则表达式匹配游戏信号。rbot 游戏名进入森林。发送“进入森林)到游戏的标准输入,

虽然标准的游戏外由机器人缓存并通过管道传输到频道(例如。 “让我们为 鸭子被打败了” 被读入机器人内部的行缓存,然后 机器人将其发送到适当的频道

游戏名称:让我们为之欢欣鼓舞

游戏名称:鸭子被打败了” )

但我有点担心 irc 上的人可能会做一些棘手的事情,剥离所有不可打印的字符是否足够安全?如果一个程序退出(比如他们输入了游戏的退出命令),当您尝试写入该程序的文件描述符时会发生什么情况 std in(error)?还有其他潜在问题吗? 请注意,我将在 linux 或 *bsd 上运行它,所以我不需要担心 Windows 特定的事情。

【问题讨论】:

【参考方案1】:

您可能需要考虑的一些基础知识:

允许您知道安全的文本通过比尝试过滤您认为可能不安全的文本要安全得多。游戏可能只接受字母数字字符,因此请检查输入是否仅包含这些值,并拒绝其他任何内容。 在具有最低权限的帐户下运行机器人,并尽可能限制对计算机其余部分的访问。如果您可以将其完全沙盒化或虚拟化,那就更好了。 您应该观察子进程的 PID 是否终止,并决定在它退出、重新启动或其他命令失败、退出机器人等情况下该怎么做。

只要将服务暴露给网络,就会出现许多可能的安全问题,您最好阅读有关一般安全编程主题的内容,例如快速谷歌搜索出现this how-to。

偏执是值得的。如果不遵循正确的安全编程实践,您最多可以希望没有人诚实地尝试破解它。

【讨论】:

受限制的 shell(如 rbash)有什么价值吗?【参考方案2】:

转义引号和管道将使您免受大多数事情的影响

" ' |

【讨论】:

管道有什么作用?我可以看到 sql 注入的单引号和双引号......(但这可能不是由数据库驱动的系统)。但是,如果这是 mysql 注入,您会忘记反斜杠,这同样危险。 抱歉,忘记了反斜杠。但无论如何,对于管道:我假设这是一个从命令行运行的 irssi 脚本...打破引号 + | = 攻击者在你的 shell 中有一个现场日 管道只是一个“或”,而 & 是一个“与”。还有很多你需要担心的字符:#&;|*?~<>^()[]$\, \x0A and \xFF. ' and " (php.net/manual/en/function.escapeshellcmd.php)【参考方案3】:

用户输入来自哪里并不重要,重要的是它的使用方式。

影响 IRC 的一种攻击是 CRLF injection。如果您通过 IRC 回显用户输入,这将为您提供。攻击者可以尝试注入一个carrage return (\r) 换行符(\n)。这种类型的注入会影响许多协议,包括HTTP 和SMTP。在 IRC 的情况下,攻击者将能够强制您的机器人向 IRCD 发送命令(例如 /join 或 /kick 或 /ban :)。确保查看 ASCII table 并过滤掉所有 0x0A (\n) 和 0x0D (\r)。在大多数情况下,新行就足够了,因此请确保对两者都进行过滤。

请务必阅读OWASP A1: Injection。特别是如果您在 sql 查询中使用用户输入或在命令行上调用进程。

【讨论】:

以上是关于清理来自 irc 的输入的主要内容,如果未能解决你的问题,请参考以下文章

如何使用来自 AngularJS 控制器的无效输入正确清理表单?

何时最好清理用户输入?

在 Django 中清理表单数据

为啥在清理中删除“tel:”链接,以及如何允许它们

使用 JSON Sanitizer 清理来自 Spring MVC 控制器的响应 JSON?

如何清理输入