Mot-clé - mysql

Fil des billets

mardi, 5 décembre 2017

RedBeanPHP, un ORM

RedBeanPHPRedBeanPHP est un ORM (Object-Relational Mapping), c'est-à-dire un  type de programme informatique qui se place en interface entre un programme applicatif et une base de données relationnelle pour simuler une base de données orientée objet (définition Wikipédia). RedBeanPHP permet d'interagir avec MySQL, PostgreSQL et SQlite. Parmi les ORM PHP les plus connus, on connaît entre autres Doctrine et Eloquent.

Installation

Pour l'installation de RedBeanPHP, rien de plus simple : il convient de télécharger le dossier compressé le plus récent, qui correspond au SGBDR que vous souhaitez utiliser. Ensuite, déposez le dans votre projet web en cours, et appelez-le dans les fichiers où des interactions avec la base de données sont nécessaires.


// ENTER.PHP

require_once('inc/rb.php');

Ensuite, effectuez la connexion à votre base de données dans un fichier tiers que vous appellerez derrière la ligne de code précitée.

require_once('inc/database.php');

// DATABASE.PHP

// effectuer la connexion
R::setup('mysql:host=localhost;dbname=chat_id','root','');

// vérifier la connexion
$isConnected = R::testConnection();
     if($isConnected !== true) {
       $_SESSION['message'] = "La connexion est inopérante";
       header('location:index.php');
     }

Pensez à installer également l'extension mbstring pour que l'installation fonctionne - à activer sous un Wamp via les paramètres, et à installer sous un Lamp comme suit :


sudo apt install php7.2-mbstring
sudo service apache2 restart

Ceci fait, si votre base de données est déjà créée, le CRUD (create, retrieve, update, delete) peut commencer.


CRUD

Create (INSERT)


// Attention, pour que les insertions passent, l'extension mbstring doit être installée.
$users = R::dispense('users');

$users->login = $user;
$users->password = $password;
$users->email = $email;

$id = R::store($users);

Retrieve (SELECT)

getAll, getRow, getCol génèrent des tableaux ; find, findAll, findMulti des objets.

// Recherche de toutes les données de la table 
$users = R::getAll('SELECT * FROM users');

// Recherche d'une ligne de données spécifique dans la base de données
$user = R::getRow('SELECT * FROM users WHERE login = :login', [':login' => $user]);

// Recherche d'une colonne spécifique
$onoff = R::getCol( 'SELECT onoff FROM onoff WHERE id = :id', [ ':id' => 1 ] );

// Recherche de données correspondant à une requête précise
$questions_user = R::getAll( 'SELECT id,titre FROM questions WHERE user_id = :user_id AND suite = :suite', [ ':user_id' => $user_id, ':suite' => 0 ] );

// Recherche de toutes les données de la table 
$articles = R::findAll('articles', ' ORDER BY date DESC');

// Recherche de données correspondant à une requête précise 
$articles = R::find('articles', 'statut = ?  ORDER BY date DESC', array('1'));

// Compter toutes les valeurs de la table :
$numOfUsers = R::count( 'users' );

// Compter toutes les valeurs répondant à un critère précis
$numOfUsers = R::count( 'users','login = ?', [$user] ); // Compter le nombre de fois qu'est reprise la valeur spécifiée dans la table

// Compter toutes les valeurs répondant à plusieurs critères
$nb_questions_base = R::getCol( 'SELECT count(id) FROM questions WHERE user_id = :user_id AND suite = :suite', [ ':user_id' => $user_id, ':suite' => 0 ] );

// Jouer sur les paramètres descendant, ascendant, et la limite de résultat attendue
$statut_suite = R::getCol( 'SELECT state FROM questions WHERE suite = :suite ORDER BY id DESC LIMIT 1', [ ':suite' => $id_question ] );

Update (UPDATE)


$users = R::load( 'users', $user_id );

$users->mode_reponse = $mode_reponse_set;
R::store($users)

Delete (DELETE)


$table = R::load($_POST['table'], $_POST['id_mot']);
R::trash($table); //for one bean
R::trashAll($table);

Sources

