Proteja seu site contra ataques XSS usando PHP, ASP ou .NET

Exemplos práticos de como proteger a seção de comentários do seu site

29/03/2024

Proteja seu site contra ataques XSS usando PHP, ASP ou .NET

Proteja seu site contra ataques XSS usando PHP, ASP ou .NET

Introdução

Este artigo é um guia para desenvolvedores que buscam proteger seus sites de uma vulnerabilidade comum e perigosa: a injeção de scripts maliciosos através de conteúdo inserido por usuários. Ao permitir interações como comentários, seu site pode se tornar alvo de ataques.

Como um conteúdo malicioso pode ser inserido no site?

Considere o seguinte cenário: em vez de uma mensagem convencional, seu site recebe um comentário contendo um trecho de JavaScript: <script>alert('Você foi hackeado!');</script>. Uma vez armazenado no banco de dados e apresentado em uma página, esse script é executado automaticamente, disparando um alerta para todos os visitantes.

Apesar de este exemplo ser inofensivo, serve como demonstração do potencial para ataques mais danosos. Scripts maliciosos poderiam, por exemplo, redirecionar seus usuários para sites fraudulentos ou realizar ações no site como se fossem o usuário, incluindo a mudança de senhas. Este tipo de ataque é conhecido como Cross-Site Scripting, ou XSS.

A seguir, vamos mostrar como prevenir esses riscos usando PHP, ASP Clássico e ASP.NET, garantindo a segurança e a confiabilidade do seu site.

PHP

No exemplo abaixo, os comentários são carregados da tabela comments do banco MySQL:

<?php
// Configuração de conexão ao banco de dados
$host = 'localhost';
$db   = 'nome_do_banco';
$user = 'usuario';
$pass = 'senha';
$charset = 'utf8mb4';

// Configuração da string de conexão DSN
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];

try {
    // Criar uma nova instância PDO
    $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
    throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

// Consulta SQL para buscar todos os comentários
$sql = "SELECT id, comment_text FROM comments";
$stmt = $pdo->query($sql);

// Verificar se a consulta retornou linhas
if ($stmt->rowCount() > 0) {
    // Processar cada linha de resultado
    while ($row = $stmt->fetch()) {
        // Sanitizar o comentário para evitar XSS
        $safe_comment = htmlspecialchars($row['comment_text'], ENT_QUOTES, 'UTF-8');
        echo "<p>Comentário ID: " . $row['id'] . " - " . $safe_comment . "</p>";
    }
} else {
    echo "Nenhum comentário encontrado.";
}
?>

A função htmlspecialchars é usada para sanitizar o conteúdo do comentário, convertendo caracteres especiais em entidades HTML, o que previne a execução de scripts maliciosos inseridos nos comentários.

Utilizando esta abordagem, caso algum comentário contenha um trecho de script malicioso, este será exibido como texto puro, sem oferecer riscos de execução. Isso ocorre porque as marcações HTML, essenciais para a execução de scripts no navegador, são neutralizadas. Dessa forma, ao invés de serem interpretados como código, os scripts são simplesmente mostrados como parte do texto, garantindo a segurança dos usuários do site.

ASP Clássico

No exemplo a seguir, demonstramos como carregar e exibir comentários de uma tabela comments usando ASP Clássico, protegendo contra ataques XSS:

<%
' Configuração de conexão ao banco de dados
Dim connectionString
connectionString = "Driver={SQL Server}; Server=localhost; Database=nome_do_banco; Uid=usuario; Pwd=senha;"

' Criar e abrir a conexão com o banco de dados
Dim conn
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open connectionString

' Executar consulta SQL para buscar todos os comentários
Dim sql
sql = "SELECT id, comment_text FROM comments"
Dim rs
Set rs = conn.Execute(sql)

' Verificar se a consulta retornou linhas
If Not rs.EOF Then
    ' Processar cada linha de resultado
    Do Until rs.EOF
        ' Sanitizar o comentário para evitar XSS usando Server.HTMLEncode
        Dim safe_comment
        safe_comment = Server.HTMLEncode(rs("comment_text"))
        Response.Write "<p>Comentário ID: " & rs("id") & " - " & safe_comment & "</p>"
        rs.MoveNext
    Loop
Else
    Response.Write "Nenhum comentário encontrado."
End If

' Limpar e fechar objetos
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
%>

A função Server.HTMLEncode é utilizada para codificar caracteres especiais em entidades HTML, garantindo que qualquer tentativa de injeção de script seja neutralizada. Esse processo converte elementos potencialmente perigosos em texto simples, impedindo que sejam interpretados pelo navegador como código executável.

ASP.NET Framework

No exemplo a seguir, ilustramos como carregar e exibir comentários de uma tabela comments de forma segura em ASP.NET Framework, usando Web Forms:

<%@ Page Language="C#" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Exibir Comentários</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Repeater ID="CommentsRepeater" runat="server">
                <ItemTemplate>
                    <p>
                        Comentário ID: <%# Eval("id") %> - <%# Server.HtmlEncode(Eval("comment_text").ToString()) %>
                    </p>
                </ItemTemplate>
            </asp:Repeater>
        </div>
    </form>
</body>
</html>

<!-- Código back-end em C# -->
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        BindComments();
    }
}

private void BindComments()
{
    string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["YourConnectionString"].ToString();
    using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(connectionString))
    {
        conn.Open();
        using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand("SELECT id, comment_text FROM comments", conn))
        {
            using (System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader())
            {
                if (reader.HasRows)
                {
                    CommentsRepeater.DataSource = reader;
                    CommentsRepeater.DataBind();
                }
                else
                {
                    // Handle no comments found
                }
            }
        }
    }
}
</script>

O uso do controle Repeater juntamente com a função Server.HtmlEncode garante que qualquer conteúdo exibido seja codificado, prevenindo a execução de scripts maliciosos. Essa abordagem protege o site e seus visitantes ao tratar todos os dados inseridos pelos usuários como texto, evitando a interpretação de tags HTML ou scripts como código executável pelo navegador.

Conclusão

Proteger seu site contra a injeção de scripts maliciosos é essencial para a segurança dos seus usuários. Neste tutorial, exploramos métodos para sanitizar entradas de usuários em PHP e ASP Clássico, garantindo que conteúdo potencialmente perigoso seja neutralizado antes de ser exibido. Adotando estas práticas, você pode significativamente diminuir o risco de ataques XSS, criando um ambiente online mais seguro para todos.

Este artigo nas redes sociais: Twitter/X, LinkedIn, Telegram, Pinterest, Tumblr, Flipboard, Mastodon

Domínios hospedados
Clientes satisfeitos