GOW

GOW

quinta-feira, 7 de julho de 2022

Is a Firewall Enough to Protect Your Business From Cybercrimes?

 Can a Basic Firewall Afford Your Business Sufficient Cybersecurity?

Most small business owners are at least somewhat aware that cybercrime is a major threat. It’s estimated that the total cost of cybercrime in the United States alone is $600 billion a year or more. Digital threats can come in a variety of forms, including overt attempts to hack into your systems and subtler, more human plays to obtain your employees’ login credentials.

To guard against these threats, many business owners turn to a firewall, or more specifically, a traditional web application firewall (WAF) to protect their business’s digital assets and networks. But a traditional WAF, while strong, may not be enough by itself protect you against potential threats. That’s why some web asset security providers are working to incorporate more sophisticated tools and features in the next generation of web application firewall solutions.

So why is it that a basic WAF is no longer enough to provide comprehensive security to your business?

How a Firewall Works

Let’s start the discussion by analyzing how a typical firewall works. A firewall can be a piece of hardware or a piece of software, but either way, it’s designed to prevent malicious attacks from getting through your network and affecting your business’s devices.

With a firewall, you can use default settings or customize your own. If you customize your own, you’ll have full control over which types of sources and which types of data can affect your network. For example, you might block incoming data from sources you don’t trust.

Firewalls are excellent security measures for blocking known threats, since they can readily identify the nature of incoming data packets and block them if they look suspicious. However, they also come with some inherent limitations.

The Limitations

These are some of the features and weaknesses that keep firewalls from being a one-size-fits-all way to protect your business from virtual threats.

  • Performance issues. Depending on the settings you’re using, firewalls can interfere with the performance of your individual devices. If each of your employees is running firewall software, it may slow down their machines to the point where they can’t be fully productive.
  • Prohibitive restrictions. Firewalls are designed to block certain websites, certain apps, and other sources of web data. While the majority of these settings will protect your business, some of them may interfere with operations. For example, you may unintentionally block safe websites and sources, making it harder for your employees to do their jobs.
  • Viruses and malware. Firewalls can identify and block data that appears similar to known virus and malware threats. However, they aren’t implemented to block any and all threats in this area. New threats will be difficult (or impossible) to detect, and stealthy infiltrations may still be able to get through. Plus, not all virus and malware threats will arrive in a route that your firewall will block; for example, someone could use a USB drive to infect one of your team member’s computers with a piece of infectious software.
  • Internal attacks. Internal attacks are also possible with a firewall turned on. Existing employees may use their login credentials and administrative access for nefarious purposes. They may also be able to manipulate firewall permissions to allow certain types of attacks through. If your employees internally bypass the firewall (which isn’t particularly hard), they may end up downloading a file that ends up infecting your entire system.
  • Implementation costs. Firewalls can be expensive to install, create, and/or maintain. If you utilize both a hardware and a software firewall, your costs will increase further, and of course, you’ll need to hire someone to maintain and monitor the firewall. While all security measures you enact will have a baseline implementation and management cost, firewalls can be excessive, compared to the benefits you’ll get from using one.
  • New threats and updates. Firewalls need to be updated on a regular basis if they’re going to be successful in defending your business from new threats. While many software-based firewalls now feature automatic updates (or at the very least, prompts to encourage users to update), this can still be a time-intensive process. Also, firewalls are always going to be a step behind the latest advancements in cybercrime, since the biggest threats are the ones that are hardest to predict.
  • Many firewalls simply aren’t scalable. They may work adequately for a small business with a single network and a limited team of employees, but for businesses with remote employees, multiple locations, and a massive national presence, it’s hard to find a single solution that will cover all your needs.

If you want your business to be protected from all manner of cyberthreats, no single installation or practice is enough. There are too many types of cyberthreats and too many vulnerabilities for any one solution to guard you against everything. Instead, you’ll need to come up with a multifaceted strategy to protect your business from multiple angles of attack, and stay up-to-date on the latest threats so your technological standards never fall too far behind.

LGPD: os efeitos dos vazamentos de dados à empresa

 

Não é de hoje que ouvimos que os dados são equiparados ao petróleo, tamanha a sua riqueza e valorização às empresas.


Não é de hoje que ouvimos que os dados são equiparados ao petróleo, tamanha a sua riqueza e valorização às empresas.

Depois de promulgada a Lei Geral de Proteção de Dados (LGPD) , que entrou em vigor em setembro de 2020, com exceção das sanções administrativas, que passaram a viger a partir de agosto de 2021, presenciamos uma série de vazamentos de dados que se tornaram públicos.

Não que antes eles não existissem, pelo contrário. Ocorre que, após a vigência da LGPD, passamos a olhar com mais atenção, não somente a postura das empresas na adequação à lei, como também nas hipóteses de vazamentos.

Segundo o Massachusetts Institute of Technology (MIT), os vazamentos de dados no Brasil registraram um crescimento de 493% somente entre os anos de 2018 e 2019. Já no ano de 2021, o Brasil foi considerado o sexto país com mais vazamento de dados no mundo.

Os números são realmente alarmantes, e muito ainda temos a avançar com relação à segurança da informação.

A proteção de dados pessoais, que busca evitar o seu vazamento, é um propósito que deve ser trabalhado por todas as empresas, em especial aquelas da área da saúde, que, em razão do tratamento de dados sensíveis, enfrentam um desafio ainda maior.

Nos últimos dias, vimos o caso de uma instituição de saúde privada, que violou a intimidade da atriz Klara Castanho por meio do vazamento de dados sensíveis à mídia.

Infelizmente, não foi o único. Assim aconteceu com a cantora Marília Mendonça, que teve a noticia de sua gravidez vazada dentro de um laboratório de exames clínicos, e também com a jornalista Cris Flores, que também teve notícias de sua gravidez vazada enquanto sofria um aborto. 

Esses são apenas alguns exemplos dentre tantos outros de pessoas públicas que entendiam estarem protegidas pelo sigilo profissional e Lei Geral de Proteção de Dados, enquanto tinham sua intimidade exposta. 

LGPD tem como fundamento a proteção de dados pessoais de pessoas físicas, e, dentre suas sanções, prevê penas pesadíssimas as empresas infratoras, que podem chegar à multa de 2% sobre o faturamento anual - por infração.

Também há previsão de publicização da infração, que influencia negativamente na imagem da empresa, afinal, ninguém quer ficar conhecido pelo vazamento de dados pessoais de seus clientes. A reputação da marca, portanto, pode sofrer um forte abalo, que certamente se refletirá em seus números. 

Como agir para evitar vazamento de dados

Então, como o empresário deve agir para evitar que sua empresa seja marcada pelo vazamento de dados pessoais? 

O primeiro passo é adequar-se à LGPD, ou seja, com o apoio profissional adequado, entender o tipo de dado que trata, bem como o caminho dessa informação dentro da organização empresarial. Sucintamente, com o mapeamento desses dados, será possível construir uma política de proteção de dados pessoais capaz de trazer segurança à organização.

Entretanto, somente a construção de uma política de proteção de dados não é suficiente. Investir em segurança de dados e proteção da informação também é imprescindível para evitar que vazamentos e ataques cibernéticos sejam bem-sucedidos.

Desta forma, o treinamento da equipe se torna peça-chave e complementar a toda a estrutura de proteção, mesmo porque, para uma empresa que trata dados sensíveis e sigilosos, o comprometimento e a consciência dos colaboradores são fundamentais. 

A equipe precisa ter conhecimento de que é tão responsável quanto a empresa pela manutenção do sigilo das informações, e que pode sofrer sanções na esfera cível, trabalhista e penal pelo compartilhamento indevido de dados.

