Jump to content


Photo

Class.Conexaopdo.Php


  • Faça o login para participar
4 replies to this topic

Poll: Vc acha que compromte

This is a public poll. Other members will be able to see which options you chose

Compromete Sim ou Não

Para visualizar a enquete e os resultados, faça o login ou cadastre-se.
Vote Cadastre-se para voltar

#1 flavianog

flavianog

    Novato no fórum

  • Usuários
  • 5 posts
  • Sexo:Masculino
  • Localidade:mossoro

Posted 03/07/2010, 17:03

Minha duvida é a seguinte essas classe comprometem o desempenho do sistema e a seguranca contra sql injection

class.conexao.php
<?php

 class conexao{
 	
 	private $host;
 	private $dbName;
 	private $user;
 	private $pass;
 	private $bd;
 	
 	public function conexao($host,$dbName,$user,$pass){
 		$this->host = $host;
 		$this->dbName =$dbName;
 		$this->user = $user;
 		$this->pass = $pass;
 		$this->conectar();
 	}
 	
 	function conectar(){
 		$dsn = 'mysql:host='.$this->host.';dbname='.$this->dbName;
 		try {
 			$this->bd = new PDO($dsn,$this->user,$this->pass);
			$this->bd->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
		} catch (PDOException  $e) {
   			print "Houve um erro com a conexão ao banco de dados <br/> ".$e->getMessage();
		}
 	}
 	function inserir($array){
 		 $ax = 0;
 		foreach($array as $auxCampoBd => $vlr){
 			if($ax == 0){
 				$campoBd .= $auxCampoBd;
 				$campoBd2 .= ":".$auxCampoBd;
 				$ax = 1;
 			}
 			else{
 				$campoBd .= ",".$auxCampoBd;
 				$campoBd2 .= ",:".$auxCampoBd;

 			}
 		}
 		
 		$sql = ' INSERT INTO usuario('.$campoBd.') VALUES ('.$campoBd2.') ';
 		
 		try {
 			$query = $this->bd->prepare($sql);
 			foreach($array as $auxcampo => $auxValor){
 				$query->bindValue(':'.$auxcampo,$auxValor,PDO::PARAM_STR);
 			}
 			$query->execute();
 		}catch (PDOException $e) {
 			echo $e->getMessage();
 		}
 	
 	}
 }



?>

acesso.php

<?php
include_once 'class.conexao.php';
define("HOST","localhost");
define("DBNAME","testar");
define("USER","root");
define("PASS","123456");


$conexao = new conexao(HOST,DBNAME,USER,PASS);
$conexao->inserir(array('nome' => 'Flaviano','sobrenome' =>'da Silva','email' => 'flaviano@yahoo.com.br'));

?>


#2 André Manoel

André Manoel

    Doutor

  • Usuários
  • 996 posts
  • Sexo:Masculino
  • Localidade:Brasilia

Posted 05/07/2010, 10:55

Bem ...

Em relação a desempenho ela influencia na seguinte questão...

Ela não tem um tratamento para a criação de vários objetos.
Ou seja, se você chamar a função conexao diversas vezes... ele criará diversas conexões diferentes com o banco.
Existe um padrão de projeto chamado Singleton que trata esse problema.

E em questão de SQLInjection esta classe não realiza nenhum tratamento.
Então se alguém tentar realizar a invasão utilizando essa técnica ele pode conseguir acesso a todos os dados do banco... e isso não é legal...

Então você pode fazer o seguinte... tratar as entradas de SQL Injection quando você recebe os dados dos formulários ou criar a função para tratamento dentro desta classe...

(y)
Iniciando na Ajuda On line...

Posted Image Meu post lhe ajudou? Reputar/votar é uma das formas de agradecer.

#3 flavianog

flavianog

    Novato no fórum

  • Usuários
  • 5 posts
  • Sexo:Masculino
  • Localidade:mossoro

Posted 05/07/2010, 22:17

Ok andre muito obrigado pelas suas dicas vou criar um metodo para tratar essas questoes do SQL Injection e vou pesquisar sobre esse padrão Singleton vlw.

[quote name='André Manoel' date='05/07/2010, 10:55' timestamp='1278338141' post='1001044']
Bem ...

Em relação a desempenho ela influencia na seguinte questão...

Ela não tem um tratamento para a criação de vários objetos.
Ou seja, se você chamar a função conexao diversas vezes... ele criará diversas conexões diferentes com o banco.
Existe um padrão de projeto chamado Singleton que trata esse problema.

E em questão de SQLInjection esta classe não realiza nenhum tratamento.
Então se alguém tentar realizar a invasão utilizando essa técnica ele pode conseguir acesso a todos os dados do banco... e isso não é legal...

Então você pode fazer o seguinte... tratar as entradas de SQL Injection quando você recebe os dados dos formulários ou criar a função para tratamento dentro desta classe...

(y)
[/quote]


André modifiquei a classe para usar Singleton ela esta funcionando ta cadastrando no banco o que eu gostaria de saber é se usei o singleton corretamente se realmente so vai haver uma conexão msm eu chamando diversa vezes esta função e a respeito do SQL injection estou conectando no banco através do pdo usando prepared statment isso num já evita o usao de SQL injection? Mas em todo casado coloque um addslashes no recebimento dos dados :D

