2010-11-22 68 views
1

SQL注入我有一些PHP脚本,我认为这有很多的错误。因为我在串联和SQL注入方面的知识有限。第一次我没有任何麻烦,因为这个脚本使用PHP-Mysql。

但是在我尝试更换Interbase后,我遇到了很多麻烦。 请帮助找出我的错。

这个我下面的查询:

$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]; 

笔记:我需要更多地了解concatenation.thanks的进步。


错误:

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

工作原理:你问一个具体的问题,并得到一个具体的答案。如何不起作用:你要求人们做你的工作。 – zerkms 2010-11-22 02:13:34

+1

附加说明:了解SQL注入攻击。此代码对他们开放很多。 – David 2010-11-22 02:14:08

+1

这里有什么问题吗?你有错误吗? – 2010-11-22 02:14:12

回答

-1

我发现从AndreKR的指导下回答:

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

和更改所有$ _ POST:

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

和变化:

$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] 

,并添加在最后的PHP页面:

ibase_free_result($aResultTotal); 
?> 
3

看起来好像它可以运行,所以如果它失败,请说明如何。

有,然而,一个立即可见的错误在里面:在行

$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.')"; 

你开始用双引号的字符串并尝试中断与单引号,这是行不通的字符串。因此,代码必须是:

$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.")"; 

根据您的环境中除了有在代码中一个重要的安全缺陷:例如在线路

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

您使用$ _ POST直接把它转换为SQL查询,从而打开所谓的SQL注入安全漏洞。

+0

我得到了PHP注意:未定义的偏移量:0位于/var/www/html/showserial1.php,位于第164行,位于:$ iFilteredTotal = $ aResultFilterTotal [0]; – klox 2010-11-22 02:27:45

+0

防止SQL注入的更好方法是什么? – klox 2010-11-22 02:29:31

+1

由于在$ aResultFilterTotal中没有索引0,可能是因为您使用了'_fetch_assoc',因此它有一个名称(可能是“COUNT(*)”)而不是数字。 SQL注入的问题有点复杂,但是,一个好的开始是将每个变量的'addslashes()'包装到SQL查询中。 (让我们看看如果你发现自己哪些变量不能包装;)) – AndreKR 2010-11-22 02:37:53