Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Roberto Avelino

Não acessar array super global diretamente

Recommended Posts

Apesar de usar este código em outra tabela e que está gravando perfeitamente no banco de dados do mesmo projeto.

Não consigo inserir as informações editadas no  2º formulário de 11 que o projeto terá.

Sou iniciante em programação.

 

Mi ajudem a encontrar o erro ?

 

O Netbeans informa ( Não Acessar Array Super Global $_POST  Diretamente)

 

acess_Represent.php

require('Classe/OperadorDAO.php');
           
if (isset($_POST['nome'])){
   
    $dados['identificador'] = preg_replace('/[^[:alpha:]_]/', '', filter_input()(INPUT_POST['identificador']));
    $dados['nome'] = preg_replace('/[^[:alpha:]_]/', '', filter_input()(INPUT_POST['nome']));
    $dados['cpf'] = preg_replace('/[^[:alpha:]_]/', '', filter_input()(INPUT_POST['cpf']));
    $dados['identificacao'] = preg_replace('/[^[:alpha:]_]/', '', filter_input()(INPUT_POST['identificacao']));
    $dados['endereco'] = preg_replace('/[^[:alpha:]_]/', '', filter_input()(INPUT_POST['endereco']));
    $dados['banco'] = preg_replace('/[^[:alpha:]_]/', '', filter_input()(INPUT_POST['banco']));
    $dados['agencia'] = preg_replace('/[^[:alpha:]_]/', '', filter_input()(INPUT_POST['agencia']));
    $dados['operador'] = preg_replace('/[^[:alpha:]_]/', '', filter_input()(INPUT_POST['operador']));
    $dados['conta'] = preg_replace('/[^[:alpha:]_]/', '', filter_input()(INPUT_POST['conta']));
    $dados['autorizacao'] = preg_replace('/[^[:alpha:]_]/', '', filter_input()(INPUT_POST['autorizacao']));

    if(OperadorDAO::insert($dados)) {

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

<?php

require('database.php');

class OperadorDAO {
    
    private static $table="operador";
    
    public static function insert($dados){
        
        $sql = "INSERT INTO " . SELF::$table . " (identificador,nome,cpf,identificacao,endereco,banco,agencia,operador,conta,autorizacao)VALUES(?,?,?,?,?,?,?,?,?,?)";
        
        $stmt = DB::prepare($sql);
        
        $stmt->bindValue(1, $dados['identificador']);
        $stmt->bindValue(2, $dados['nome']);
        $stmt->bindValue(3, $dados['cpf']);
        $stmt->bindValue(4, $dados['identificacao']);
        $stmt->bindValue(5, $dados['endereco']);
        $stmt->bindValue(6, $dados['banco']);
        $stmt->bindValue(7, $dados['agencia']);
        $stmt->bindValue(8, $dados['operador']);
        $stmt->bindValue(9, $dados['conta']);
        $stmt->bindValue(10, $dados['autorizacao']);
        
        return $stmt->execute(); 
    }
}

 

database.php

<?php

require('config.php');

class DB{
    //Estou usando conceitos de encapsulamento, a única coisa pública é o método prepare, pois é o unico que precisaremos fora da classe.

    private static $conexao;

    private static function getConexao(){
        try {
            if(is_null(self::$conexao)){
                self::$conexao=new PDO("mysql:host=".DB_HOST."; dbname=".DB_NAME,DB_USER,DB_PASS,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); //array adiciona configurações UTF-8
            }
        } catch (PDOException $e) {
            $e->getMessage();
        }
        return self::$conexao;
    }
    public static function prepare($sql){
        return self::getConexao()->prepare($sql);
    }
}

 

config.php

<?php

define("DB_HOST", "localhost");
define("DB_NAME", "criar");
define("DB_USER", "root");
define("DB_PASS", "");

ini_set('display_errors', true);
error_reporting(E_ALL);

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Compartilhar este post


Link para o post
Compartilhar em outros sites

A forma que você está utilizando filter_input está errada:

filter_input()(INPUT_POST['identificador'])

O correto seria:

filter_input(INPUT_POST , 'identificador')

Veja os exemplos no manual:

http://php.net/manual/en/function.filter-input.php#refsect1-function.filter-input-examples

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá 

Gabriel,

Obrigado pelo  interesse em mi dar este apoio!

Mas eu fiz a correção indicada por você e não consegui resolver o problema.

Fiz desta forma a correção:

$dados['identificador'] = preg_replace('/[^[:alpha:]_]/', '', filter_input(INPUT_POST , 'identificador');

mas ainda mostra erro!

Eu tenho muita dificuldade em encontrar erros devido ao pouco conhecimento.

Este sistema que estou tentando fazer funcionar com os campos do formulários protegidos, eu já fiz; porem sem proteção nenhuma contra injection, agora eu estou tentando fazer o certo,  acredito!

O NetBeans mostra:

inesperado: variable '$dados'

Possível erro de sintaxe (verifique erro de sintaxe valida anterior)  inesperado

Instrução vazia

Fica aqui o registro de qualquer forma e obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O erro anterior:

Citar

Não Acessar Array Super Global $_POST  Diretamente

Não é bem um erro, é apenas uma informação. Não é recomendado realizar o acesso direto.

 

O único lugar que você faz o acesso direto é aqui:

if (isset($_POST['nome'])) {

E você pode substituir esse código por este:

if (filter_has_var(INPUT_POST , 'nome')) {

ou

if (filter_input(INPUT_POST , 'nome' , FILTER_NULL_ON_FAILURE)) {

A flag FILTER_NULL_ON_FAILER irá retornar false quando o campo não existir.

 

Sobre o novo erro:

Citar

inesperado: variable '$dados'

Possível erro de sintaxe (verifique erro de sintaxe valida anterior)  inesperado

Instrução vazia

 
 

 

Adicione o código corrigido aqui para que possamos avaliar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz a correção conforme solicitado e agora a tela fica branca e não grava no banco de dados.

O NetBeans não apresentou mais nenhuma informação no código dos arquivos, executei todos e não apresenta erro.

Ou seja não estou conseguindo gravar com segurança.

Saudações.

 

Citar

<?php
            require('Classe/OperadorDAO.php');            
            /*
        Proteção com regex, tira caracteres com risco de SQLi,
        isso combinado com o bindValue do PDO, deixa um grande nível de proteção.
        */

                if (filter_input(INPUT_POST , 'nome' , FILTER_NULL_ON_FAILURE)) {
                    
                $dados['identificador'] = preg_replace('/[^[:alpha:]_]/', '', filter_input(INPUT_POST ,'identificador'));
                $dados['nome'] = preg_replace('/[^[:alpha:]_]/', '', filter_input(INPUT_POST ,'nome'));
                $dados['cpf'] = preg_replace('/[^[:alpha:]_]/', '', filter_input(INPUT_POST ,'cpf'));
                $dados['identificacao'] = preg_replace('/[^[:alpha:]_]/', '', filter_input(INPUT_POST ,'identificacao'));
                $dados['endereco'] = preg_replace('/[^[:alpha:]_]/', '', filter_input(INPUT_POST ,'endereco'));
                $dados['banco'] = preg_replace('/[^[:alpha:]_]/', '', filter_input(INPUT_POST ,'banco'));
                $dados['agencia'] = preg_replace('/[^[:alpha:]_]/', '', filter_input(INPUT_POST ,'agencia'));
                $dados['operador'] = preg_replace('/[^[:alpha:]_]/', '', filter_input(INPUT_POST ,'operador'));
                $dados['conta'] = preg_replace('/[^[:alpha:]_]/', '', filter_input(INPUT_POST ,'conta'));
                $dados['autorizacao'] = preg_replace('/[^[:alpha:]_]/', '', filter_input(INPUT_POST ,'autorizacao'));

                if(OperadorDAO::insert($dados)) {
                    
                ?>

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ative os erros do PHP conforme informado nesse post:

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.