class.conexao.php
<?php
define("HOST","localhost");
define("DBNAME","testar");
define("USER","user");
define("PASS","123456");
 class Conexao{
 	
 	private static $PDOinstance;
 	
 	static public function singleton(){
 		if(!isset(self::$instance)){
 			try {
 				
 				self::$PDOinstance = new PDO('mysql:host='.HOST.';dbname='.DBNAME,USER,PASS);
				self::$PDOinstance->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
 				
			}catch (PDOException   $e) {
   				print "Houve um erro com a conexão ao banco de dados <br/> ".$e->getMessage();
			}
 		}
 		
 	}
 	public function inserir($tabela = "",$array =""){
 	$ax = 0;
 		foreach($array as $auxCampoBd => $vlr){
 			if($ax == 0){
 				$campoBd .= $auxCampoBd;
 				$campoBd2 .= "?";
 				$ax = 1;
 			}
 			else{
 				$campoBd .= ",".$auxCampoBd;
 				$campoBd2 .= ",?";
 				
 			}
 			
 		}
 		if($tabela[1] == 1)//se for uma inserçao atravez de um procedure entra aqui
 		$sql = 'call '.$tabela[0].'('.$campoBd2.')';
 		else if($tabela[1] == 2)//Se for uma inserção  direto na tabela entra aqui
 		$sql = ' INSERT INTO '.$tabela[0].'('.$campoBd.') VALUES ('.$campoBd2.') ';
 		
 		try {
 			$i = 1;
 			$query = self::$PDOinstance->prepare($sql);
 			foreach($array as $auxcampo => $auxValor){
 				foreach($auxValor as $auxValor2 => $tipo){
 					$query->bindValue($i++,$auxValor2,$tipo);
 				}
 			}
 			$query->execute();
 		}catch (PDOException $e) {
 			echo $e->getMessage();
 		}
 	
 	}
	 
 }



?>


acesso.php
<?php
include_once 'class.conexao.php';

$tabela[0] = "usuario";
$tabela[1] = 2;

$dados = array();
//     Conluna                                                                                 tipo do vaalor
// na qual o valor                       valor que será inserido                              que será inserido
//  será inserido
$dados['nome'][trim((!get_magic_quotes_gpc()) ? addslashes($_POST['nome']) : $_POST['nome'])] = PDO::PARAM_STR;
$dados["sobrenome"][trim((!get_magic_quotes_gpc()) ? addslashes($_POST['sobrenome']) : $_POST['sobrenome'])] = PDO::PARAM_STR;
$dados["email"][trim((!get_magic_quotes_gpc()) ? addslashes($_POST['email']) : $_POST['email'])] = PDO::PARAM_STR;


Conexao::singleton();//abrindo conexao;
$conexao = new Conexao();
$conexao->inserir($tabela,$dados);
[/quote]

Edição feita por: flavianog, 05/07/2010, 22:18.


#4 André Manoel

André Manoel

    Doutor

  • Usuários
  • 996 posts
  • Sexo:Masculino
  • Localidade:Brasilia

Posted 06/07/2010, 14:03

Opa... me perdoe.
Realmente eu não tinha notado os prepared statements no código.
Realmente eles ajudam a previnir SQLInjection... mas mesmo assim não é bom confiar somente neles.
Faça a 'limpeza' dos dados no envio dos formulários com javascript e a 'limpeza' na página PHP que vc utiliza para receber os dados... e segurança é a base de um sistema bom, então se previnir nunca é demais.

Sobre o Singleton existem diversas formas de se usar e aplicar ... você pode aplicar em um método ... ou em uma instância da classe que seria o objeto.

Neste caso você está usando em um objeto que ficará com a conexão ... agora você evita o excesso de conexões desnecessárias e usará somente uma o que irá te dar uma performance maior.

^_^

(y)

Espero ter ajudado.
Iniciando na Ajuda On line...

Posted Image Meu post lhe ajudou? Reputar/votar é uma das formas de agradecer.

#5 flavianog

flavianog

    Novato no fórum

  • Usuários
  • 5 posts
  • Sexo:Masculino
  • Localidade:mossoro

Posted 06/07/2010, 15:32

Opa... me perdoe.
Realmente eu não tinha notado os prepared statements no código.
Realmente eles ajudam a previnir SQLInjection... mas mesmo assim não é bom confiar somente neles.
Faça a 'limpeza' dos dados no envio dos formulários com javascript e a 'limpeza' na página PHP que vc utiliza para receber os dados... e segurança é a base de um sistema bom, então se previnir nunca é demais.

Sobre o Singleton existem diversas formas de se usar e aplicar ... você pode aplicar em um método ... ou em uma instância da classe que seria o objeto.

Neste caso você está usando em um objeto que ficará com a conexão ... agora você evita o excesso de conexões desnecessárias e usará somente uma o que irá te dar uma performance maior.

^_^

(y)

Espero ter ajudado.

Hunrrum ok André vlw ajudou basto obg




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq