2011-07-23 5 views
4

Je veux stocker des articles dans une base de données, mais je n'arrive pas à trouver beaucoup d'informations sur la meilleure façon de le faire, d'après ce que j'ai lu il semble partagé entre la plupart des gens. Beaucoup de gens vont suggérer un moyen et d'autres vont souligner les problèmes d'injection de SQL, et je n'arrive pas à trouver beaucoup de choses sur ce sujet qui est assez nouveau.La meilleure façon de stocker des articles dans une base de données? (php et sql)

Voici le code html d'un article:

<div id="main"> 

     <article> 

      <header> 
       <h3> Title </h3> 
       <time pubdate="pubdate"> 2011-07-22 </time> 
      </header> 

      <p> Article Text </p> 

     </article> 

    </div> 

Idéalement, je pense que ce serait préférable de stocker le morceau de html constituant chaque article dans une base de données, mais il semble y avoir beaucoup de problèmes avec ce , et comme je l'ai dit je ne peux pas trouver beaucoup de messages sur ce sujet particulier, et comme quelqu'un de nouveau à PHP et bases de données, je veux obtenir des commentaires sur la meilleure façon de s'y prendre avant de continuer.

+0

Je ne comprends pas pourquoi les gens disent des problèmes d'injection SQL. Je pensais qu'avec les paramètres de liaison, ces types de problèmes sont la plupart du temps une chose du passé. Ai-je tort? – vol7ron

Répondre

0

magasin votre article TEXT :) Il suffit de passer à travers cette fonction php première pour prévenir les attaques d'injection:

// Prevent MySQL Injection Attacks 
function cleanQuery($string){ 
    if(get_magic_quotes_gpc()) // prevents duplicate backslashes 
     $string = stripslashes($string); 
    return mysql_escape_string($string); 
} 
+1

Mon conseil serait d'utiliser PDO => http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/. C'est plus sûr, plus rapide et très agréable si vous voulez tester votre base de données. Pour tester, il suffit d'utiliser SQLite en mode mémoire => new PDO ('sqlite :: memory:') – Alfred

1

Stockage dans une base de données SQL est très bien, mais vous pouvez et vous devez protéger contre l'injection SQL dans votre code.

Par exemple, nettoyer toutes les entrées utilisateur avant de les envoyer à la base de données.

PHP Manual on SQL injection

1

Je pense que la meilleure méthode consiste à stocker uniquement du texte pur, mais le plus souvent ce n'est pas le cas lorsque vous souhaitez utiliser la mise en forme supplémentaire. Vous pouvez convertir les balises html en bbcodes ou balises similaires qui peuvent empêcher l'injection de sql mais si vous échapper le contenu html, il serait aussi sûr que tout autre contenu. Faites aussi mysql_real_escape_string sur toutes les données que vous mettez dans la base de données et tout ira bien. Cependant, la meilleure pratique consiste à stocker le code html avec le texte de l'article en tant que fichier html que vous pouvez servir lorsque l'utilisateur demande les données mais dans la base de données vous pouvez simplement stocker du texte à des fins d'indexation et de recherche . C'est idéal car vous n'aurez pas besoin du contenu html pour effectuer des recherches de toute façon et cela empêchera également les attaques sql si le contenu est purement textuel et doit être stocké dans la base de données. Mais comme l'utilisateur demande le fichier obtenir le contenu du fichier html pour cet article qui contient le texte formaté et le servir.

2

Chaque fois que je stocke une grande quantité de texte utilisateur, je la base64, puis avant de l'afficher, assurez-vous de l'exécuter via htmlspecialchars, cela empêchera le html de fonctionner, donc htmlspecialchars(base64_decode($content)) fonctionnerait bien pour l'affichage.
Si vous utilisez le format bbcode pour le formatage, assurez-vous d'exécuter htmlspecialchars avant de commencer à formater votre code binaire.

Ce n'est pas la seule façon, vous pouvez désinfectez entrées sans base64'ng, mais je ne vois aucune raison de ne pas, surtout quand personne n'a besoin de voir directement dans la base de données.

1

utiliser lucene ou sphinx, soit à partir de Zend_Lucene ou à travers solr. ils feront l'indexation de l'article plus rapidement, et vous pouvez également faire une recherche en texte intégral sur eux aussi. L'utilisation de Lucene ou Solar pour indexer et rechercher dans ces cas est à peu près une procédure standard, et vous permettra d'évoluer vers des millions d'articles.

est un démon sphynx qui fonctionne « en parallèle » au démon mysql. pour l'utilisation du sphinx, vous pouvez utiliser l'extension pecl sphinx.Si vous voulez aller avec lucene, vous pouvez essayer zend_lucene ou solr, qui est en fait une distribution tomcat avec une webapp qui expose lucene comme un service web, de sorte que vous pouvez y accéder de manière standard, indépendamment de la langue .

en choisissant l'un d'eux est ok. vous pouvez indexer par texte complet (contenu) et catégories, ou tout ce dont vous avez besoin pour indexer.

1

Le moyen le plus sûr d'empêcher l'injection SQL est d'utiliser une instruction préparée.

$stmt = $con->prepare("INSERT INTO Articles (Title, Date, Article) VALUES (?, ?, ?)"); 
$stmt->bind_param("sss", $title, $currentDate, $articleBody); 

Les points d'interrogation représentent les valeurs que vous allez transmettre. "sss" dit que chacune des 3 variables sera une chaîne et ensuite vous pouvez appeler cette instruction préparée et lui passer les valeurs correctes. Cela garantira qu'aucun code SQL malveillant ne peut être injecté dans votre base de données.

espérons que cela aide!

Questions connexes