primeiro programa em php orientado a objetos§ão a o.o. no php.pdf · ao%20curso%20de%20php.pdf...

83
PRIMEIRO PROGRAMA EM PHP ORIENTADO A OBJETOS Leonardo Pimentel Ferreira Higor Ernandes Ramos Silva Veja o cronograma do curso: http://www.petsi.facom.ufu.br/system/files/Bem%20Vindo%20 ao%20Curso%20de%20PHP.pdf Outros materiais: http://www.petsi.facom.ufu.br/node/1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Upload: phamtram

Post on 20-Nov-2018

221 views

Category:

Documents


0 download

TRANSCRIPT

PRIMEIRO PROGRAMA

EM PHP ORIENTADO A

OBJETOS

Leonardo Pimentel Ferreira

Higor Ernandes Ramos Silva

Veja o cronograma do curso:

http://www.petsi.facom.ufu.br/system/files/Bem%20Vindo%20ao%20Curso%20de%20PHP.pdf

Outros materiais: http://www.petsi.facom.ufu.br/node/1

PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Iniciando um projeto PHP no NetBeans

• Abra o NetBeans e crie um novo projeto, acessando

Arquivo → Novo Projeto → PHP → Aplicação PHP

Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Iniciando um projeto PHP no NetBeans

Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Página index.php

• Página index.php de um projeto recém-criado no

NetBeans.

Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Hello World

Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

MVC (Model-View-Controller)

• Models:

• Partes do software que realizam funções relacionadas ao

domínio

• Os modelos possuem dados e operações

• Views:

• Componentes que mostram os dados aos usuários

• Dados vêm de um ou mais modelos

• Controller:

• Componentes que recebem e enviam comandos

• Controllers podem alterar views e models

Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

MVC (Model-View-Controller)

• O usuário manipula apenas controllers (botões,

scrollbars).

• Views e controllers podem ser adicionados,

removidos e alterados de forma independente do

model.

• Componentes da interface são quase totalmente

desacoplados dos componentes da aplicação.

• Alta flexibilidade e portabilidade.

Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

MVC (Model-View-Controller)

Fonte: http://blog.stannard.net.au/blog/media/simple-mvc-framework/mvc.gif

Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Criando a visão (formulário html)

• Crie um arquivo chamado login.html dentro do

diretório minicurso/visao/login

• O atributo action da tag form informa a página php que

receberá os dados do formulário

Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Visualizando o resultado no Browser

• Resultado do formulário no navegador Mozilla Firefox.

1. Você pode ver o resultado no navegador digitando o caminho do arquivo login.html (figura abaixo e mais a direita)

2. Ou... Configurando no NetBeans clicando com o botão direito do

mouse no projeto e configurando conforme a figura a seguir.

Desta maneira ao clicar no botão executar a página será

aberta no browser padrão do sistema operacional. (figura abaixo

e mais a esquerda)

Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Criando uma classe de modelo

Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Criando o controle

• Por enquanto a nossa classe da camada controle está

bem simples.

• Vejam que ela já está se comunicando com o Modelo ao instanciar a classe Login e invocando métodos do objeto

instanciado.

• Controle O.O.

• Controle procedimental.

Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Review...

• Até agora vimos:

• Classes;

• Objetos;

• Métodos(Construtor, GETTERs e SETTERs);

• Variáveis e atributos;

• Operador $this;

• Visibilidade private;

• Um pouco do MVC na prática;

• Criar formulário HTML;

• Capturar no PHP os dados enviados de um formulário HTML via

método POST;

• Daqui para frente iremos aprofundar mais em O.O.

Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Método destrutor

Aula 1 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Propriedades (atributos ou campos)

• Visibilidade:

Métodos Atributos Visibilidade (contexto)

public function getNome(); //ou

function getNome(); public $nome;

Default para os métodos – Em qualquer contexto é possível

acessá-lo. Visibilidade fraca.

private function getNome(); private $nome; Apenas no contexto da classe é possível acessá-lo.

Visibilidade forte.

protected function getNome(); protected $nome; Apenas no contexto da classe e subclasses é possível

