Você está na página 1de 83

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

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


Aula 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 2 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 Default para os métodos – Em qualquer contexto é possível
public $nome;
function getNome(); acessá-lo. Visibilidade fraca.

Apenas no contexto da classe é possível acessá-lo.


private function getNome(); private $nome;
Visibilidade forte.

Apenas no contexto da classe e subclasses é possível


protected function getNome(); protected $nome;
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 3 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
- 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.:
NOTA

- 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 4 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 5 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/vtVeH03tfHKFy36d4J0Ltp3lRtee9HDx
Y3K
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 n
ame 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 ORDE
R 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 6 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
• Baixe ele em
http://globocom.github.io/bootstrap/assets/bootstrap.zip
• Extraia-o para a pasta de visao do projeto.
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