Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 新公司的网络安全-我做得对吗?_Javascript_Java_Php_Ajax_Sockets - Fatal编程技术网

Javascript 新公司的网络安全-我做得对吗?

Javascript 新公司的网络安全-我做得对吗?,javascript,java,php,ajax,sockets,Javascript,Java,Php,Ajax,Sockets,在过去的八个月里,我一直在一家社交媒体管理工具公司工作。这将是我发布的第一个主要网站,我担心它的安全性和系统。显然,安全必须是一个非常重要的优先事项,因为我的目标客户是希望增加其社会关注度的企业和个人。如果我公司的网站遭到黑客攻击,我客户的任何个人资料被访问,这将破坏我建立起来的任何声誉,并大大减缓公司的发展。所以今天我想和大家分享我是如何写这个网站的,看看是否有我可能遇到的安全漏洞,或者是否有更好的方法来写我现有的任何系统 服务器系统(Java方面) 当我刚开始在这家公司工作时,我主要了解Ja

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

服务器系统(Java方面)

当我刚开始在这家公司工作时,我主要了解Java,因为我在以前的几份工作中使用过它。虽然其他语言可能是类似的,更强大的,如C++,我决定坚持我所知道的最好。我觉得当我有30000多条线路时,我仍然做出了正确的选择,因为我的服务器每占用一点CPU,只占用分配给它的64MB内存的11%-24%。任何时候,C++或类似的图形切换都不值得花费这么多的时间来改善性能。 我有一个为每个社交档案运行的服务器。如果一个客户端有一个带有Facebook页面的帐户和两个Twitter帐户,那么该客户端将运行三台服务器。每个人都会根据社交平台(Facebook和Twitter等)加载我软件的特定模块。我希望每个社交档案都有一台服务器的原因是,一些支付计划可能会添加越来越多的社交档案。随着越来越多的社交档案,我需要越来越多的资源来运行该服务器。我宁愿将最小值分配给每个社交配置文件服务器,也不愿为一个具有13个社交配置文件的客户端不断调整一个大型服务器的性能(例如)。另一个好处是能够轻松删除社交配置文件,或者在我的当前邮箱已满且客户端请求另一个社交配置文件服务器时,将服务器“溢出”到另一个邮箱。如果我需要扩展一个大型服务器,因为在一个已经满了的盒子上增加社交配置文件的请求,可能会变得混乱。这样做不对吗?我的逻辑有什么缺陷吗

这些服务器将处理邮件调度、监听“社交事件”(新关注者、直接消息等)以及根据我的网站功能对其做出相应反应等工作

账户注册

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

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

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

服务器到浏览器的通信

我使用AJAX与PHP脚本通信,PHP脚本使用套接字与Java服务器通信。下面是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”用于删除预定的post。每个bot索引都是每个计划帖子的一个完全唯一的标识符。社交计数是附加到该客户帐户的每个社交档案的计数器。例如,如果我有四个社交档案链接到我的帐户,我可以与社交计数为1-4的服务器通信。如果我的一个朋友创建了一个帐户,并将两个社交档案链接到他们的帐户,他们可以与社交计数1-2进行通信。因此,社交计数仅对每个客户的帐户是唯一的。完全有可能使社会计数完全独一无二。使用前面的例子,我可以访问社交计数1-4,我的朋友可以访问社交计数5-6。这是一个更理想的系统,以防止可能的攻击者知道社会计数1始终存在吗

还有一个客户机/帐户ID,正如预期的那样,它是accounts MySQL表中的自动递增整数。我曾经要求在AJAX调用的数据中发送客户机ID,但后来我了解到,任何人都可以通过AJAX与我服务上的任何服务器通信,这显然一点都不好。目前,当他们登录时,我将客户机ID存储在PHP会话变量中。因此,因为我在网站上创建了第一个帐户,所以我的客户端ID为1,帮助我测试的朋友ID为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时编写的,所以请原谅我的马虎。我目前正在将返回的address:port存储到会话变量中,因此只需加载一次。公司的某些部门向我的客户设置的外部服务器发送数据包。因此,他们的社交资料的地址/端口是w