Conformité ECG: comment faire?

10

Il y a quelque chose comme un coding standardpour Magento 1 , appelé ECGoù de nombreuses choses devraient être évitées ou des méthodes qui ne devraient pas être utilisées.

Essayons de créer une liste qui couvre tous les cas qui génèrent des "erreurs" ou des "avertissements" dans votre code.

Vous trouverez ci-dessous une liste avec tous les avertissements possibles. Je mettrai à jour ce post à intervalles réguliers et un lien vers des réponses données et votées.

Remarque: veuillez essayer d'éviter les réponses en double;)

Téléchargement: https://github.com/magento-ecg/coding-standard


ECG renifle

Des classes

Mysql4

Les classes Mysql4 sont obsolètes.

Instanciation d'objets

L'instanciation directe d'objets (classe% s) est déconseillée dans Magento.

protected $disallowedClassPrefixes = array(
    'Mage_',
    'Enterprise_',
);

...

PHP

Aller à

L'utilisation de goto est déconseillée.

...

Espace de noms

L'espace de noms pour la classe "'. $ ExceptionClassName.'" N'est pas spécifié.

...

Membre de classe privée

Membre de classe privé détecté.

...

Var

Membre de classe privé détecté.

...

Performance

Nombre de collections

Chargement inutile d'une collecte de données Magento. Utilisez plutôt la méthode getSize ().

FetchAll

fetchAll () peut être inefficace en mémoire pour les grands ensembles de données.

...

GetFirstItem

getFirstItem () ne limite pas le résultat du chargement de la collection à un élément.

Boucle

Fonction de calcul de la taille du tableau% s détectée dans la boucle

Méthode LSD du modèle% s détectée dans la boucle

Méthode de chargement de données% s détectée dans la boucle

protected $countFunctions = array(
    'sizeof',
    'count'
);
protected $modelLsdMethods = array(
    'load',
    'save',
    'delete'
);

Sécurité

Acl

Manque la méthode ACL% s () dans la classe% s.

const PARENT_CLASS_NAME = 'Mage_Adminhtml_Controller_Action';
const REQUIRED_ACL_METHOD_NAME = '_isAllowed';

...

Fonction découragée

public $forbiddenFunctions = array(
    '^is_dir' => null,
    '^is_file$' => null,
    '^pathinfo$' => null,
);

...

Fonction interdite

public $forbiddenFunctions = array(
    '^assert$' => null,
    '^bind_textdomain_codeset$' => null,
    '^bindtextdomain$' => null,
    '^bz.*$' => null,
    '^call_user_func$' => null,
    '^call_user_func_array$' => null,
    '^chdir$' => null,
    '^chgrp$' => null,
    '^chmod$' => null,
    '^chown$' => null,
    '^chroot$' => null,
    '^com_load_typelib$' => null,
    '^copy$' => null,
    '^create_function$' => null,
    '^curl_.*$' => null,
    '^cyrus_connect$' => null,
    '^dba_.*$' => null,
    '^dbase_.*$' => null,
    '^dbx_.*$' => null,
    '^dcgettext$' => null,
    '^dcngettext$' => null,
    '^dgettext$' => null,
    '^dio_.*$' => null,
    '^dirname$' => null,
    '^dngettext$' => null,
    '^domxml_.*$' => null,
    '^exec$' => null,
    '^fbsql_.*$' => null,
    '^fdf_add_doc_javascript$' => null,
    '^fdf_open$' => null,
    '^fopen$' => null,
    '^fsockopen$' => null,
    '^ftp_.*$' => null,
    '^fwrite$' => null,
    '^gettext$' => null,
    '^gz.*$' => null,
    '^header$' => null,
    '^highlight_file$' => null,
    '^ibase_.*$' => null,
    '^id3_set_tag$' => null,
    '^ifx_.*$' => null,
    '^image.*$' => null,
    '^imap_.*$' => null,
    '^ingres_.*$' => null,
    '^ircg_.*$' => null,
    '^ldap_.*$' => null,
    '^link$' => null,
    '^mail$' => null,
    '^mb_send_mail$' => null,
    '^mkdir$' => null,
    '^move_uploaded_file$' => null,
    '^msession_.*$' => null,
    '^msg_send$' => null,
    '^msql$' => null,
    '^msql_.*$' => null,
    '^mssql_.*$' => null,
    '^mysql_.*$' => null,
    '^odbc_.*$' => null,
    '^opendir$' => null,
    '^openlog$' => null,
    '^ora_.*$' => null,
    '^ovrimos_.*$' => null,
    '^parse_ini_file$' => null,
    '^parse_str$' => null,
    '^parse_url$' => null,
    '^parsekit_compile_string$' => null,
    '^passthru$' => null,
    '^pcntl_.*$' => null,
    '^posix_.*$' => null,
    '^pfpro_.*$' => null,
    '^pfsockopen$' => null,
    '^pg_.*$' => null,
    '^php_check_syntax$' => null,
    '^popen$' => null,
    '^print_r$' => null,
    '^printf$' => null,
    '^proc_open$' => null,
    '^putenv$' => null,
    '^readfile$' => null,
    '^readgzfile$' => null,
    '^readline$' => null,
    '^readlink$' => null,
    '^register_shutdown_function$' => null,
    '^register_tick_function$' => null,
    '^rename$' => null,
    '^rmdir$' => null,
    '^scandir$' => null,
    '^session_.*$' => null,
    '^set_include_path$' => null,
    '^set_ini$' => null,
    '^set_time_limit$' => null,
    '^setcookie$' => null,
    '^setlocale$' => null,
    '^setrawcookie$' => null,
    '^shell_exec$' => null,
    '^sleep$' => null,
    '^socket_.*$' => null,
    '^stream_.*$' => null,
    '^sybase_.*$' => null,
    '^symlink$' => null,
    '^syslog$' => null,
    '^system$' => null,
    '^touch$' => null,
    '^trigger_error$' => null,
    '^unlink$' => null,
    '^vprintf$' => null,
    '^mysqli.*$' => null,
    '^oci_connect$' => null,
    '^oci_pconnect$' => null,
    '^quotemeta$' => null,
    '^sqlite_popen$' => null,
    '^time_nanosleep$' => null,
    '^base64_decode$' => null,
    '^base_convert$' => null,
    '^basename$' => null,
    '^chr$' => null,
    '^convert_cyr_string$' => null,
    '^dba_nextkey$' => null,
    '^dns_get_record$' => null,
    '^extract$' => null,
    '^fdf_.*$' => null,
    '^fget.*$' => null,
    '^fread$' => null,
    '^fflush$' => null,
    '^get_browser$' => null,
    '^get_headers$' => null,
    '^get_meta_tags$' => null,
    '^getallheaders$' => null,
    '^getenv$' => null,
    '^getopt$' => null,
    '^headers_list$' => null,
    '^hebrev$' => null,
    '^hebrevc$' => null,
    '^highlight_string$' => null,
    '^html_entity_decode$' => null,
    '^ibase_blob_import$' => null,
    '^id3_get_tag$' => null,
    '^import_request_variables$' => null,
    '^ircg_nickname_unescape$' => null,
    '^ldap_get_values$' => null,
    '^mb_decode_mimeheader$' => null,
    '^mb_parse_str$' => null,
    '^mcrypt_decrypt$' => null,
    '^mdecrypt_generic$' => null,
    '^msg_receive$' => null,
    '^ngettext$' => null,
    '^ob_get_contents$' => null,
    '^ob_get_flush$' => null,
    '^rawurldecode$' => null,
    '^shm_get_var$' => null,
    '^stripcslashes$' => null,
    '^stripslashes$' => null,
    '^token_get_all$' => null,
    '^unpack$' => null,
    '^convert_uudecode$' => null,
    '^iconv_mime_decode$' => null,
    '^iconv_mime_decode_headers$' => null,
    '^iconv_mime_encode$' => null,
    '^iconv_set_encoding$' => null,
    '^php_strip_whitespace$' => null,
    '^addcslashes$' => null,
    '^addslashes$' => null,
    '^escapeshellarg$' => null,
    '^escapeshellcmd$' => null,
    '^gettype$' => null,
    '^var_dump$' => null,
    '^tempnam$' => null,
    '^realpath$' => null,
    '^linkinfo$' => null,
    '^lstat$' => null,
    '^stat$' => null,
    '^lchgrp$' => null,
    '^lchown$' => null,
    '^show_source$' => null,
    '^is_executable$' => null,
    '^is_link$' => null,
    '^is_readable$' => null,
    '^is_writable$' => null,
    '^is_writeable$' => null,
    '^is_uploaded_file$' => null,
    '^glob$' => null,
    '^ssh2_.*$' => null,
    '^delete$' => null,
    '^file.*$' => null,
);

Inclure un fichier

Instruction "% s" détectée. Les manipulations de fichiers sont déconseillées.

... L'instruction n'est pas une fonction, aucune parenthèse n'est requise.

... Il est interdit de passer des URL.

... La concaténation est interdite.

... Les variables à l'intérieur ne sont pas sécurisées.

public $urlPattern = '#(https?|ftp)://.*#i';

...

Construction de langage

Utilisation incorrecte de la constante de chaîne de guillemets inversés. Les guillemets arrière doivent toujours être à l'intérieur des chaînes.

L'utilisation de la construction de langage% s est déconseillée.

    return array(
        T_EXIT,
        T_ECHO,
        T_PRINT,
        T_BACKTICK
    );

...

Superglobal

Utilisation directe de% s Superglobal détectée.

public $superGlobalErrors = array(
    '$GLOBALS',
    '$_GET',
    '$_POST',
    '$_SESSION',
    '$_REQUEST',
    '$_ENV'
);
public $superGlobalWarning = array(
    '$_FILES',
    '$_COOKIE',
    '$_SERVER',
);

Sql

Requête brute

Instruction SQL brute possible% s détectée

public $statements = array(
    'SELECT',
    'UPDATE',
    'INSERT',
    'CREATE',
    'DELETE',
    'ALTER',
    'DROP'
);
public $queryFunctions = array(
    'query',
    'raw_query'
);

...

Requête lente

Instruction SQL lente possible% s détectée

Détection possible d'une méthode SQL lente% s

public $adapterMethods = array(
    'group',
    'having',
    'distinct',
    'addLikeEscape',
    'escapeLikeValue',
    'union',
    'orHaving',
);
public $rawStatements = array(
    'GROUP BY',
    'HAVING',
    'DISTINCT',
    'LIKE',
    'UNION',
);

...

Cordes

RegEx

Expression régulière exécutable possible dans% s. Assurez-vous que le motif ne contient pas de modificateur "e"

public $functions = array(
    'preg_replace',
);

...

Concat String

Utilisation de l'opérateur + pour concaténer deux chaînes détectées

...

Position de la chaîne

L'opérateur identique === n'est pas utilisé pour tester la valeur de retour de la fonction% s

public $functions = array(
    'strpos',
    'stripos',
);

Questions et réponses connexes pour les

sv3n
la source
LOL à propos de ce post, vous avez écrit presque un doc :)
PЯINCƏ
@Prince quelqu'un d'autre pourrait aider un peu à compléter ceci: P
sv3n
Je ne pense pas :)
PЯINCƏ
une alternative pour stripcslashes ()? @ sv3n merci pour ces questions et réponses de description :)
Keyur Shah
@KeyurShah Non. Ignorez l'avertissement ou essayez d'éviter "avant" :) Dans quel cas l'utilisez-vous? Peut-être ajouter ceci comme question?
sv3n

Réponses:

6

Fonction interdite

le fichier existe()

L'utilisation de la fonction file_exists () est interdite

Incorrect:

if (!file_exists($filePath)) {
    ...
}

correct:

$io = new Varien_Io_File();
if (!$io->fileExists($filePath)) {
    ...
}

ou

$validatorNot = new Zend_Validate_File_NotExists($path);
if ($validatorNot->isValid($file)) {
    ...
}
sv3n
la source
5

GetFirstItem

getFirstItem () ne limite pas le résultat du chargement de la collection à un élément.

Incorrect:

$collection = Mage::getModel('catalog/category')
    ->load(41)
    ->getProductCollection()
    ->addAttributeToSelect('weight');

$product = $collection->getFirstItem();
$weight  = $product->getData('weight');

correct:

Appliquer la limite avant de récupérer les données.

$collection->getSelect()->limit(1)

ou

$collection->setPageSize(1, 1)

Exemples:

Collection avec 750 produits ...

Sans limiter avant:

  • Total incl. Temps de mur (microsec): 2,116,522 microsecs
  • Total incl. CPU (microsecs): 2,101,688 microsecs
  • Total incl. MemUse (octets): 4 783 504 octets
  • Total incl. PeakMemUse (octets): 4 363 112 octets
  • Nombre d'appels de fonction: 104 187

Avec l'aide getSelect()->limit(1):

  • Total incl. Durée du mur (microsecondes): 149 803 microsecondes
  • Total incl. CPU (microsecs): 131,405 microsecs
  • Total incl. MemUse (octets): 2 384 840 octets
  • Total incl. PeakMemUse (octets): 1 827 112 octets
  • Nombre d'appels de fonction: 5 327

Avec l'aide setPageSize(1, 1)

  • Total incl. Temps de mur (microsec): 155,025 microsecs
  • Total incl. CPU (microsecs): 136,191 microsecs
  • Total incl. MemUse (octets): 2,413,128 octets
  • Total incl. PeakMemUse (octets): 1 856 064 octets
  • Nombre d'appels de fonction: 5 515

Remarque:

Cet avertissement apparaîtra toujours, même si vous limitez votre collection auparavant. Pour vous débarrasser de ce message, utilisez $collection->getLastItem()plutôt.

sv3n
la source
Je reçois Data access method LIMIT detected outside of Resource Modellorsque j'utilise limite`
Amit Patel
1
Voici plus de détails
Amit Patel
5

Fonction interdite

curl_xyz

L'utilisation des fonctions curl_init (), curl_setopt (), curl_exec (), curl_close () est interdite

Incorrect:

$ch = curl_init();
curl_setopt($connection, CURLOPT_HTTPHEADER, $header);
curl_setopt($connection, CURLOPT_POSTFIELDS, $request);
curl_setopt($connection, CURLOPT_URL, $url);
$response = curl_exec($ch);
curl_close($ch);

correct:

$options = array(
    CURLOPT_HTTPHEADER => $header,
    CURLOPT_POSTFIELDS => $request
);

$curl = new Varien_Http_Adapter_Curl();
$curl->setOptions($options);
$curl->write(Zend_Http_Client::GET, $url, Zend_Http_Client::HTTP_0);
$response = $curl->read();
$responseBody = Zend_Http_Response::extractBody($response);
$curl->close();
sv3n
la source
J'ai utilisé le code ci-dessus et cela me donne une erreur Uncaught Error: Class 'Custom\Rma\Helper\Varien_Http_Adapter_Curl' not found. Comment utiliser la classe je l'ai trouvée chez le vendeur mais pas de chance.
Nitin Pawar
@NitinPawar pouvez-vous s'il vous plaît ouvrir une nouvelle question? Quelque chose semble mal avec votre code.
sv3n