新公司的网络安全 - 我这样做了吗?

时间:2017-01-14 02:03:00

标签: javascript java php ajax sockets

过去八个月我一直在社交媒体管理工具公司工作。这将是我发布的第一个主要网站,我对其安全性和系统感到担忧。显然,安全性必须是一个非常重要的优先事项,因为我的目标客户是希望发展社交关注的企业和个人。如果我公司的网站被黑客攻击并且我的任何客户的个人资料被访问,它将破坏我建立的任何声誉并大大减缓公司的进展。所以今天我想与大家分享我编写网站的方式,看看是否存在任何我可能遇到的安全漏洞,或者是否有更好的方法来编写我现有的任何系统

服务器系统(Java方面)

当我第一次开始在这家公司工作时,我主要了解Java,因为我曾在之前的几个工作中使用它。虽然其他语言可能相似且功能更强大,例如C ++,但我决定坚持我最熟悉的语言。当我的服务器运行时每个CPU使用率都很低,并且仅使用11% - 24%的内存分配64MB内存时,我觉得我仍然做出了正确的选择。在任何一点上切换到C ++或类似的转换都不值得花时间来实现这种可能的性能提升。

我为每个社交个人资料运行了一个服务器。如果客户拥有一个拥有Facebook页面和两个Twitter帐户的帐户,那么将有三个服务器为该客户端运行。每个人都会根据社交平台(Facebook与推特等)加载我软件的特定模块。我之所以想要每个社交个人资料一台服务器,是因为某些付款计划可能会添加越来越多的社交个人资料。随着越来越多的社交个人资料,我需要越来越多的资源来运行该服务器。我宁愿为每个社交个人资料服务器分配最小值,而不是为具有13个社交个人资料的客户端不断调整一个大型服务器的性能(作为示例)。另一个好处是能够轻松删除社交个人资料,或者溢出"溢出"如果我的当前框已满,而客户端请求另一个社交个人资料服务器,则服务器到另一个框如果我需要扩展一个大型服务器,因为在已经完整的盒子上社交配置文件中的请求增加可能会变得混乱。这样做有误吗?我的逻辑在这里有任何缺陷吗?

这些服务器将处理后期调度,聆听"社交活动" (新粉丝,直接留言等)并根据我网站的功能对其作出相应的反应。

帐户注册

我的典型注册系统包含电子邮件,密码和确认密码。我目前没有确认电子邮件系统,但当然会在发布之前添加。有一个"记住我"选项打开任何安全漏洞?如果是这样的话,我可以采取什么措施来防止它们?

我目前的系统根本没有在PHP中使用MySQL。我使用套接字通信将信息发送到我的Java服务器,以在我的MySQL数据库中创建一个帐户。有一个Java服务器只用于" general"沟通不是为了特定的社会概况。想要在Java端而不是在PHP中创建帐户的主要原因是,一旦我添加iOS和Android应用程序,我就可以轻松地发送相同的套接字以在应用程序中创建帐户。发送套接字与Java服务器通信以运行MySQL查询会导致任何问题吗?

处理帐户注册的绝对最正确和最安全的方法是什么?

服务器到浏览器的通信

我正在使用AJAX与使用套接字与我的Java服务器通信的PHP脚本进行通信。这是AJAX调用的基本示例:

$(document).on("click", ".trash", function() {
    //TODO: Add a "are you sure" pop up
    var element = $(this).closest(".scheduleddata");
    var socialCount = element.attr("socialcount");
    var botIndex = element.attr("botid");
    element.css("display", "none");
    element.html("");
    $.ajax({
        url: "/client.php",
        type: "POST",
        dataType: "JSON",
        data: {
            packet: "62:" + botIndex,
            socialCount: socialCount
        },
        timeout: 15000,
        async: true
    });
});

数据包ID" 62"意在删除预定的帖子。每个机器人索引都是每个预定帖子的完全唯一标识符。社交计数是附加到该客户帐户的每个社交个人资料的计数器。例如,如果我有四个链接到我的帐户的社交个人资料,我可以与社交数量为1到4的服务器进行通信。如果我的一个朋友创建一个帐户并将两个社交个人资料链接到他们的帐户,他们可以与社交进行通信计数1 - 2.因此社交统计数据仅对每个客户的帐户而言是唯一的。完全有可能使社会统计完全独特。使用前面的例子,我可以访问社交点数1-4,而我的朋友可以获得5-6。这是否是一个更理想的系统,以防止可能的攻击者知道社交数量#1将永远存在?

