Visualizzazione risultati 1 fino 8 di 8
Like Tree1Likes
  • 1 Post By darbula

Discussione: php file json informazioni

  1. #1
    puntifedelta non è connesso Utente giovane
    Data registrazione
    08-10-2020
    Messaggi
    92

    Predefinito php file json informazioni

    ciao ragazzi ho una domanda da fare e spero che possiate darmi un consiglio, con successo estraggo il file json dove visualizzo tutti dati, questo è il codice

    Codice PHP:
    <?php
    if ($result = mysqli_query($con, $sql))
    {
    $resultArray = array();
    $tempArray = array();

    while(
    $row = $result->fetch_object())
    {

    $tempArray = $row;
    array_push($resultArray, $tempArray);
    }

    echo
    json_encode($resultArray);
    }
    ?>
    il file sopra citato si trova all'interno di una cartella, questo file viene richiamato da una applicazione che stiamo realizzando in flutter per leggere i dati, come posso fare per renderla sicura lato web ? cioè che non possa essere come dire hackerata se mi passate il termine o vista da altri ? oppure va bene così ?

    grazie a tutti per i consigli
    Ultima modifica di puntifedelta : 19-10-2020 alle ore 11.54.07

  2. #2
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    il file sopra citato si trova all'interno di una cartella, questo file viene richiamato da una applicazione che stiamo realizzando in flutter per leggere i dati, come posso fare per renderla sicura lato web ? cioè che non possa essere come dire hackerata se mi passate il termine o vista da altri ? oppure va bene così ?
    ... è una domanda la cui risposta è piuttosto vasta.

    Innanzitutto darei una sistemata al codice, rendendolo corretto e minimale. Questo non è direttamente connesso alla sicurezza, ma è inutile porsi questo tipo di domande su un codice che non è "ottimale" (in senso generico). Per esempio stai mescolando l'interfaccia procedurale di mysqli con quella a oggetti (mysqli_query contro $result->fetch_object), inoltre nel brano mostrato compare un $tempArray che non serve a molto, se ne può facilmente fare a meno.

    In secondo luogo non mi affiderei troppo ai type casting impliciti di PHP come espressioni booleane nelle condizioni di if e while, opterei piuttosto per un test esplicito di (dis)uguaglianza forte.

    Terzo, e probabilmente più importante: il testo della query memorizzato in $sql è generato sulla base di un input esterno? Se sì, è sanificato? Se non lo è c'è il rischio di SQL Injection. Sarebbe il caso di usare almeno un prepared statement.

    Quarto, qualche valutazione sul carico della query non guasta. Se si tratta di una SELECT che legge potenzialmente tutte le righe di una tabella è facile esporsi a DoS, in quel caso meglio prevedere la possibilità di risultati divisi per pagine.

    I suggerimenti che do più spesso:


  3. #3
    puntifedelta non è connesso Utente giovane
    Data registrazione
    08-10-2020
    Messaggi
    92

    Predefinito

    come sempre disponibile e preciso nella risposta, avresti un esempio da mostrarmi su cui fare riferimento ? quale sarebbe la soluzione migliore ? sarebbe opportuno appoggiarmi a qualcuno che mi possa creare una soluzione sicura ?

    grazie

  4. #4
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Per quanto riguarda il codice mostrato, supponendo di usare l'interfaccia a oggetti:
    Codice PHP:
    <?php
    $stmt
    = $con->prepare($sql);
    if (
    $stmt === false) {
    throw new
    Exception("Could not prepare query \"$sql\": " . $mysqli->error);
    }

    if (
    $stmt->execute() === false) {
    throw new
    Exception("Could not execute query \"$sql\": " . $mysqli->error);
    }

    if ((
    $result = $stmt->get_result()) === false) {
    throw new
    Exception("Could not get result for query \"$sql\": " . $mysqli->error);
    }

    echo
    json_encode($result->fetch_all());
    ?>
    Gli esempi sono basati su quelli in Prepared Satement. Prima viene preparato lo statement e controllato che la preparazione sia andata a buon fine, poi viene eseguito e controllato che l'esecuzione sia andata a buon fine, poi viene letto il risultato e controllato che la lettura sia andata a buon fine (... se non si è capito, la morale è controllare il valore di ritorno di ogni singola funzione/metodo chiamata ). In caso di problemi viene sollevata un'eccezione: scelta arbitraria, si potrebbero usare die o altri costrutti a seconda delle necessità, l'importante è che eventuali problemi siano segnalati e registrati da qualche parte (log).

    Alla fine i risultati vengono recuperati e convertiti in una stringa JSON invocando semplicemente fetch_all e json_encode.

    Per le altre questioni bisogna più che altro vedere come viene generata $sql.

    sarebbe opportuno appoggiarmi a qualcuno che mi possa creare una soluzione sicura ?
    Sicuramente male non fa

    I suggerimenti che do più spesso:


  5. #5
    puntifedelta non è connesso Utente giovane
    Data registrazione
    08-10-2020
    Messaggi
    92

    Predefinito

    grazie molto gentile la connessione al db è questa

    <?php
    $con=mysqli_connect("localhost","nome","password", "nome");
    $con->query("SET CHARACTER SET utf8;");
    $sql = "SELECT cliente.id_cliente, cliente.nome, cliente.cognome, cliente.whatsapp, cliente.tessera, cliente.data_reg,
    SUM(punti.punti) as punti FROM cliente INNER JOIN punti ON punti.id_cliente = cliente.id_cliente group by id_cliente";
    ?>

    dove vengono recuperati i clienti ed il resto

    ho il file log del server che mi informa

    è più sicuro l'esempio postato da te ?

    posso scriverti ?
    Ultima modifica di puntifedelta : 19-10-2020 alle ore 15.37.25

  6. #6
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    è più sicuro l'esempio postato da te ?
    In questo caso no, perché la query è "fissata" e non dipende da input esterno, quindi non ci sono rischi di SQL injection e si può tranquillamente fare a meno di prepared statement.

    Siccome nel resto del codice usi l'interfaccia a oggetti di mysqli, è opportuno farlo anche durante la connessione. Mettendo tutto assieme diventa così:
    Codice PHP:
    $con = new mysqli("localhost","nome","password", "nome");
    $con->query("SET CHARACTER SET utf8;");
    $sql = "SELECT cliente.id_cliente, cliente.nome, cliente.cognome, cliente.whatsapp, cliente.tessera, cliente.data_reg,
    SUM(punti.punti) as punti FROM cliente INNER JOIN punti ON punti.id_cliente = cliente.id_cliente group by id_cliente"
    ;


    if ((
    $result = $con->query($sql)) === false) {
    throw new
    Exception("Error with query \"$sql\": " . $mysqli->error);
    }
    echo
    json_encode($result->fetch_all());
    Poiché il numero di risultati aumenterà all'aumentare del numero di clienti e punti, prima o poi la dimensione della risposta aumenterà così tanto da rallentare il sistema. Ma finché i clienti sono sotto il migliaio non mi preoccuperei, dopo bisognerà pensare alla paginazione.

    posso scriverti ?
    Certo, puoi mandarmi un PM

    I suggerimenti che do più spesso:


  7. #7
    puntifedelta non è connesso Utente giovane
    Data registrazione
    08-10-2020
    Messaggi
    92

    Predefinito

    inviato

  8. #8
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Comunque dopo la query SET NAMES utf8 o SET CHARACTER SET utf8 usa questa funzione per mitigare il problema dei caratteri in uso (ovviamente ti interessa quando la query non è "fissata", o comunque male non fa).
    https://www.php.net/manual/en/mysqli.set-charset.php
    puntifedelta likes this.

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •