2010-11-22 5 views
1

J'ai un script PHP et je pense que cela a beaucoup d'erreur. en raison de mes connaissances limitées en concaténation et injection SQL. A la 1ère fois, je n'ai aucun problème car ce script utilise PHP-Mysql. Mais après avoir essayé de passer à Interbase, je rencontre beaucoup de problèmes. S'il vous plaît aider à identifier ma faute.

cette ma requête suivante:

$sLimit = ""; 
     if (isset($_POST['iDisplayStart'])) 
     { 
       $sLimit = " FIRST ".$_POST['iDisplayStart']." SKIP ".$_POST['iDisplayLength']; 
     } 
$sOrder =""; 
     $sOrder = " ORDER BY LINE_NAME "; 
$sWhere = ""; 
     if (postVar('sSearch') !="") 
     { 
       $sWhere = " WHERE (LINE_NAME LIKE '%".$_POST['sSearch']."%' OR 
           MODEL_ONLY LIKE '%".$_POST['sSearch']."%' OR ". 
           " VER_ONLY LIKE '%".$_POST['sSearch']."%' OR ". 
           " LOT_SIZE LIKE '%".$_POST['sSearch']."%' OR ". 
           " START_SERIAL LIKE '%".$_POST['sSearch']."%' OR ". 
           " SERIAL_NO_LOW LIKE '%".$_POST['sSearch']."%' OR ". 
           " SERIAL_NO_UP LIKE '%".$_POST['sSearch']."%' OR ". 
           " PROD_NO LIKE '%".$_POST['sSearch']."%' OR ". 
           " PROD_DATE LIKE '%".$_POST['sSearch']."%') "; 
     } 
$sQuery = "SELECT LINE_NAME, MODEL_ONLY, VER_ONLY, PROD_NO, 
        LOT_SIZE, START_SERIAL, SERIAL_NO_LOW, SERIAL_NO_UP, PROD_DATE 
      FROM DOC_TO".$sWhere.$sOrder.$sLimit.";"; 
$rResult = ibase_query($sQuery) or _doError(_ERROR30 . ' (<small>' . htmlspecialchars($sql) . '</small>): ' . ibase_errmsg()); 

$sQuery = "SELECT COUNT(*) FROM (SELECT LINE_NAME, MODEL_ONLY, VER_ONLY, PROD_NO, 
             LOT_SIZE, START_SERIAL, SERIAL_NO_LOW, SERIAL_NO_UP, PROD_DATE 
            FROM DOC_TO'.$sWhere.$sOrder.$sLimit.')"; 
$rResultFilterTotal = ibase_query($sQuery) or _doError(_ERROR30 . ' (<small>' . htmlspecialchars($sql) . '</small>): ' . ibase_errmsg()); 
$aResultFilterTotal = ibase_fetch_assoc($rResultFilterTotal); 
$iFilteredTotal = $aResultFilterTotal[0]; 

notes: je dois en savoir plus sur concatenation.thanks pour l'avance.


erreur:

Dynamic SQL Error SQL error code = -104 Token unknown - line 3, column 39 '.. ORDER BY LINE_NAME ..' 
+0

Comment SO fonctionne: vous posez une question spécifique et obtenez une réponse spécifique. Comment ça ne marche pas: vous demandez aux gens de faire votre travail. – zerkms

+1

Notes supplémentaires: Lire sur les attaques par injection SQL. Ce code leur est largement ouvert. – David

+1

Y a-t-il une question quelque part ici? Avez-vous une erreur? –

Répondre

-1

i ont trouvé la réponse de la direction de AndreKR:

$sLimit = ""; 
     if (isset($_POST['iDisplayStart'])) 
     { 
       settype($iDisplayStart,'integer'); 
       $iDisplayStart = $_POST['iDisplayStart']; 
       $iDisplayLength = $_POST['iDisplayLength']; 
       $sLimit = sprintf(" FIRST ".$iDisplayStart." SKIP ".$iDisplayLength); 
     } 

et changer tous les $ _POST:

'%".$_POST['sSearch_0']."%' 
into 
''%".$_POST['sSearch_0']."%'' //this to prevent injection For databases Like Oracle, DB2, MS SQL, Firebird 

et le changement:

$sQuery = "SELECT COUNT(*) FROM(......) 
into 
$sQuery = "SELECT COUNT(*) AS DCOUNT FROM DOC_TO".$sWhere.$sLimit.";"; //delete $sOrder 

$aResultFilterTotal = ibase_fetch_assoc($rResultFilterTotal); 
$iFilteredTotal = $aResultFilterTotal['DCOUNT']; //change from ......[0] 

et ajouter à la dernière page php :

ibase_free_result($aResultTotal); 
?> 
3

On dirait que cela pourrait fonctionner, si elle échoue s'il vous plaît décrire comment.

Il y a, cependant, une erreur immédiatement visible dans: dans les lignes

$sQuery = "SELECT COUNT(*) FROM (SELECT LINE_NAME, MODEL_ONLY, VER_ONLY, PROD_NO, 
             LOT_SIZE, START_SERIAL, SERIAL_NO_LOW, SERIAL_NO_UP, PROD_DATE 
            FROM DOC_TO'.$sWhere.$sOrder.$sLimit.')"; 

vous commencez une chaîne avec des guillemets doubles et vous essayez d'interrompre la chaîne avec des guillemets simples, qui ne fonctionnera pas. Ainsi, le code doit être:

$sQuery = "SELECT COUNT(*) FROM (SELECT LINE_NAME, MODEL_ONLY, VER_ONLY, PROD_NO, 
             LOT_SIZE, START_SERIAL, SERIAL_NO_LOW, SERIAL_NO_UP, PROD_DATE 
            FROM DOC_TO".$sWhere.$sOrder.$sLimit.")"; 

En fonction de votre environnement en plus il y a une importante faille de sécurité dans votre code: Par exemple, dans la ligne

$sLimit = " FIRST ".$_POST['iDisplayStart']." SKIP ".$_POST['iDisplayLength']; 

vous utilisez $ _POST pour le mettre directement dans une requête SQL, qui ouvre un trou de sécurité dit d'injection SQL.

+0

J'ai reçu PHP Note: Offset non défini: 0 dans /var/www/html/showserial1.php sur la ligne 164, à: $ iFilteredTotal = $ aResultFilterTotal [0]; – klox

+0

quelle meilleure façon d'empêcher cette injection SQL? – klox

+1

Cet avis est là parce qu'il n'y a pas d'index 0 dans $ aResultFilterTotal qui est probablement parce que vous avez utilisé '_fetch_assoc' donc il a un nom (" COUNT (*) "probablement) au lieu d'un nombre. La question de l'injection SQL est un peu plus compliquée, mais un bon début serait d'enrouler 'addslashes()' autour de chaque variable qui va dans une requête SQL. (Voyons voir si vous savez vous-même lesquelles de ces variables ne sont pas à envelopper.;)) – AndreKR