Além disso, a organização também precisa ter procedimentos claros para a hipótese de vazamento interno de dados e vazamento por ações externas (ataques hackers, por exemplo), já que, nessas situações, o Comitê de Privacidade instituído (ou equipe correspondente) e o Encarregado pelo Tratamento de Dados Pessoais (DPO) serão responsáveis pela análise do caso concreto, bem como o envolvimento do Departamento de Tecnologia da Informação e Departamento Jurídico (interno ou externo). 

Esses profissionais serão capazes de mitigar os riscos e tomar as providências necessárias para gerir a crise fundada no vazamento das informações.

A Política de Proteção de Dados é ainda melhor aperfeiçoada quando também parte de um Programa de Integridade (Compliance), uma excelente ferramenta de gestão corporativa.

Portanto, agir preventivamente, mitigando os riscos da atividade empresarial, garantirá segurança jurídica no desenvolver das atividades e aumentará a credibilidade interna e externa, dentre tantos outros benefícios que refletirão nos resultados da organização.

Por: Lidiane Praxedes Oliveira da Costa é advogada com atuação em direito empresarial e direito imobiliário, com mais de 16 anos de experiência. 

CRUD Application With React and Spring Boot

1. Introduction

In this tutorial, we'll learn how to create an application capable of creating, retrieving, updating, and deleting (CRUD) client data. The application will consist of a simple Spring Boot RESTful API and a user interface (UI) implemented with the React JavaScript library.


2. Spring Boot

2.1. Maven Dependencies

Let's start by adding a few dependencies to our pom.xml file:


<dependencies>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-web</artifactId>

        <version>2.4.4</version>

    </dependency>


    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-data-jpa</artifactId>

        <version>2.4.4</version>

    </dependency>


    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-test</artifactId>

        <version>2.4.4</version>

        <scope>test</scope>

    </dependency>


    <dependency>

        <groupId>com.h2database</groupId>

        <artifactId>h2</artifactId>

        <version>1.4.200</version>

        <scope>runtime</scope>

    </dependency>

</dependencies>

Here we added the web, testing, and JPA persistence starters, as well as the H2 dependency, as the application will have an H2 in-memory database.


2.2. Creating the Model

Next, let's create our Client entity class, with name and email properties, to represent our data model:


@Entity

@Table(name = "client")

public class Client {


    @Id

    @GeneratedValue

    private Long id;


    private String name;

    private String email;


    // getter, setters, contructors

}

2.3. Creating the Repository

Then we'll create our ClientRepository class extending from JpaRepository to provide JPA CRUD capabilities:


public interface ClientRepository extends JpaRepository<Client, Long> {

}

2.4. Creating the REST Controller

Finally, let's expose a REST API by creating a controller to interact with the ClientRepository:


@RestController

@RequestMapping("/clients")

public class ClientsController {


    private final ClientRepository clientRepository;


    public ClientsController(ClientRepository clientRepository) {

        this.clientRepository = clientRepository;

    }


    @GetMapping

    public List<Client> getClients() {

        return clientRepository.findAll();

    }


    @GetMapping("/{id}")

    public Client getClient(@PathVariable Long id) {

        return clientRepository.findById(id).orElseThrow(RuntimeException::new);

    }


    @PostMapping

    public ResponseEntity createClient(@RequestBody Client client) throws URISyntaxException {

        Client savedClient = clientRepository.save(client);

        return ResponseEntity.created(new URI("/clients/" + savedClient.getId())).body(savedClient);

    }


    @PutMapping("/{id}")

    public ResponseEntity updateClient(@PathVariable Long id, @RequestBody Client client) {

        Client currentClient = clientRepository.findById(id).orElseThrow(RuntimeException::new);

        currentClient.setName(client.getName());

        currentClient.setEmail(client.getEmail());

        currentClient = clientRepository.save(client);


        return ResponseEntity.ok(currentClient);

    }


    @DeleteMapping("/{id}")

    public ResponseEntity deleteClient(@PathVariable Long id) {

        clientRepository.deleteById(id);

        return ResponseEntity.ok().build();

    }

}

2.5. Starting Our API

With that complete, we're now ready to start our Spring Boot API. We can do this using the spring-boot-maven-plugin:


mvn spring-boot:run

Then we'll be able to get our clients list by going to http://localhost:8080/clients.


2.6. Creating Clients

Additionally, we can create a few clients using Postman:


curl -X POST http://localhost:8080/clients -d '{"name": "John Doe", "email": "john.doe@baeldgung.com"}'

3. React

React is a JavaScript library for creating user interfaces. Working with React requires that Node.js is installed. We can find the installation instructions on the Node.js download page.


3.1. Creating a React UI

Create React App is a command utility that generates React projects for us. Let's create our frontend app in our Spring Boot application base directory by running:


npx create-react-app frontend

After the app creation process is complete, we'll install Bootstrap, React Router, and reactstrap in the frontend directory:


npm install --save bootstrap@5.1 react-cookie@4.1.1 react-router-dom@5.3.0 reactstrap@8.10.0

We'll be using Bootstrap's CSS and reactstrap's components to create a better-looking UI, and React Router components to handle navigability around the application.


Let's add Bootstrap's CSS file as an import in app/src/index.js:


import 'bootstrap/dist/css/bootstrap.min.css';

3.2. Starting Our React UI

Now we're ready to start our frontend application:


npm start

When accessing http://localhost:3000 in our browser, we should see the React sample page:



 


3.3. Calling Our Spring Boot API

Calling our Spring Boot API requires setting up our React application's package.json file to configure a proxy when calling the API.


For that, we'll include the URL for our API in package.json:


...

"proxy": "http://localhost:8080",

...

Next, let's edit frontend/src/App.js so that it calls our API to show the list of clients with the name and email properties:


class App extends Component {

  state = {

    clients: []

  };


  async componentDidMount() {

    const response = await fetch('/clients');

    const body = await response.json();

    this.setState({clients: body});

  }


  render() {

    const {clients} = this.state;

    return (

        <div className="App">

          <header className="App-header">

            <img src={logo} className="App-logo" alt="logo" />

            <div className="App-intro">

              <h2>Clients</h2>

              {clients.map(client =>

                  <div key={client.id}>

                    {client.name} ({client.email})

                  </div>

              )}

            </div>

          </header>

        </div>

    );

  }

}

export default App;

In the componentDidMount function, we fetch our client API and set the response body in the clients variable. In our render function, we return the HTML with the list of clients found in the API.


We'll see our client's page, which will look like this:



Note: Make sure the Spring Boot application is running so that the UI will be able to call the API.


3.4. Creating a ClientList Component

We can now improve our UI to display a more sophisticated component to list, edit, delete, and create clients using our API. Later, we'll see how to use this component and remove the client list from the App component.


Let's create a file in frontend/src/ClientList.js:


import React, { Component } from 'react';

import { Button, ButtonGroup, Container, Table } from 'reactstrap';

import AppNavbar from './AppNavbar';

import { Link } from 'react-router-dom';


class ClientList extends Component {


    constructor(props) {

        super(props);

        this.state = {clients: []};

        this.remove = this.remove.bind(this);

    }


    componentDidMount() {

        fetch('/clients')

            .then(response => response.json())

            .then(data => this.setState({clients: data}));

    }

}

export default ClientList;

As in App.js, the componentDidMount function is calling our API to load our client list.


We'll also include the remove function to handle the DELETE call to the API when we want to delete a client. In addition, we'll create the render function, which will render the HTML with Edit, Delete, and Add Client actions:


async remove(id) {

    await fetch(`/clients/${id}`, {

        method: 'DELETE',

        headers: {

            'Accept': 'application/json',

            'Content-Type': 'application/json'

        }

    }).then(() => {

        let updatedClients = [...this.state.clients].filter(i => i.id !== id);

        this.setState({clients: updatedClients});

    });

}


