【问题标题】:PHP Chat - Storing id in html5?PHP 聊天 - 在 html5 中存储 id?
【发布时间】:2016-04-07 11:41:59
【问题描述】:

我正在尝试使用 PHP 创建一个简单的聊天。一切都按预期工作,但是遇到了潜在的“漏洞”。我正在使用 AJAX 来检索滚动上的所有聊天数据(很像 Facebook、Twitter 等)。现在问题来了:我目前将聊天 id 存储在动态创建的 div 本身中。例如“

<div class="chat" chat_id="4">
    ....
</div>

人们可以通过浏览器更改 chat_id,这会导致任何输入的文本以不正确的 id 存储在数据库中。防止这种情况的最佳方法是什么?

我目前想到了一种方法,其中所有检索/发起的聊天详细信息(发件人、聊天 ID)都存储在 $_SESSION 变量中。这基本上是出于验证目的,以确保聊天 id 对当前用户有效。

有没有更好的方法来做到这一点?谢谢。

【问题讨论】:

  • 为什么会有chat_id attr?
  • 他们也可以只修改他们的 ajax 调用。为什么要阻止用户这样做?如果他们想在另一个聊天(他们有权访问)中写作,为什么不让他们呢?为什么不简单地在 js 中设置呢?尽管如此,它仍然不安全 - 没有客户端调用/数据。根据定义,客户端可以修改他们发送/执行/接收的所有内容。
  • 如果将聊天id保存在会话中,则可以在检索消息时检查用户。如果用户在会话中没有该聊天 ID,则不要渲染任何内容。作为旁注,我建议将chat_id="" 属性更改为data-chat-id="" 属性。 - 和 data-* 的良好实践
  • 永远不要相信客户端发送的数据
  • 像黑客一样思考,任何人都可以制作 XHR 来做 UI 不允许的事情。真正的安全在服务器上,如果他们修改了 ID 但无权访问它,则应该抛出 403。如果他们确实有访问权限,那么尽管您的 UI 不允许他们做他们想做的事,但他们被允许这样做

标签: javascript php jquery html chat


【解决方案1】:

您可以在此处使用加密,这里是 128 位 Rijndael 加密的示例

<?php
/*
creating cipher object using Rijndael encyrption algorithm with Cipher-block chaining (CBC) as mode of AES encryption
Here I have chosen 128 bit Rijndael encyrption
*/
$cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');

$key = 'abcdefghijklmnopqrstuvwxyzABCDEF';  // choose a strong iv (32 bytes)

$iv = 'abcdefghijklmnop'; // choose a strong iv (16 bytes)

$plainText = 'This is plain text.'; //here you can use your "id" that you want to encrypt

function encrypt($data, $key, $iv) {
    return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv));
}

function decrypt($data,$key,$iv) {
    return mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($data), MCRYPT_MODE_CBC, $iv);
}
echo $ciphertext = encrypt($plainText, $key, $iv);
echo "<br>";
echo $plaintext = decrypt($ciphertext, $key, $iv);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 2017-03-18
    • 1970-01-01
    相关资源
    最近更新 更多