acessá-lo. Visibilidade média.

Aula 2 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Exercício sobre propriedades

1. Na classe de modelo Login, altere a visibilidade do método setUsuario() para protected.

2. No método construtor da classe de controle cLogin adicione a declaração $login->setUsuario("usuario");

3. Execute o arquivo login.html no Browser.

4. Remova a declaração adicionada no item 2 e mude o método setUsuario() para public.

Baixar a revisão 2 do repositório:

https://minicurso-php-petsi-2013-2.googlecode.com/svn/trunk

Aula 2 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Atributos e métodos estáticos

• Crie um atributo estático chamado $nro_usuarios_online e atribua o valor 0 para ele.

• Em seguida, crie um método estático chamado alteraNroUsuarios().

• A cada vez que o método construtor for chamado, o método alteraNroUsuarios() incrementará em 1 o

número de usuários online.

Aula 2 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Atributos e métodos estáticos

Aula 2 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Passando parâmetros para métodos

Aula 2 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Definindo parâmetros default

Aula 2 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Herança

Aula 2 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Herança

• Para testar coloque os

trechos de código em

vermelho no arquivo de

controle do login: clogin

Aula 2 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Herança

• Houve algum erro? Do tipo • Fatal error: Call to undefined function setNroVezesAcessado()

in C:\xampp\htdocs\minicurso\login\modelo\mlogincomum.php on line 8

• Pense em como corrigir isso. Uma dica: this is the

problem.

Aula 2 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Exercício sobre Herança:

• Crie uma classe Cheque (no arquivo cheque.php) que

possua um atributo valor, um construtor que receba como

parâmetro esse valor e dois métodos que você

implementará da maneira que quiser (CalcularJuros() e TipoCheque()). Em seguida,

crie uma classe ChequeEspecial (no arquivo

chequeepecial.php) que vai herdar da classe

Cheque.

Aula 2 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Polimorfismo

• Implemente na classe ChequeEspecial os próprios

métodos CalcularJuros()e TipoCheque() dela.

Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Polimorfismo

• Crie um terceiro arquivo para exemplificar o uso do polimorfismo.

<?php

require_once("cheque.php");

require_once("chequeespecial.php");

$Cheques[1] = new Cheque(380.00);

$Cheques[2] = new ChequeEspecial(600.00);

$Cheques[3] = new Cheque(230.00);

foreach ( $Cheques as $key => $Cheque )

{

echo "Cheque $key ( {$Cheque->TipoCheque()} )

com juros: R$ {$Cheque->CalcularJuros()} <br />";

}

?>

Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Classes e métodos abstratos (Abstract)

Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Classes e métodos abstratos (Abstract)

• Reflexo na classe filha LoginComum.

• Reflexo na classe de controle, ao instanciar uma classe abstrata

Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Exercício sobre Classes abstratas:

• Corrija os erros apresentados anteriormente.

• Crie uma classe chamada LoginAdmin, que herda da

classe Login.

Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Interface

• Para exemplificar o uso de interfaces, crie uma interface chamada ILogin, que contém o método

imprimir_dados(Login $l). l é um objeto da classe

Login.

Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Interface

• Feito isso, faça com que a classe abstrata Login

implemente a interface ILogin.

Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Interface

NOTA

- Interfaces podem definir constantes. Constantes são uma espécie de

variável e cujo o seu valor não é alterado durante a execução do

programa. Ex.:

- Classes abstratas e concretas podem implementar várias interfaces.

Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Interfaces podem “extender” outras

classes:

Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Exercício Interface:

• Crie uma interface no projeto que declara pelo menos um

método. Em seguida, mostre um exemplo de como

utilizá-la.

Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Clonagem de objetos

• Ex.: $copia_do_objeto = clone $objeto;

• Adicione as linhas a seguir na classe de controle

Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Clonagem de objetos

• Resultado

Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Clonagem de objetos

• Contornando o efeito indesejado do slide anterior. Implemente o método mágico __clone() na classe de

modelo LoginComum

Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Comparação de objetos

• Existem duas maneiras de comparar objetos:

1. ($objeto1 == $objeto2) e (!=): verifica se dois

objetos são da mesma classe e possuem os mesmos

atributos e valores.

2. ($objeto1 === $objeto2) e (!==): verifica se

dois objetos são da mesma classe, possuem os

mesmos atributos e valores e representam a mesma

instância da classe.

Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Comparação de objetos

O resultado será para cada sequência de if e else:

• 1- (IF) Login Comum tem as mesmas propriedades da cópia de sua referência

• 2- (ELSE) Login Comum não tem as mesmas propriedades da cópia de seu clone

• 3- (IF) Login Comum é a mesma instância da cópia de sua referência

• 4- (ELSE) Login Comum não é a mesma instância do seu clone

Aula 3 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Importando o Script do Banco de dados

através do PHPMyAdmin • Baixe e extraia o arquivo BD-aula4.sql no site

http://www.petsi.facom.ufu.br/system/files/php-projeto-

inicio-aula-4-03-12.zip

• Certifique de que o Apache e o MySQL foram iniciados no

XAMPP

• Digite no browser: localhost/phpmyadmin

• Selecione o menu importar

• Importe o arquivo BD-aula4.sql

Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Criando a interface para login DAO

Crie uma interface chamada ILoginComumDAO no arquivo dao/ilogindao.php

<?php

include_once '../modelo/mlogincomum.php';

//Qualquer DAO de BD que implemente esta interface terá que implementar as operações

interface ILoginComumDAO{

public function add(LoginComum $l);

public function atualiza(LoginComum $l);

public function remove($usuario);

public function busca($usuario);

}

?>

Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Conectando PHP ao Banco de dados

através do PDO (PHP Data Objects)

• PDO é a interface para acessar banco de dados em PHP.

• Para usar funções do banco de dados via PDO é necessário o driver PDO específico do servidor do BD.

• Cada driver de BD implementa a interface PDO. Independente do BD que está sendo utilizado, serão usadas as mesmas funções para escrever queries.

• PDO funciona nativo a partir do PHP 5.1, e está disponível como um extensão para PHP 5.0;

Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Conectando PHP ao MySQL • Sintaxe:

$bd = new PDO ($dsn, $username, $passwd, $options);

$dsn = prefixo DSN é composto por :

Host - servidor do banco de dados está.

Port - o núm. da porta onde o servidor do bd está escutando.

Dbname - o nome do banco de dados.

unix_socket - o socket Unix do MySQL.

$username = usuário do banco de dados

$passwd = senha do usuário do banco de dados

$options = array de opções

• Exemplo:

$bd = new PDO

("mysql:host=localhost;dbname=pdo;port=3306;unix_socket=/tmp/mysql.sock",

"pdo", "pdo", array(PDO::ATTR_PERSISTENT => true));

Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Criando uma classe geral PDO <?php //Crie uma classe chamada MySQLPDO no arquivo dao/mysqlpdo.php

class MySQLPDO extends PDO {

const DB_HOST='localhost';

const DB_PORT='3306';

const DB_NAME='minicurso_php';

const DB_USER='root';

const DB_PASS='';

public function __construct($options=null){

try{

parent::__construct('mysql:host='.MySQLPDO::DB_HOST.';port='.MySQLPDO::DB_PORT.';dbname='.MyS

QLPDO::DB_NAME,

MySQLPDO::DB_USER, MySQLPDO::DB_PASS, $options);

} catch (PDOException $err){

echo $err->getMessage();

return null;

}

}

public function query($query){ //Consulta segura com Prepare Statement

$args = func_get_args();//transforma argumentos em vetor

array_shift($args); //array_shift() retira o primeiro elemento(query) do array de

//argumentos e o retorna

//Ex.: irá restar no array $args apenas $t1 que será passado em execute

$statm = parent::prepare($query); //prepara a consulta

$statm->execute($args); //executa o statment

return $statm; //retorna o statement

}

}?>

Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Tratando erros de conexão

• Via try e catch.

<?php try { $bd = new PDO('mysql:host=localhost;dbname=test', $user, $pass); } catch (PDOException $e) { print "Erro: " . $e->getMessage() . "<br/>"; die();//termina o script atual

//ou lançar exceção

//throw new Exception('Não foi possível conectar ao bd'); } ?>

• Cuidado: Se a exceção não for capturada via set_exception_handler ou try e catch um erro ocorrerá e dados da conexão serão expostos.

• Ex.: Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [1049] Unknown database 'pd'' in C:\xampp\htdocs\minicurso\index.php:13 Stack trace: #0 C:\xampp\htdocs\minicurso\index.php(13): PDO->__construct('mysql:host=loca...', 'pdo', 'pdo', Array) #1 {main} thrown in C:\xampp\htdocs\minicurso\index.php on line 13

Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Prepared Statement

• Oferecem dois grandes benefícios:

1. A consulta é preparada (parsed) apenas uma vez e

pode ser executada múltiplas vezes com diferentes

parâmetros, i.e, são customizáveis. Quando a

consulta é preparada o banco de dados analizará,

compilará e otimizará a consulta. Usando prepared

statement a aplicação evita repetir a análise,

compilação e otimização do ciclo. Isto significa que

prepared statements usam menos recursos e

assim rodam mais rápido.

Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Prepared Statement

2. Os parâmetros dos prepared statements não necessitam de

ser quoted. O driver do servidor de BD automaticamente faz

isso. Isso certifica ao desenvolvedor que nenhuma SQL

injection ocorrerá (entretanto, se outras porções do código

da consulta estão sendo construída com entradas

unescaped, SQL injection é ainda possível).

• Def.: São templates para SQL compilados que serão

executados.

• Prepared statements são emuladas para drivers que não

suportam-as. Isto faz a aplicação usar o mesmo paradigma

de acesso ao dado.

Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Crie uma classe DAO <?php

include_once 'mysqlpdo.php';

include_once 'ilogincomumdao.php';

class LoginComumDAOMySQL extends MySQLPDO implements ILoginComumDAO {

public function __construct($driver_options=array(PDO::ATTR_PERSISTENT => true)) {

parent::__construct($driver_options);

}

public function add(LoginComum $l) {

//PREPARED STATEMENT

$stmt = $this->prepare("INSERT INTO LOGIN (log_user, log_senha) VALUES (:user, :senha)");

$stmt->bindParam(':user', $user);

$stmt->bindParam(':senha', $senha);

//ou $stmt = $this->prepare("INSERT INTO LOGIN (log_user, log_senha) VALUES (?, ?)");

//$stmt->bindParam(1, $user);

//$stmt->bindParam(2, $senha);

$user = $l->getUsuario();

$senha= $l->getSenha();

//$user = 'x';

//$senha = 'y';

$stmt->execute();

return $stmt;

}

//... TEM MAIS CÓDIGO

Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Crie uma classe DAO

public function atualiza(LoginComum $l) {

return $this->query("UPDATE LOGIN SET log_senha = ? WHERE log_user = ?", $l->getSenha(), $l->getNroVezesAcessado(), $l->getUsuario());

}

public function busca($usuario) {

return $this->query("SELECT * FROM LOGIN where log_user = ?", $usuario);

}

public function remove($usuario) {

return $this->query("DELETE FROM LOGIN where log_user = ?", $usuario);

}

}

?>

Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Exemplo busca de dados com fetch()

$stmt = $this->prepare("SELECT * FROM LOGIN

where log_user = ?");

if ($stmt->execute(array($usuario))) {

while ($row = $stmt->fetch()) {

print_r($row);

}

}

Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Alterando o controle • Para testar o método add, deixe o arquivo de controle clogin.php como abaixo:

<meta Content-Type="text/html" charset="utf-8">

<?php // controle/clogin.php

include_once '../modelo/mlogincomum.php';

include_once '../dao/logincomumdaomysql.php';

class cLogin{

private $msg;

function __construct() {

$login_comum = new LoginComum($_POST['usuario'], $_POST['senha']);

$loginComumDAO = new LoginComumDAOMySQL();

$stmt = $loginComumDAO->add($login_comum);

if($stmt->errorCode() == 0){

$this->msg = $login_comum->getUsuario(). " foi adicionado com sucesso";

}else{

$this->msg = $stmt->errorInfo()[2];

}

header("Location: ../visao/login.php?msg=$this->msg");

function __destruct() {

echo "Bye!"."<br>";

}

}

$clogin = new cLogin();//ou new cLogin

?>

Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Alterando a visão <?php // visao/login.php

if(isset($_GET['msg'])){//imprime na visão a mensagem na url

echo $_REQUEST['msg']."<br>";

}

?>

<!DOCTYPE html>

<html>

<head>

<title>Login</title>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

</head>

<body>

<form method="post" action="../controle/clogin.php">

Usuário: <input type="text" name="usuario">

<br><br>

Senha: <input type="password" name="senha">

<input type="submit" value="Logar!">

</form>

</body>

</html>

Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Transação (ACID)

try {

$bd->beginTransaction();

$bd->exec(

"insert into staff (id, first, last) values

(23, 'Joe', 'Bloggs')");

$bd->commit();

} catch (Exception $e) {

$bd->rollBack();

echo "Failed: " . $e->getMessage();

}

Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Encerrando uma conexão

Para encerrar uma conexão com o servidor de banco de dados basta atribuir null ao objeto PDO.

$bd = null;

Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Stored Procedures

• Prepared statements também podem chamar uma stored procedure com parâmetros de entrada e saída.

<?php

$stmt=$bd->prepare ("CALL funcao(?)"); $stmt-> bindParam (1, $return_value, PDO::PARAM_STR, 4000); // executa a stored procedure

$stmt->execute(); print "procedure returned $return_value\n";

?>

Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Drivers

Banco de dados Driver Banco de dados suportados

4D (PDO) PDO_4D 4D

CUBRID (PDO) PDO_CUBRID Cubrid

Firebird (PDO) PDO_FIREBIRD Firebird

IBM (PDO) PDO_IBM IBM DB2

Informix (PDO) PDO_INFORMIX IBM Informix Dynamic Server

MS SQL Server (PDO) PDO_DBLIB FreeTDS / Microsoft SQL Server / Sybase

MS SQL Server (PDO) PDO_SQLSRV Microsoft SQL Server / SQL Azure

MySQL (PDO) PDO_MYSQL MySQL 3.x/4.x/5.x

ODBC and DB2 (PDO) PDO_ODBC ODBC v3 (IBM DB2, unixODBC and win32 ODBC)

Oracle (PDO) PDO_OCI Oracle Call Interface

PostgreSQL (PDO) PDO_PGSQL PostgreSQL

SQLite (PDO) PDO_SQLITE SQLite 3 and SQLite 2

Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Constantes pré-definidas

• Geral

• http://us2.php.net/manual/pt_BR/pdo.constants.php

• Do MySQL

• http://us2.php.net/manual/pt_BR/ref.pdo-mysql.php

Aula 4 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Segurança em PHP

• Gerar senha criptografada com password_hash() a partir

do PHP 5.5.0

• Características:

• Cria senhas usando algoritmos hashing fortes (one-way);

• Compatível com a função crypt();

• Atualmente suporta dois algoritmos:

• PASSWORD_DEFAULT: usa atualmente o algoritmo BCRYPT e pode

gerar senhas de tamanhos variáveis. Para armazenar no BD o

recomendável é colocar a senha gerada em um campo de 255

caracteres.

• PASSWORD_BCRYPT: gera um resultado padronizado com a função

crypt() usando hash com identificador "$2y$". O resultado será sempre

uma string de tamanho 60 ou Falso em caso de falha.

Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Segurança em PHP

• Opções suportadas:

• salt - programador fornece uma string para usar na

função. Isto irá substituir e evitar que uma string seja

gerada automaticamente. Se omitida, uma string

randômica será gerada para cada nova senha que é o

desejado.

• cost - o custo do algoritmo que deve ser usado. Se

omitido, o valor default 10 será usado. Dependendo do

hardware, um custo maior poderá ser considerado.

Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Segurança em PHP

• string password_hash ( string $password , i

nteger $algo [, array $options ] )

• password – O password do usuário

• algo - o algoritimo a ser usado na função

• Options – Um array assossiativo contendo opções: salt e

cost.

• Retorna o hash da senha, ou FALSE em caso de falha.

Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Exemplo 1

<?php

/**

* Usa o algoritmo padrão

*/

echo password_hash("rasmuslerdorf", PASSWORD

_DEFAULT). "<br>";

?>

• Saída:

• $2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7

KnEd1rVAGv3Fykk1a

Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Exemplo 2

/**

* Define o custo do algoritmo BCRYPT para 12 e o

salt é gerado randomicamente. Sempre gera 60

caracteres

*/

$options = [

cost => 12,

salt => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM)

];

echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT,

$options). "<br />";

• Saída:

• $2y$12$QjSH496pcT5CEbzjD/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDxY3K

Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Não adianta muito um bom algoritmo

hash se o usuário... • Não deixe que os usuários criem senhas fracas.

Determine:

• Número mínimo de caracteres;

• Uso de caracteres especiais;

• Letras maiúsculas e minúsculas;

• Uso de números, etc.

Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Verificar senha

boolean password_verify ( string $password , string

$hash )

• password – a senha do usuário

• Hash – Uma hash criado por password_hash().

if (password_verify('rasmuslerdorf', $hash)) {

echo ‘Senha válida!';

} else {

echo ‘Senha inválida.';

}

password_hash() retorna algoritmo, custo e o salt. Portanto, toda a informação necessária para verificar a hash está incluída nela permitindo verificar a hash sem separar em campos separados no BD.

Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Exercícios

• Utilize a função password_hash() para criar a hash da

senha do usuário antes de salvaguardar o registro no

banco de dados. Veja o resultado no banco de dados.

• Utilize a função password_verify() para verificar a

senha digitada pelo usuário.

Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Uma solução:

• Crie um método para comparar a senha e outro que gere

o hash da senha.

Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Uma solução:

• Na camada DAO altere onde é necessário definir o HASH

da senha. Neste caso, nas funções de adicionar e

atualizar.

Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Uma solução:

• Apenas testando no controle

Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Escondendo o PHP (Segurança por

obscuridade) • Ao definir expose_php para off no seu arquivo php.ini,

você reduz a quantidade de informação disponível para

os hackers.

• Configurar o servidor web (por ex. Apache) para analisar

diferentes tipos de arquivo através do PHP. Ou com

diretivas no arquivo .htaccess, ou no arquivo de

configuração do apache.

• Ex: defina uma arquivo nomeado .htaccess e coloque este trecho

de código.

# Make all PHP code look like HTML

AddType application/x-httpd-php .htm .html

Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Dicas de segurança

• Limite o poder dos usuários do seu banco ou de um usuário do Apache • Nunca atribua poderes de admin a usuários comuns

• Não use nos campos das tabelas do banco de dados o mesmo nome que o atributo “name” das tags HTML. Dica: use prefixos ou pós-fixos nos campos e nas tabelas.

• Cheque as variáveis recebidas de um formulário HTML • Ex.: Se a variável for do tipo inteiro, verifique se uma string foi

passada

• Não dê permissões totais de acesso a páginas aos usuários comuns por exemplo com comandos no linux. • Usando a diretiva open_basedir definida no php.ini você pode

controlar e restringir quais diretórios o PHP tem permissão de usar.

Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Dicas de segurança

• Estabeleça quando necessário conexões sobre SSL

(HTTPS = HTTP + SSL) para criptografar comunicações

cliente/servidor para aumentar a segurança.

• Ou use SSH para criptografar a conexão de rede entre

cliente e servidor remoto.

• Se uma dessa opções for usada, monitoramento do seu

tráfego e obtenção de informação sobre seu banco de

dados serão dificultados por um atacante.

Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Exemplo de Injeção SQL por falta de

checagem de variável <?php

$offset = $argv[0]; // Sem validação de entrada!

$query = "SELECT id, name FROM products ORDER BY na

me LIMIT 20 OFFSET $offset;";

$result = pg_query($conexão, $query);

?>

• Usuários normais clicam nos links 'próxima' e 'anterior' onde $offset é codificado na URL. O script espera que o valor de $offset seja um inteiro. Se alguém tentar invadir acrescentando a forma codificada por urlencode() da URL seguinte:

Exemplo de ataque: 0; insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd) select 'crack', usesysid, 't','t','crack' from pg_shadow where usename='postgres'; --

Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Correção do exemplo anterior

<?php settype($offset, 'integer'); $query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;"; // por favor perceba o %d na string de formato, usando %s seria inútil $query = sprintf("SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET %d;", $offset); ?>

Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Exemplo 2

• Exemplo #1 Uso Perigoso de Variáveis

• <?php // remove um arquivo do diretório home do usuário... ou talvez // de outra pessoa? unlink ($evil_var); // Escreve registro do acesso... ou talvez uma entrada em /etc/passwd? fwrite ($fp, $evil_var); // Executa algo trivial... ou rm -rf *? system ($evil_var); exec ($evil_var); ?>

Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Dicas de segurança

• Adicione aspas para cada valor não numérico que será passado para o banco de dados com as funções de caracteres de escape. Ex.:mysql_real_escape_string(). Ou funções addslashes() e str_replace()

• Não imprima qualquer informação específica do banco de dados, especialmente sobre o esquema, custe o que custar.

• Tome cuidado em relatar erros

• o estilo de um erro genérico do PHP indica que o sistema está rodando o PHP.

• O atacante pode explorar vulnerabilidades do back-end

• Dica: crie seu tratador de erros

• Desabilite display_errors no arquivo php.ini e defina o arquivo de registro usando a diretiva error_log

Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Dicas de segurança

• O XAMPP avisa-o quando alguns problemas de

segurança ocorrem.

• Veja no menu segurança (security) em localhost/xampp

Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Dicas

• Trabalhar com PHP em modo error_reporting (E_ALL)

também pode ajudar avisando sobre variáveis sendo

usadas antes de serem checadas ou inicializadas (então

você pode prevenir que dados incomuns sejam

operados).

• TESTAR

• Captcha

• Mantenha-se atualizado!

Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Site para treinar e aprender alguns tipos

de ataque • http://www.dvwa.co.uk/

Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Outros sites

• Conectando PHP ao MySQL:

http://us2.php.net/manual/pt_BR/ref.pdo-

mysql.connection.php

• http://us2.php.net/manual/pt_BR/class.pdostatement.php

• Gerar Senha segura:

http://br1.php.net/manual/en/function.password-hash.php

Aula 5 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Bootstrap

• Framework de front-end

• Características: • Estrutura simples, intuitiva e poderosa para o desenvolvimento

web mais rápido e mais fácil;

• Customizável;

• Responsível;

• Não é necessário ter grandes conhecimentos em CSS3.

• Algumas versões em 10/12/2013 • Globo Bootstrap - Versão 2.2.2 – (Utilizado neste curso)

• Bootstrap – Versões 2.3.2 (com alguns recursos novos em relação ao anterior) e 3.0.3 – (Mais recente, com mais recursos que o anterior)

Aula 6 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Usando o Bootstrap

• Adicione no arquivo de visão login.php as seguintes

diretivas para incluir o css e javascript.

Aula 6 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia

Usando o Bootstrap

• Veja a diferença com e sem bootstrap respectivamente.

• É bem simples mudar a cor do botão, basta colocar a classe

na tag html que fará com que o botão por exemplo seja azul <input class="btn btn-primary" type="submit"

value="Logar!">

• Uma lista de classes disponíveis em CSS podem ser

encontradas em http://globocom.github.io/bootstrap/base-

css.html#buttons

Aula 6 PET Sistemas de Informação | Faculdade de Computação | Universidade Federal de Uberlândia