还有一个客户端/帐户ID,正如预期的那样,它是帐户MySQL表中的自动递增整数。我曾经要求在AJAX调用的数据中发送客户端ID,但之后我了解到任何人都可以通过AJAX与我服务上的任何服务器进行通信,这显然不是很好。目前,我在登录时将客户端ID存储在PHP会话变量中。因为我拥有在网站上创建的第一个帐户,我的客户端ID是1,我的一位帮我测试的朋友是2,等等。客户端ID永远不会显示,加载,存储或使用在会话变量的任何地方。这有什么安全漏洞吗?如果有人可以编辑该变量并发送正确的数据包,则可以与其他客户的社交档案进行通信,这显然不太好。

对于我的client.php代码,我加载了目标服务器的地址和端口:

<?php
if(isset($_POST['packet']) && isset($_POST['socialCount'])) {
    $socialCount = $_POST['socialCount'];
    if($socialCount > 0) {
        echo json_encode(client::send(strip_tags($_POST['packet']), null, -1, $socialCount));
    }
}

class client {
    public static function send($message, $address, $clientID, $socialCount) {
        if(!isset($_SESSION)) {
            session_start();
        }
        $message = strip_tags($message);
        if($clientID == -1) {
            $clientID = 0;
            if(isset($_SESSION['client_id'])) {
                $clientID = $_SESSION['client_id'];
            } else {
                return null;
            }
        }
        $message .= "\n";
        $port = 3000;
        if(isset($_SESSION["location"][$clientID][$socialCount])) {
            $location = explode(":", $_SESSION["location"][$clientID][$socialCount]);
            $address = $location[0];
            $port = $location[1];
        } else {
            if($address == null) {
                if($clientID == 0 || $socialCount == 0) {
                    $address = "localhost";
                } else {
                    $reply = client::send("14:" . $clientID . ":" . $socialCount, "localhost", 0, 0);
                    if(strcmp($reply, "-1") == 0) {
                        $address = "localhost";
                    } else {
                        $result = explode(':', $reply);
                        $address = $result[0];
                        $port = $result[1];
                    }
                }
            }
            $_SESSION["location"][$clientID][$socialCount] = $address . ":" . $port;
        }
        $socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));
        try {
            socket_connect($socket, $address, $port);
            $message = utf8_encode($message);
            $status = socket_sendto($socket, $message, strlen($message), MSG_EOF, $address, $port);
            if($status != false && $next = utf8_decode(socket_read($socket, $port)))  {
                return substr($next, 2);
            }
        } catch(Exception $e) {

        }
        return null;
    }
}
?>

我觉得大部分代码都可以改进,我在第一次开始学习PHP时就写了这个代码,请原谅任何草率。我目前正在将返回的地址:port存储到会话变量中,所以我只需要加载一次。公司的某些部分将数据包发送到我的客户设置的外部服务器。因此,他们社交档案的地址/端口无论如何都是公共信息。我阻止了来自非白名单的IP地址的传入通信&#34;。这些&#34;白名单&#34; IP现在将是我自己的所有盒子。所以我只是发送数据包而不是理想地接收数据包。这个系统有问题吗?

另外,我认为Java和PHP编码unicode的方式不同。每当我编码unicode并将其从Java服务器发送到PHP服务器并对其进行解码时,它都无法正常工作。我怎么能解决这个问题?几个月来我一直在搞这个问题。

已采取安全措施

如上所述,我已经使用strip_tags并从AJAX调用中删除了所有内容。我也从GoDaddy购买标准SSL,一旦公司开始获得可观的利润,我将升级到他们最强大的SSL计划。

我应该在我的网站中实施哪些其他基本安全措施?

结论

正如您所看到的那样,我试图推出它的公司类型似乎安全性非常重要。我非常希望听到任何人的意见和建议。感谢任何花时间阅读完整帖子的人!

0 个答案:

没有答案