小编ram*_*owl的帖子

CloudFront 可以保护 EC2 服务器免受 DDOS 攻击吗?

我正在为 EC2 实例上的 Web 应用程序维护一个嵌入式数据库。由于这个中央服务器是单线程的,它很容易受到 DDOS 的攻击(即使是非分布式攻击也会使其瘫痪)。

AWS 为其 CDN CloudFront 提供了 DDOS 保护,所以我想知道是否可以使用 CloudFront 作为围绕我的 EC2 实例的间接层来进行 DDOS 保护。

问题在于如何有效防止用户绕过 CloudFront 直接攻击服务器。我的问题:

  • 用户是否能够跟踪网络路径以获取我的 EC2 实例的 IP,还是只能看到 Cloudfront 的 API url?
  • 如果流量不是通过 Cloudfront 来的,有没有办法阻止流量到达我的 EC2 实例?我看到有一个选项可以从 Cloudfront 发送自定义源标头,但这并不能解决问题——我仍然需要处理我的 EC2 实例中的每个请求。有没有办法为我的服务器配置输入规则,以防止它处理非 Cloudfront 请求?

我刚开始考虑网络架构和安全性,因此非常感谢所有建议!

ddos amazon-ec2 amazon-web-services

4
推荐指数
1
解决办法
4084
查看次数

什么是Rust编译器标志来禁用堆分配?

我正在阅读一篇文章,其中说Rust有一个编译器选项来禁用堆分配:

Rust有许多依赖于堆的标准库功能,比如盒子.但是,Rust具有编译器指令以完全禁用任何使用堆的语言功能,并静态验证是否未使用这些功能.编写没有堆使用的Rust程序是完全可行的.

在编译时检查任何错误的堆分配的能力对我来说非常有价值.你怎么在Rust做到这一点?我没有在rustc手册页中看到任何相关标志.

rust

3
推荐指数
1
解决办法
210
查看次数

Gob 无法使用 nil 指针值对映射进行编码

当我尝试将映射编码为指针(如果其中一个值为零)时,Gob 的编码会返回错误。这似乎与文档相矛盾(但我可能误解了含义):

在切片和数组以及映射中,所有元素(甚至零值元素)都会被传输,即使所有元素均为零。

代码:

package main

import (
    "bytes"
    "encoding/gob"
)

type Dog struct {
    Name string
}

func main() {
    m0 := make(map[string]*Dog)
    m0["apple"] = nil

    // Encode m0 to bytes
    var network bytes.Buffer
    enc := gob.NewEncoder(&network)
    err := enc.Encode(m0)
    if err != nil {
        panic(err) // Output: panic: gob: encodeReflectValue: nil element
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

panic: gob: encodeReflectValue: nil element
Run Code Online (Sandbox Code Playgroud)

在这种情况下,gob 失败有充分的理由吗?看来两个明显的选项中的任何一个都比失败更可取:1)不要使用零值的值对任何键进行编码,或者2)即使值是零值也对所有键进行编码。在目前的情况下,最佳实践是递归扫描我的结构以查看是否有任何 nil 映射值,如果有则删除这些键?如果需要进行此检查,则似乎应该由encoding/gob 包而不是用户负责。

此外,该规则不仅仅是“gob 无法对键值为 nil 的映射进行编码”,因为如果值类型是切片,则接受 nil:

