Gestione del database e prevenzione dell'iniezione SQL

1

Ho scritto una classe modello database in PHP e ho scritto una classe controller che convalida in modo specifico i dati prima di inviarli a db. Ricevo critiche sul fatto che dovrei gestire i dati in database model class piuttosto che controller class.

Volevo scrivere una classe db generica che possa essere utilizzata ovunque per le operazioni CRUD. Per favore, ragazzi, potete aiutarmi a risolvere questo problema? Se dovrei convalidare i dati nella classe del modello db o nella classe del controller db?

    
posta Syntax Error 29.08.2014 - 11:39
fonte

4 risposte

3

Dovresti usare PDO (PHP Data Objects) per prevenire attacchi di SQL Injection. Supporta 12 diversi sistemi di database.

La tua Classe generica per la connessione a MySQL usando pdo sarebbe simile a questa:

class Db{
    public function dbConnect(){
        try {
            $conn = new   PDO('mysql:host=host_name/ip;dbname=database_name','user','password');
            $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        }catch(PDOException $e){
            echo $e->getMessage();
         }
    return $conn;
    }
}

Puoi usare questa classe da qualsiasi luogo solo seguendo i seguenti passi:

  1. includere il file php sopra nello script in cui si desidera utilizzare la classe Db . Ad esempio:

    include_once 'db_connect.php';
    
  2. Crea un oggetto di Db :

    $conn = new Db(); // $conn is object
    
  3. Chiama per funzionare 'dbConnect' usando object($conn) :

     $connection =$conn->dbConnect();                                                 
     // $connection is variable which will hold the
     // value returned by the 'dbConnect' function.
    

Utilizzando questo metodo puoi creare più funzioni all'interno della classe Db per le operazioni CRUD e utilizzare quelle funzioni ovunque tu voglia.

Per ulteriori informazioni sulla visita PDO:

  1. link
  2. link
risposta data 17.01.2015 - 07:54
fonte
1

Se la tua classe di database è responsabile per ottenere dati dentro e fuori dal tuo vero database, allora dovrebbe prendersi cura di difendersi dagli attacchi di SQL injection o, se stai ancora costruendo SQL dinamico, sfuggire sequenze di caratteri che possono essere dannose ( es. virgolette singole, interruzioni di riga (in alcuni casi), ecc.)

In questo modo, ogni esterno della classe del database può solo con tipi di PHP "puri" e non deve preoccuparsi di nulla di tutto ciò. La classe del database esegue il lavoro della classe del database in modo che nient'altro debba farlo.

Detto questo, è una discussione completamente diversa sul fatto che la classe database debba fare la convalida logica , ad esempio

Is this a valid tire size for this particular car?

Questo è non un problema di database; è una logica "economica" e appartiene davvero a un'altra parte.

    
risposta data 15.09.2014 - 17:46
fonte
0

Le convalide del database dovrebbero avvenire nel tuo modello. Supponendo che non si stia utilizzando un framework, è possibile scrivere una classe wrapper generica con le operazioni CRUD e proteggere da SQL injection ecc. Qui. La convalida dei dati può avvenire all'interno del tuo wrapper e una convalida più specifica (ad esempio come Rails like validates_presence_of) sui dati può verificarsi in modelli che sottoclassi il tuo wrapper. Uno pseudo esempio qui sotto dovrebbe farti iniziare, tuttavia, nota che è sempre molto meglio usare un framework (anche un micro-framework con ORM) per compiti come la maggior parte di questa roba è cotta in modo che sia solo una questione di apprendimento la struttura stessa.

<?php
class DataWrapper
{
    function __construct()
    {
        // connect to database here
    }


    function create($object)
    {
        // do create stuff here
    }

    function read($object)
    {
        // do read stuff here
    }
    ...
}

class Car extends DataWrapper
{
    private $table = 'cars';

    // can do specific validation here
}
?>
    
risposta data 15.09.2014 - 05:41
fonte
0

Penso che quello che stai cercando sia una classe Servizio . I controller dovrebbero essere molto sottili e letteralmente non fare altro che inoltrare i dati dalla richiesta a un servizio e rispondere con l'output appropriato.

La classe di servizio dovrebbe occuparsi della delega di convalida e occuparsi dell'astrazione del database.

    
risposta data 16.02.2015 - 11:01
fonte

Leggi altre domande sui tag