render() {

    const {clients, isLoading} = this.state;


    if (isLoading) {

        return <p>Loading...</p>;

    }


    const clientList = clients.map(client => {

        return <tr key={client.id}>

            <td style={{whiteSpace: 'nowrap'}}>{client.name}</td>

            <td>{client.email}</td>

            <td>

                <ButtonGroup>

                    <Button size="sm" color="primary" tag={Link} to={"/clients/" + client.id}>Edit</Button>

                    <Button size="sm" color="danger" onClick={() => this.remove(client.id)}>Delete</Button>

                </ButtonGroup>

            </td>

        </tr>

    });


    return (

        <div>

            <AppNavbar/>

            <Container fluid>

                <div className="float-right">

                    <Button color="success" tag={Link} to="/clients/new">Add Client</Button>

                </div>

                <h3>Clients</h3>

                <Table className="mt-4">

                    <thead>

                    <tr>

                        <th width="30%">Name</th>

                        <th width="30%">Email</th>

                        <th width="40%">Actions</th>

                    </tr>

                    </thead>

                    <tbody>

                    {clientList}

                    </tbody>

                </Table>

            </Container>

        </div>

    );

}

3.5. Creating a ClientEdit Component

The ClientEdit component will be responsible for creating and editing our client.


Let's create a file in frontend/src/ClientEdit.js:


import React, { Component } from 'react';

import { Link, withRouter } from 'react-router-dom';

import { Button, Container, Form, FormGroup, Input, Label } from 'reactstrap';

import AppNavbar from './AppNavbar';


class ClientEdit extends Component {


    emptyItem = {

        name: '',

        email: ''

    };


    constructor(props) {

        super(props);

        this.state = {

            item: this.emptyItem

        };

        this.handleChange = this.handleChange.bind(this);

        this.handleSubmit = this.handleSubmit.bind(this);

    }

}

export default withRouter(ClientEdit);

Let's add the componentDidMount function to check whether we're dealing with the create or edit feature; in the case of editing, it'll fetch our client from the API:


async componentDidMount() {

    if (this.props.match.params.id !== 'new') {

        const client = await (await fetch(`/clients/${this.props.match.params.id}`)).json();

        this.setState({item: client});

    }

}

Then in the handleChange function, we'll update our component state item property that will be used when submitting our form:


handleChange(event) {

    const target = event.target;

    const value = target.value;

    const name = target.name;

    let item = {...this.state.item};

    item[name] = value;

    this.setState({item});

}

In handeSubmit, we'll call our API, sending the request to a PUT or POST method depending on the feature we're invoking. For that, we can check if the id property is filled:


async handleSubmit(event) {

    event.preventDefault();

    const {item} = this.state;


    await fetch('/clients' + (item.id ? '/' + item.id : ''), {

        method: (item.id) ? 'PUT' : 'POST',

        headers: {

            'Accept': 'application/json',

            'Content-Type': 'application/json'

        },

        body: JSON.stringify(item),

    });

    this.props.history.push('/clients');

}

Last, but not least, our render function will be handling our form:


render() {

    const {item} = this.state;

    const title = <h2>{item.id ? 'Edit Client' : 'Add Client'}</h2>;


    return <div>

        <AppNavbar/>

        <Container>

            {title}

            <Form onSubmit={this.handleSubmit}>

                <FormGroup>

                    <Label for="name">Name</Label>

                    <Input type="text" name="name" id="name" value={item.name || ''}

                           onChange={this.handleChange} autoComplete="name"/>

                </FormGroup>

                <FormGroup>

                    <Label for="email">Email</Label>

                    <Input type="text" name="email" id="email" value={item.email || ''}

                           onChange={this.handleChange} autoComplete="email"/>

                </FormGroup>

                <FormGroup>

                    <Button color="primary" type="submit">Save</Button>{' '}

                    <Button color="secondary" tag={Link} to="/clients">Cancel</Button>

                </FormGroup>

            </Form>

        </Container>

    </div>

}

