Estoy usando la función shell_exec
en las siguientes variables para ejecutar comandos en el shell:
-
fname
(solo caracteres) -
fpack
(solo caracteres) -
email
(una dirección de correo electrónico válida)
Mi código es:
<?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);
}
Como dije, estoy usando shell_exec
en estas variables, tengo miedo de la ejecución remota de comandos. ¿Es mi código lo suficientemente seguro para prevenir RCE?