Segurança de Aplicativos Web com PHP...10 conselhos de segurança 6. Evitar a entrada de dados...

Post on 13-Jul-2020

1 views 0 download

Transcript of Segurança de Aplicativos Web com PHP...10 conselhos de segurança 6. Evitar a entrada de dados...

Segurança de Aplicativos Web

com PHP

Conferencia 11

MSc. Yoenis Pantoja Zaldívar

Programação Web

10 conselhos de segurança

1. Evitar os links suspeitos.

2. Não aceder aos websites de duvidosa

reputação.

3. Actualizar o SO e aplicativos com os últimos

patches de segurança.

4. Descarregar aplicativos desde websites

oficiais.

5. Utilizar tecnologias de segurança (ex. antivirus,

firewall e antispam).

10 conselhos de segurança

6. Evitar a entrada de dados pessoales em

formularios duvidosos.

7. Ter cautela com os resultados devolvidos por

pesquisas na web.

8. Evitar a ejecução de arquivos duvidosos.

9. Aceitar só contactos conhecidos (clientes de

mensajería, redes sociais).

10. Utilizar senhas fortes.

Opções de configuração do PHP.

Segurança de Bancos de Dados.

Reporte de Erros.

Cookies.

Tratamento de Sesões

Resumo

Caracterizar os mecanismos de

segurança para as distintas ameaças que

podam surgir, aproveitando as funções e

potencial que fornece o PHP para fazer

um aplicativo mais confiável e seguro.

Objectivo

PHP 5 Power Programming. Cap. 7. Disponible

no website da disciplina: https://progwebisutic.files.wordpress.com/2016/07/php-

5-power-programming.pdf

PHP DOCUMENTATION GROUP. PHP Manual.

Bibliografía

“Alcançar um sistema

seguro es práticamente

imposível”

Uso de register_globals

Directiva para a definição automática de as

variáveis externas.

Como alternativa deben-se utilizar as

variáveis superglobales tais como $_GET,

$_POST, $_REQUEST, $_SESSION

<>// autenticacion.php

if ($password == “my_password”) {

$authorized = 1;

}

if ($authorized == 1) {

// Ações importantes

}

// PROBLEMA DE SEGURIDADE com a direção

// http://localhost/autentificacion.php?authorized=1

Exemplo (parte 1 de 2)

<>// autenticacion.php

// SOLUÇÃO 1

$authorized = 0; // Inicializar a variável

if ($password == “my_password”) {

$authorized = 1;

}

if ($authorized == 1) {

// Ações importantes

}

// SOLUÇÃO 2

// Estabelecer valor register_globals=Off no arquivo de

configuração de PHP

Exemplo (parte 2 de 2)

Definir as variáveis antes de usarlas.

Usar matrizes superglobales.

Não usar nomes típicos para as variáveis,

porque aumenta a posibilidade de que um

invasor poda descobrir como modificar

seus valores.

Bõas práticas

Erros en PHP

Erros en PHP

Erros en PHP

São importantes os reportes?

São peligrosos?

Erros en PHP

Mecanismo útil para o desenvolvedor

(causa, arquivo, linha de um erro).

Debe-se limitar e/ou personalizar para

um meio de produção, porque pode

revelar informação sensível do sistema

tornando-o vulnerável aos ataques.

Reporte de erros

Introdução de dados inapropriados.

Verificação dos tipos de erros devolvidos e

seus contextos.

Obter informação do servidor para

determinar possívels fraquezas.

Tática de ataques

“With this directive set to off, errors that occur during the execution of scripts will no longer be

displayed as a part of the script output, and thus,

will no longer be exposed to remote users. With some errors, the error message content may

expose information about your script, web server, or database server that may be exploitable for

hacking. Production sites should have this

directive set to off”

display_errors

Directiva display_errors

Directiva display_errors

php.ini

Alguns níveles de reporte

E_ERROR E_WARNING E_PARSE

Erros fatais de

ejecução

Avisos de ejecução

E_NOTICE

Erros de compilação

Notificações de

ejecução (ex. variáveis

sem inicializar)

E_ALL

Todos os erros e avisos

(excepto E_STRICT)

para más información

VER MANUAL?

Nívels de reporte: phi.ini

Nívels de reporte: phi.ini

Common Values:• E_ALL (Show all errors, warnings and notices including coding

standards.)

• E_ALL & ~E_NOTICE (Show all errors, except for notices)

• E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for

notices and coding standards warnings.)

• E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_C

ORE_ERROR (Show only errors)

• Default Value: E_ALL & ~E_STRICT & ~E_DEPRECATED

• Development Value: E_ALL

• Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT

error_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICT

<>// Deshabilitar todo reporte de erros

error_reporting(0);

// Reportar todos os erros excepto E_NOTICE

// Este é o valor predeterminado no php.ini

error_reporting(E_ALL ^ E_NOTICE);

/////////////// No php.ini /////////////////////////////////////////////////////

// Deshabilitar todo reporte de erros

display_errors = Off

// Reportar todos os erros excepto E_NOTICE

error_reporting = E_ALL & ~E_NOTICE

Exemplo: Reporte de erros

<>function divide($x) {

if ($x==0) {

throw new Exception('División por cero.');

}

else return 1/$x;

}

try {

echo divide(5) . "\n";

echo divide(0) . "\n";

} catch (Exception $e) {

echo 'Excepção capturada: ', $e->getMessage(), "\n";

}