Note: We also have a Link with a route configured to go back to /clients when clicking on the Cancel Button.


3.6. Creating an AppNavbar Component

To give our application better navigability, let's create a file in frontend/src/AppNavbar.js:


import React, {Component} from 'react';

import {Navbar, NavbarBrand} from 'reactstrap';

import {Link} from 'react-router-dom';


export default class AppNavbar extends Component {

    constructor(props) {

        super(props);

        this.state = {isOpen: false};

        this.toggle = this.toggle.bind(this);

    }


    toggle() {

        this.setState({

            isOpen: !this.state.isOpen

        });

    }


    render() {

        return <Navbar color="dark" dark expand="md">

            <NavbarBrand tag={Link} to="/">Home</NavbarBrand>

        </Navbar>;

    }

}

In the render function, we'll use the react-router-dom capabilities to create a Link to route to our application Home page.


 3.7. Creating Our Home Component

This component will be our application Home page, and will have a button to our previously created ClientList component.


Let's create a file in frontend/src/Home.js:


import React, { Component } from 'react';

import './App.css';

import AppNavbar from './AppNavbar';

import { Link } from 'react-router-dom';

import { Button, Container } from 'reactstrap';


class Home extends Component {

    render() {

        return (

            <div>

                <AppNavbar/>

                <Container fluid>

                    <Button color="link"><Link to="/clients">Clients</Link></Button>

                </Container>

            </div>

        );

    }

}

export default Home;

Note: In this component, we also have a Link from react-router-dom that leads us to /clients. This route will be configured in the next step.


3.8. Using React Router

Now we'll use React Router to navigate between our components.


Let's change our App.js:


import React, { Component } from 'react';

import './App.css';

import Home from './Home';

import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';

import ClientList from './ClientList';

import ClientEdit from "./ClientEdit";


class App extends Component {

  render() {

    return (

        <Router>

          <Switch>

            <Route path='/' exact={true} component={Home}/>

            <Route path='/clients' exact={true} component={ClientList}/>

            <Route path='/clients/:id' component={ClientEdit}/>

          </Switch>

        </Router>

    )

  }

}


export default App;

As we can see, we have our application routes defined for each of the components we've created.


When accessing localhost:3000, we now have our Home page with a Clients link:



Clicking on the Clients link, we now have our list of clients, and the Edit, Remove, and Add Client features:



4. Building and Packaging

To build and package our React application with Maven, we'll use the frontend-maven-plugin.


This plugin will be responsible for packaging and copying our frontend application into our Spring Boot API build folder:


<properties>

    ...

    <frontend-maven-plugin.version>1.6</frontend-maven-plugin.version>

    <node.version>v14.8.0</node.version>

    <yarn.version>v1.12.1</yarn.version>

    ...

</properties>

...

<build>

    <plugins>

        <plugin>

            <groupId>org.apache.maven.plugins</groupId>

            <artifactId>maven-resources-plugin</artifactId>

            <version>3.1.0</version>

            <executions>

                ...

            </executions>

        </plugin>

        <plugin>

            <groupId>com.github.eirslett</groupId>

            <artifactId>frontend-maven-plugin</artifactId>

            <version>${frontend-maven-plugin.version}</version>

            <configuration>

                ...

            </configuration>

            <executions>

                ...

            </executions>

        </plugin>

        ...

    </plugins>

</build>

Let's take a closer look at our maven-resources-plugin, which is responsible for copying our frontend sources to the application target folder:


...

<plugin>

    <groupId>org.apache.maven.plugins</groupId>

    <artifactId>maven-resources-plugin</artifactId>

    <version>3.1.0</version>

    <executions>

        <execution>

            <id>copy-resources</id>

            <phase>process-classes</phase>

            <goals>

                <goal>copy-resources</goal>

            </goals>

            <configuration>

                <outputDirectory>${basedir}/target/classes/static</outputDirectory>

                <resources>

                    <resource>

                        <directory>frontend/build</directory>

                    </resource>

                </resources>

            </configuration>

        </execution>

    </executions>