dimanche, 22 novembre 2015

Renforcer la sécurité d’un site ou une appli web

alt="StickOfCelery (Deviantart) - SQL Wifejection"

Ci-après, les développeurs web et webmestres trouveront une liste sélective et concise ((Pour plus d'informations, consulter les sources au bas de l'article.)) de pratiques et recommandations permettant de renforcer la sécurité des sites et applications web. Le respect de ces principes ne suffit pas (un hackeur vaillant obtient souvent ce qu'il convoite), mais permet à tout le moins de ne pas laisser la porte grand ouverte...

CMS, forums, frameworks et autres outils "prêts à l'emploi"

  • Mise à jour constante de l'outil et de ses plugins / librairies.
  • Éviter de préfixer les tables avec leurs abréviations habituelles (wp_ pour Wordpress, jml_ pour Joomla, etc.).
  • Cacher autant que possible l'outil utilisé, en particulier dans la barre d'adresse.

.htaccess

Attention, le .htaccess est sensible ! Il convient de faire des sauvegardes du fichier au préalable, de tester une modification à la fois, et de veiller au fonctionnement de l'intégralité du système après avoir opéré chaque changement. L'altération du .htaccess mène vite à une "Internal server error" (500).

  • Register_globals à 0 / OFF / False pour empêcher l'accès aux superglobales telles que $_POST, $_GET, etc.
  • Interdiction de lister le contenu des dossiers et d'accéder à des fichiers spécifiques (éviter impérativement de faire ceci dans le fichier robots.txt qui passe plus volontiers en clair !)
  • Utilisation de la dernière version de PHP.

Fichiers et dossiers

  • CHMOD : Attribution de permissions d'accès restrictives aux dossiers (705/755) et fichiers (604/644) présents sur le FTP, dans la mesure du possible. Accès encore plus restrictif aux fichiers principaux tels que l'index du site et le style CSS (404/444).
  • Emploi de noms surprenants ((Cela va un peu à contre-sens des préceptes liés au code "propre" et aux lois du référencement, mais les robots spammeurs seraient paramétrés pour visiter des adresses comprenant certains termes.)) en particulier pour les pages qui comprennent des formulaires : éviter login, admin, contact, etc. (cela vaut également pour les attribut "name" des inputs : éviter name, (e)mail, subject, etc.).

Mots de passe

  • Les bons mots de passe comprennent au minimum 8 caractères, et présentent des lettres, des chiffres ainsi que des caractères spéciaux.
  • Scrupuleusement veiller à utiliser des mots de passe différents pour le FTP, la base de données, l'administration du site, l'authentification, etc.

Identifiants

  • Les CMS proposent souvent "admin" ou "administrateur" en guise d'identifiant. À éviter.
  • Éviter l'ID 1 pour l'administrateur.

Base de données et requêtes SQL

Cryptage

Pour un hashage sûr – de mots de passe en particulier –, préférer password_hash() et crypt() à MD5, SHA1 et SHA256.

  • Crypter le fichier de configuration ((Sécurité supplémentaire par rapport au CHMOD, au .htaccess qui en réduit l'accès et à l'extension .php qui ne permet pas d'afficher le fichier en texte brut.)).
  • Crypter les mots de passe.
  • Crypter les adresses e-mail.

Sessions

Plusieurs techniques permettent de prévenir les détournements de sessions :

  • Lier une adresse IP à une session peut-être une bonne pratique, à condition que les utilisateurs n'utilisent pas un logiciel comme Tor pour préserver leur anonymat :
$ IP = getenv ("REMOTE_ADDR");
  • Invalider l'ID de session après connexion de l'utilisateur (ou même après chaque demande) avec session_regenerate_id ().
  • Attribuer des tokens lors de la complétion des formulaires (ne jamais stocker les tokens dans des cookies !)

Vérification et validation

⚠ Principe fondamental : NE JAMAIS faire confiance aux données saisies par l'utilisateur ((Retenez que les fichiers, valeurs de session, données des cookies et données provenant de services tiers sont aussi des entrées étrangères !)).

  • Vérifier l'origine (émetteur) pour les envois de messages.
  • Vérifier le typage de ce qui est envoyé (is_string, is_int, is_bool, is_array...).
  • Vérifier si le contenu est autorisé (in_array).
  • Pour les comparaisons, recourir à l'identité (===) et non à l'égalité (==).
  • Limiter le nombre de caractères des données envoyées (varchar (x) et validation).
  • Échapper les contenus pour éviter les balises – <script> et <iframe> en particulier –, ainsi que ces signes ((Pour ce faire, abuser des fonctions PHP htmlentities, htmlspecialchars, strip_tags, addslashes et dérivées et/ou utiliser des RegExp. Attention, la fonction mysql_real_escape_string n'est visiblement pas sûre !)) :
< > : ; " ' & $ ! ? ~ ^ | @ # ( ) [ ] { }  _ - / \

php.ini

Moult paramètres peuvent être modifiés de manière à rendre le site plus opaque et plus sécure :

display_errors = Off
display_startup_errors = Off
error_reporting = E_ALL
log_errors = On
disable_functions

Toutefois, certains hébergements ne permettent pas de modifier ce fichier. Le .htaccess peut y subvenir en tout ou partie.

Surveillance

Les logs permettent de retracer les événements qui ont eu lieu sur le site ou l'application en ligne. Il peut s'avérer nécessaire de les analyser de temps en temps. Il est primordial d'y revenir après un désastre.

Tester la vulnérabilité de vos sites


Sources

mercredi, 15 janvier 2014

Requêtes en MySQL

mysqll.png

 

Affectation des entités de la DB

CREATE   DATABASE nomDB  /  TABLE nomTable

USE    nomDB

ALTER     DATABASE nomDB  /  TABLE nomTable
ADD COLUMN “nom colonne” [TYPE] AFTER “colonne préexistante”;

DROP       DATABASE nomDB  /  TABLE nomTable

Affectation des données de la DB

INSERT   INTO table
VALUES
(valeur1, valeur2, valeur3),
(valeur1, valeur2, valeur3);

INTO table (colonne1, colonne2)* VALUES (valeur1, valeur2)
* spécifier quels champs doivent être complétés

UPDATE  nomTable  SET colonne1=“valeur1”, colonne2=“valeur2”
WHERE colonne=“valeur”
LIMIT X (pour ne modifier pas davantage que X valeurs dans la table)

DELETE  FROM nomTable
WHERE colonne=“valeur”
LIMIT X (pour ne supprimer pas davantage que X valeurs dans la table)

TRUNCATE TABLE nomTable

Extraction des données :

SELECT  * (all)  / colonne AS “nom colonne”
DISTINCT(colonnes)
CONCAT(colonne1, ‘  ’ , colonne2)
CONCAT_WS(‘  ’, colonne1, colonne2)
LOWER(colonne1), UPPER(colonne2)
SUBSTRING(colonne1, 1, 1)
AVG – MAX – MIN – SUM – COUNT(colonne)

FROM     table [AS] nomTable
LIMIT X (nombre de lignes) / LIMIT X,Y (depuis ligne X*, sur Y lignes ; *1re=0)

WHERE   [condition]
colonne1 [NOT] IN (valeur x, valeur y, valeur z)
colonne BETWEEN ‘X’ AND ‘Y’
colonne LIKE ’%X%’
’%#_%’ ESCAPE ’#’

EXTRACT(year / month / day FROM colonne)
NOT(valeur x)
colonne, CASE colonne
WHEN valeur X THEN X
WHEN valeur Y THEN Y
colonne1.id = colonne2.id    [équijointure]
nomTable1.colonne_id = nomTable2.colonne_id

GROUP BY colonne

HAVING   sum(colonne) / sum(colonne) > X

ORDER BY colonne1, colonne2 ASC / DESC

Jointures

SELECT … FROM    tableGauche
INNER JOIN  /  LEFT-RIGHT-FULL OUTER JOIN  / NATURAL JOIN  / CROSS JOIN  /  UNION JOIN    tableDroite
ON     condition [critère de jointure]

 


 

Sources

Enregistrer