Chat2:使用 PHP、jQuery 和 文本文件 的群聊室

Avatar of Chris Coyier
Chris Coyier on

DigitalOcean 为您旅程的各个阶段提供云产品。立即开始使用 $200 的免费积分!

这是我们之前发布在 CSS-Tricks 上的原始 聊天室 的更新。在某些方面,技术是一样的。我们将使用 PHP 与服务器通信,使用 jQuery 使聊天继续进行,聊天内容将像第一个版本一样存储在 .txt 文件中。

变化的是添加了一些新功能

  • 用户名对当前聊天的用户是唯一的
  • 您可以看到一个“当前聊天”用户列表
  • 有多个聊天室

一点点 MySQL

虽然第一个版本根本没有使用数据库,但我们将在这个版本中使用一点 MySQL。下载中有一个名为 Setup.sql 的文件,用于构建初始数据库。MySQL 不用于聊天本身,而是用于其他两件事

  • 跟踪活跃用户
  • 聊天室

当有人进入聊天时,他们会选择一个用户名。使用一些 jQuery,它会发出一个 AJAX 请求来查看该用户名是否当前在数据库中使用。如果正在使用,您将收到警告

否则,它表示没问题

如果没问题,并且您点击加入聊天,该用户名将被放入数据库,因此对该名称的进一步检查将告诉其他人该名称不可用。闲置用户将从数据库中删除。

添加/编辑/删除聊天室

聊天室的名称保存在数据库中。要添加一个新的聊天室,只需在数据库中添加一个新的行,其中包含聊天室的名称和您要存储聊天的文本文件的名称

然后只需要确保文本文件在服务器上的正确位置,并具有正确的服务器写入权限(请参阅下载以获取正确的位置)。

jQuery

我相信您现在已经注意到我们还没有看任何实际代码。这是有意的。所有代码都可以在下载中获得(见下文)。它不是那么多,以至于会让人不知所措,但我认为它对于标准的书面教程/概述来说太多了。相反,让我们概述它所负责的内容

用户名检查:在聊天主页上,当您选择用户名时,jQuery 会在那里监视该文本输入。当您键入一个字符(在 keyup 上)时,它会询问一个特定的 PHP 文件(通过 AJAX)该用户名是否正在使用。PHP 文件会以是或否进行回复,并相应地将一条消息附加到屏幕上。

消息框:当用户在发送消息的 textarea 中键入时,jQuery 会监视该框并确保文本少于一定数量的字符(通过 textarea 上的 maxlength 属性设置)。

发送消息:当在聊天框中按下回车/Enter 键时,它的值将被发送进行处理。PHP 将文本写入文本文件。

更新聊天:每隔几秒钟,jQuery 就会询问一个 PHP 文件轮询文本文件,以查看是否有任何新行,如果有,则将它们显示出来。

它没有的功能

  • 您无法踢人出去
  • 它不支持特殊字符

你想添加那些东西吗?我很乐意,我会更新它。

演示和下载

下载文件

更新:事实证明,它在一个特定方面存在一个安全问题,这会导致授予对服务器上任何文件的访问权限。一位读者向我展示了他们如何公开访问我的 wp-config.php WordPress 文件,这当然非常敏感。漏洞在于 update.php 文件,该文件接受“state”和“file”参数。直接访问,并使用相对文件路径,您可以通过这种方式访问受保护的文件。修复后,我会更新可下载的代码。

更新:Jason Gradwell 建议对 PHP 端进行一些保护,这将要求该文件仅通过 Ajax 调用,并且只能从特定来源调用。

<?php if (!isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_REFERER']!="http://your-site.com/path/to/chat.js") { 
  die(); 
} ?>

致谢

特别感谢 Kenrick Beckett,他创建了最初支持此代码的代码,以及 Jason Lengstorf,感谢他查看并安全地整理了一些内容。

未来展望

以下是一些人们在评论中提出的建议,或者我个人认为很酷的建议

  • 上面提到的安全问题已修复
  • 防洪控制(例如,您每 5 秒只能提交 1 条消息)
  • 注销链接(删除 PHP 会话)
  • 允许一些 HTML,但不允许其他 HTML(标签白名单)。例如,允许 <a href=””>,但仍然删除 javascript。可能还有一些用于 HTML 的按钮(WYSIWYG?)。对 <code> 标签中的内容进行代码突出显示。
  • 允许注册,以便能够永久拥有一个特定的用户名(以及随之而来的所有内容,例如“忘记密码”)。
  • 防止不存在的聊天室名称,例如 /Chat2/room/?name=LOL
  • 支持所有特殊字符(UTF-8)
  • 私人消息(@)(只有与该用户名匹配的人才能看到)
  • 踢人出去/禁止 IP 地址(仅作为管理员用户,或者可能只是 IP 地址黑名单)
  • 更多表情符号
  • 有一个实际的提交按钮(对于支持 JavaScript 但没有常规键事件的移动设备)
  • 自动过滤不良词汇
  • 使用外部登录系统,例如 Twitter oAuth、Google 登录或 Facebook Connect
  • 用户名作为电子邮件地址,然后使用 Gravatars
  • 具有 4 个字母扩展名的链接不起作用(例如 .info)
  • 长轮询,而不是每隔几秒钟就进行请求