</plugin>

...

Our front-end-maven-plugin will then be responsible for installing Node.js and Yarn, and then building and testing our frontend application:


...

<plugin>

    <groupId>com.github.eirslett</groupId>

    <artifactId>frontend-maven-plugin</artifactId>

    <version>${frontend-maven-plugin.version}</version>

    <configuration>

        <workingDirectory>frontend</workingDirectory>

    </configuration>

    <executions>

        <execution>

            <id>install node</id>

            <goals>

                <goal>install-node-and-yarn</goal>

            </goals>

            <configuration>

                <nodeVersion>${node.version}</nodeVersion>

                <yarnVersion>${yarn.version}</yarnVersion>

            </configuration>

        </execution>

        <execution>

            <id>yarn install</id>

            <goals>

                <goal>yarn</goal>

            </goals>

            <phase>generate-resources</phase>

        </execution>

        <execution>

            <id>yarn test</id>

            <goals>

                <goal>yarn</goal>

            </goals>

            <phase>test</phase>

            <configuration>

                <arguments>test</arguments>

                <environmentVariables>

                    <CI>true</CI>

                </environmentVariables>

            </configuration>

        </execution>

        <execution>

            <id>yarn build</id>

            <goals>

                <goal>yarn</goal>

            </goals>

            <phase>compile</phase>

            <configuration>

                <arguments>build</arguments>

            </configuration>

        </execution>

    </executions>

</plugin>

...

Note: to specify a different Node.js version, we can simply edit the node.version property in our pom.xml.


5. Running Our Spring Boot React CRUD Application

Finally, by adding the plugin, we can access our application by running:


mvn spring-boot:run

Our React application will be fully integrated into our API at the http://localhost:8080/ URL.


6. Conclusion

In this article, we examined how to create a CRUD application using Spring Boot and React. To do so, we first created some REST API endpoints to interact with our database. Then we created some React components to fetch and write data using our API. We also learned how to package our Spring Boot Application with our React UI into a single application package.

America - The horse with no name(Breaking bad scenes)


 

quarta-feira, 6 de julho de 2022

Roubos de dados

 A Sony em 2015 virou notícia no mundo inteiro por uma enorme brecha de segurança, expondo senhas internas da empresa além de uma quantidade enorme de dados, incluindo filmes ainda não lançados.

Infelizmente, problemas de segurança como esse são relativamente comuns. Conheça aqui as maiores falhas envolvendo roubos de dados da história.

1 – Nasdaq, 2005–2012: 160 milhões de pessoas
 afetadas

56007629

Um grupo de hackers compostos por cinco russos e um ucraniano foi responsável por roubar números de cartões de crédito e débito de mais de 160 milhões de pessoas, além de acessar 800 mil contas de banco e invadir servidores usados pela bolsa de valores Nasdaq. O ataque atingiu não só a Nasdaq, como também bancos, empresas de pagamento e redes de lojas nos Estados Unidos.

2 – Heartland Payment Systems, 2008–2009: 130
 milhões de pessoas afetadas

106033577

No começo de 2009 o mundo ficou sabendo de uma das maiores brechas de segurança da história. Um malware implantado no sistema da Heartland Payment Systems gravava informações de cartões de crédito assim que eles chegavam dos varejistas.

Como a Heartland processava o pagamento de mais de 250 mil empresas nos Estados Unidos, isso foi suficiente para que os dados de 130 milhões de pessoas fossem roubados. Pelo crime, Albert Gonzalez foi condenado a 20 anos de prisão, a maior sentença já dada a um crime virtual nos Estados Unidos.

3 – Target Stores, 2013: 110 milhões de pessoas
 afetadas

71478735