func main() {
    m0 := make(map[string][]string)
    m0["apple"] = …
Run Code Online (Sandbox Code Playgroud)

pointers go gob

2
推荐指数
1
解决办法
1935
查看次数

如何在 Ant Design 菜单中删除填充?

我不知道如何使菜单中的文本左对齐(需要这样做以与其他文本对齐)。在下图中,我希望“一”、“二”和“三”一直在左边。

在此处输入图片说明

我尝试在我能想到的任何地方将填充和边距设置为 0,但无济于事:

import React, { Component } from "react";
import { Menu, Icon } from 'antd';
const SubMenu = Menu.SubMenu;
const MenuItemGroup = Menu.ItemGroup;

class CategoryNav extends React.Component<Props> {
  handleClick = (e: Event) => {
    console.log('click ', e);
  }
  render() {
    return (
      <Menu
        onClick={this.handleClick}
        style={{ width: 256, height: "100%", paddingLeft: 0, marginLeft: 0 }}
        defaultSelectedKeys={['1']}
        defaultOpenKeys={['sub1']}
        mode="inline"
      >
        <SubMenu style={{ paddingLeft: 0, marginLeft: 0 }} key="sub1" title={<span>One</span>}>
          <Menu.Item style={{ paddingLeft: 0, marginLeft: 0 }} key="1">Option 1</Menu.Item>
          <Menu.Item key="2">Option …
Run Code Online (Sandbox Code Playgroud)

css padding reactjs antd

2
推荐指数
1
解决办法
5076
查看次数

为什么Go套接字比C ++套接字慢?

我在Go和C ++中对一个简单的套接字乒乓测试进行了基准测试。客户端首先向服务器发送0。服务器增加它得到的任何数字,然后将其发送回客户端。客户端将数字回显到服务器,并在数字为1,000,000时停止。

客户端和服务器都在同一台计算机上,因此在两种情况下我都使用Unix套接字。(我也尝试了相同主机的TCP套接字,结果也相似)。

Go测试花费14秒,而C ++测试花费8秒。这让我感到惊讶,因为我已经运行了大量的Go vs. C ++基准测试,并且只要我不触发垃圾收集器,Go的性能就与C ++一样。

我在Mac上,尽管评论者还报告说Go版本在Linux上速度较慢。

想知道我是否缺少一种优化Go程序的方法,或者引擎罩下是否存在效率低下的问题。

以下是我运行以执行测试的命令以及测试结果。所有代码文件均粘贴在此问题的底部。

运行Go服务器:

$ rm /tmp/go.sock
$ go run socketUnixServer.go
Run Code Online (Sandbox Code Playgroud)

Run Go客户端:

$ go build socketUnixClient.go; time ./socketUnixClient

real    0m14.101s
user    0m5.242s
sys     0m7.883s
Run Code Online (Sandbox Code Playgroud)

运行C ++服务器:

$ rm /tmp/cpp.sock
$ clang++ -std=c++11 tcpServerIncUnix.cpp -O3; ./a.out
Run Code Online (Sandbox Code Playgroud)

运行C ++客户端:

$ clang++ -std=c++11 tcpClientIncUnix.cpp -O3; time ./a.out

real    0m8.690s
user    0m0.835s
sys     0m3.800s
Run Code Online (Sandbox Code Playgroud)

代码文件

转到服务器:

// socketUnixServer.go

package main

import (
    "log"
    "net"
    "encoding/binary"
)

func main() {
    ln, err := net.Listen("unix", "/tmp/go.sock") …
Run Code Online (Sandbox Code Playgroud)

c++ sockets linux network-programming go

2
推荐指数
1
解决办法
189
查看次数

如何从切片复制最后一个元素

我是 Rust 新手,正在尝试学习使用借用检查器的惯用方式。

我正在尝试编写一个简单的函数,它接受一个切片(数据类型的通用)并返回最后一个元素,这样我就可以在之后改变切片。天真的实现给了我一个错误:

fn last_element<T>(list: &[T]) -> T {
    list[list.len() - 1]
}

fn main() {
    let mut slice = [1, 2, 3, 4, 5];
    let x = last_element(&slice);
    println!("{}", x);

    // I want to be able to mutate slice after extracting last element
    slice[2] = 17;
}
Run Code Online (Sandbox Code Playgroud)

错误是cannot move out of type[T] , a non-copy slice。我发现一种解决方法是让函数返回引用:

fn last_element<T>(list: &[T]) -> &T {
    &list[list.len() - 1]
}

fn main() {
    let mut slice = [1, 2, …
Run Code Online (Sandbox Code Playgroud)

copy slice rust

1
推荐指数
1
解决办法
433
查看次数

C++ 将 Unix 时间(纳秒)转换为本地时区中可读的日期时间

我有一个 Unix 时间(自纪元以来的纳秒),我想在该时间和可指定时区中的可读字符串(使用 TZ 字符串)之间来回切换,并保留纳秒。我正在使用 C++17,但愿意迁移到 C++20(如果它能让事情变得更容易的话)。

例子:

uint64_t unix_time = 1669058870115719258;
std::string datetime = convert_unix_to_datetime(unix_time, "America/Detroit");
std::cout << datetime << "\n";
std::cout << convert_datetime_to_unix_time(datetime) << "\n";
Run Code Online (Sandbox Code Playgroud)

期望的输出:

2021-11-21 14:27:50.115719258
1669058870115719258
Run Code Online (Sandbox Code Playgroud)

如果这是一个基本问题,我深表歉意——我在网站上进行了搜索并尝试实现解决方案,但一直对不同的 C++ 版本感到困惑,无论日期时间是 UTC 还是本地时区,不同的类型,如 chrono::time_point 与 time_t 等.希望能在这里找到一个简单的解决方案。

c++ time c++-chrono c++17 c++20

1
推荐指数
1
解决办法
1623
查看次数