php- il mio codice è protetto abbastanza da proteggere dall'esecuzione del comando remoto quando si utilizza shell_exec ()?

0

Sto usando la funzione shell_exec sulle seguenti variabili per eseguire comandi sulla shell:

  1. fname (solo caratteri)
  2. fpack (solo caratteri)
  3. email (un indirizzo email valido)

Il mio codice è:

<?php

require_once 'connectionToDB.php';

$fname = mysqli_real_escape_string($dbc, filter_var(escapeshellarg($_POST['fname']), FILTER_SANITIZE_STRING));
$fpack = mysqli_real_escape_string($dbc, filter_var(escapeshellarg($_POST['fpack']), FILTER_SANITIZE_STRING));
$email = mysqli_real_escape_string($dbc, filter_var(escapeshellarg($_POST['email']), FILTER_SANITIZE_EMAIL));

/** Verify name of applicaion **/
if(!ctype($fname)) {
    $op = json_encode(array('type' => 'error', 'msg' => 'Application name must be in english alphabetical letters only'));
    die($op);
}
if(strlen($fname)>20) {
    $op = json_encode(array('type' => 'error', 'msg' => 'Application name must be less than 20 characters'));
    die($op);
}

/** Verify name of package **/
if(!ctype($fpack)) {
    $op = json_encode(array('type' => 'error', 'msg' => 'Package name must be in english alphabetical letters only'));
    die($op);
}
if(strlen($fpack)>20) {
    $op = json_encode(array('type' => 'error', 'msg' => 'Package name must be less than 20 characters'));
    die($op);
}

/** Verify user's email **/
if (strlen($email)>50) {
    $op = json_encode(array('type' => 'error', 'msg' => 'Email must be of less than 50 characters'));
    die($op);
}

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $op = json_encode(array('type' => 'error', 'msg' => 'Please provide a valid email address.'));
    die($op);
}

Come ho detto sto usando shell_exec su queste variabili, ho paura dell'esecuzione di comandi da remoto. Il mio codice è abbastanza sicuro da prevenire RCE?

    
posta Ashish 25.02.2015 - 16:36
fonte

1 risposta

6

No, questo è non sicuro.

La maggior parte del codice non ha nemmeno senso. Sembra che tu abbia semplicemente gettato tutte le funzioni che conosci alle variabili nella speranza che ciò possa in qualche modo aiutare. Questo è un approccio molto povero. Non solo non è lavoro; in realtà introduce bug e può portare a gravi problemi.

Né l'escape di MySQL né il filtro HTML (attraverso FILTER_SANITIZE_STRING ) hanno nulla a che fare con la shell. SQL, HTML e la lingua utilizzata dalla shell sono tre contesti completamente diversi e richiedono procedure di sicurezza completamente diverse. Non puoi combinarli casualmente. Ad esempio, mysqli_real_escape_string() interromperà il quoting di escapeshellarg() e potrebbe effettivamente consentire all'utente di manipolare il comando shell.

Nota anche che la maggior parte di quelle funzioni che stai usando sono distruttive , il che significa che cambiano silenziosamente i dati inseriti dall'utente. Questa è una pessima idea, perché potresti finire per eseguire comandi che l'utente non ha mai voluto che tu eseguissi. Accetta o rifiuta l'input dell'utente, ma non sostituirlo silenziosamente con qualcos'altro.

Quindi avrai bisogno di un approccio molto diverso:

  • Convalida l'input utente non elaborato . Se non è accettabile, fermati e genera un errore.
  • Quindi prepara l'input per il contesto specifico in cui desideri utilizzarlo. Nel caso degli argomenti della shell, usa solo escapeshellarg() per uscire correttamente dall'input per i contesti della shell.
risposta data 25.02.2015 - 18:26
fonte

Leggi altre domande sui tag