Em dezembro de 2013, a Target, uma das grandes redes varejistas dos Estados Unidos, anunciou que informações de cerca de 40 milhões de clientes haviam sido roubadas, incluindo endereço, telefone, cartão de crédito e e-mail. Um mês depois, a empresa revisou o número e afirmou que na verdade 110 milhões de clientes foram afetados com a brecha.

4 – Sony, 2011: 102 milhões de pessoas afetadas

145769677

Em abril de 2011 a Sony sofreu o maior ataque de hackers de sua história, obrigando a Sony a tirar a PlayStation Network do ar por três semanas e despertando a ira de milhões de usuários.

As informações de 77 milhões de usuários foram comprometidas, incluindo login, nomes, endereços, telefones e e-mails. Mais tarde, a empresa descobriu também que a Sony Online Entertainment (SOE) também havia sido violada, permitindo acesso a dados de mais 25 milhões de contas de usuários. No total, foram 102 milhões de dados de usuários expostos.

5 – AOL, 2004: 92 milhões de pessoas afetadas

88034183

Apesar da maioria das quebras de segurança da lista serem recentes, a da AOL aconteceu em 2004, por culpa de um ex-funcionário. Quando a AOL ainda era uma das gigantes da internet, o engenheiro de software Jason Smathers roubou e-mails e nomes de usuário de 92 milhões de clientes da empresa. Os e-mails foram vendidos a spammers que, calcula-se, enviaram mais de 7 bilhões de spams. Smithers pegou apenas 1 ano e três meses pelo crime.

6 – Epsilon, 2011: 60 milhões de pessoas afetadas

sb10069987c-001

A Epsilon é uma empresa responsável pela comunicação de e-mails de muitas das maiores empresas do mundo. Em 2011, a empresa anunciou que os bancos de dados de cerca de 50 clientes haviam sido roubados. Com isso, os e-mails de ao menos 60 milhões de clientes acabaram nas mãos de criminosos que poderiam enviar phishing ou spam para os endereços virtuais. Na verdade, 60 milhões é um número conservador, que pode na verdade ter chegado a quase 250 milhões, segundo estimativas.

7 – Home Depot, 2014: 56 milhões de pessoas
 afetadas

169190961

A Home Depot é uma grande rede de artigos de material de construção, com mais de 2.200 lojas pelo mundo. Em setembro de 2014, a companhia admitiu que os dados dos cartões de crédito de 56 milhões de pessoas haviam sido roubados. Os hackers usaram um malware criado especialmente para evitar os sistemas de detecção da Home Depot. Felizmente, os códigos de segurança dos cartões não foram comprometidos.

8 – Living Social, 2013: mais de 50 milhões de
 pessoas infectadas

10041788

A Living Social é a maior concorrente do Groupon, site de descontos. Em abril de 2013, hackers capturaram dados de 50 milhões de usuários, incluindo nomes, senhas e data de nascimento, mas não dados de cartões de crédito. Cerca de 20 milhões de clientes que tinham dados armazenados em servidores na Ásia não foram afetados.

9 – Evernote, 2013: 50 milhões de pessoas
 afetadas

106623722

Endereços de e-mail e senhas criptografaras de usuários do Evernote foram expostas em fevereiro de 2013. Nenhum dado financeiro foi comprometido, assim como nada dos conteúdos gerados por usuários no sistema, segundo a empresa. Ainda assim, a Evernote resetou a senha de 50 milhões de usuários por precaução.

Bônus: Sony, 2014 – filmes e muitos dados
 vazados

84402414

Recentemente, a Sony sofreu o maior vazamento de informações de sua história. A divisão de filmes e televisão teve seus computadores hackeados e dados como filmes completos ainda não lançados foram expostos na internet para download.

Terabytes de informações da Sony foram roubados e pode ser que muitos dos dados ainda nem mesmo foram expostos. Os dados incluem números do seguro social de funcionários, passaportes de atores e executivos, senhas internas, roteiros não publicados, planos de marketing e quatro filmes inteiros não lançados.