// Continuar a ejecução

Exemplo: Trabalho com erros

Segurança em Bancos de Dados

tb_estudante

numero turma

tb_nota

id nota disciplina

1

1…n

tb_profesor

numero disciplina turma

1

1…n

Tem modifica

Qué acontece se ambos conectam-se ao Banco de

Dados com os mesmos permisos sobre a tabela

tb_nota?

Os aplicativos não deven ser ligados ao

banco de dados com o usuario

correspondente à seu proprietário (root).

Podem-se criar diferentes usuarios do BD

para cada rol de seu aplicativo com

dereitos limitados.

Asegurar as conexões: encriptar.

Segurança em Bancos de Dados

É uma técnica na qual um atacante cria ou

muda comandos SQL existentes para

mostrar dados ocultos, sobrescrever

dados críticos, ou executar comandos do

sistema peligrosos na máquina donde

está o banco de dados.

Inyeção de SQL

<><>// Código XHTML

<form method="login.php" action="POST">

Usuario: <input type="text" name=“txt_usuario" />

Senha: <input type="password" name=“psw_senha" />

<input type="submit" value=“Aceder" />

</form>

// No procesamento com PHP

$u = $_POST[‘txt_usuario’];

$c = md5($_POST[‘psw_senha’]);

$sql = "SELECT * tb_usuario WHERE usuario=‘$u’ AND clave= ‘$c’";

// …

Exemplo

// No procesamento com PHP …

$sql = “SELECT * FROM tb_usuario WHERE nombre=‘pepe’ OR 1 = 1 --’ AND

clave=‘d41d8cd98f00b204e9800998ecf8427e’”;

// …

Inyeção SQL

pepe‘OR 1 = 1 --

pepe’ OR 1 = 1 --

<>$sql = sprintf("INSERT INTO tb_usuario (nombre,

clave) VALUES ('%s', '%s');",

pg_escape_string($u), md5($c));

$resultado = pg_query($con, $sql);

// para obtener el usuario

$sql = sprintf("SELECT * FROM tb_usuario

WHERE nombre='%s' AND clave='%s';",

pg_escape_string($u), md5($c));

$resultado = pg_query($con, $sql);

Exemplo: Encriptar valores

Filtrado dos dados de entrada.

Validação dos tipos de dados: is_numeric(),

ctype_digit() , is_string()

Uso de aspas simples nos dados.

Não ligarse aos SGBD como superusuario.

Proteção vs. ataques SQL

¿Cómo lograr esta

funcionalidad?

Cookies

setcookie() $_COOKIE

Array asociativo de variávels

pasadas ao script actual

através de Cookies HTTP

para más información

VER MANUAL?

Define uma cookie para ser

enviada junto com as demais

cabeceras de HTTP

<>setcookie(“autenticado", “yes”);

// hasta que o navegador seja fechado

setcookie(“autenticado", “yes”, 0);

// 30 días

setcookie(“autenticado", “yes”, time() + 60*60*24*30);

// Em outro arquivo…

echo $_COOKIE[“autenticado”];

// yes

Exemplo

São parte da cabecera HTTP, por tanto a

função setcookie() debe invocarse antes de

cualquer saída ao navegador.

Não serão visíveis hasta a seguinte carga de

uma página na que deben estar disponíveis.

Têm que ser eliminadas com os mesmos

parámetros com os que são criadas

(subtraindo o tempo)

Importante: sobre as cookies

Permitem criar uma sesão por cada

usuario ligado.

Verificar em cada página do aplicativo qué

usuario está ligado.

Mostrar o conteúdo da página em

dependença dos permisos que tenha cada

usuario.

Sesões

Sesiones

session_start() session_unset()

$_SESSION

Libera todas as variáveis de

sesão

para más información

VER MANUAL?

Array asociativo que contém

variáveis de sesão disponíveis

Iniciar uma nova sesão

unset($var)

Destrói uma variável

especificada

<>// autenticacion.php

$usuario = $_POST["txt_nome_usuario"];

$senha = $_POST["psw_senha"];

if ($usuario == "docencia" && $senha == "docencia") {

session_start();

$_SESSION["autenticado"] = $usuario;

header ("Location: inicio.php");

} else {

echo "El usuario o la clave no son v&aacute;lidos.";

}

Exemplo 1: Sesões (parte 1 de 2)

<>// inicio.php

session_start();

if (! isset($_SESSION["autenticado"])) {

header (“Location: autenticacion.php");

}

if(isset($_POST["btn_salir"])){

session_unset();

header ("Location: autenticacion.php");

}

Exemplo 1: Sesões (parte 2 de 2)

<>// inicio.php

session_start();

$rol = $_SESSION['rol_usuario'];

switch($rol) {

case ‘editor’:

header("Location:../Modulos/Editor/editor.php");

break;

case ‘administrador’:

header("Location:../Modulos/Admin/admin.php");

break;

default:

header("Location:../inicio.php");

}

Ejemplo 2: Sesiones

Configuração

de PHP

Banco de

Dados

Reporte de

errosCookies

Sesões

SEGURANÇA

Tarefa

• Implementar um pequeno exemplo que

aplique qualquer dos mecanismos para a

segurança aprendidos na conferencia.

Enviar por correo antes de segunda feira.

Segurança de Aplicativos Web

com PHP

Conferencia 11

MSc. Yoenis Pantoja Zaldívar

Programação Web