服务器中的SQL注入

我们对代码进行了安全审计,他们提到我们的代码容易受到SQL注入攻击。

解释 - server_processing.php的下面代码($ rResult = mysql_query($ sQuery,$ gaSql ['link'])或die(mysql_error());)会调用使用来自不可信源的输入构建的SQL查询。 此调用可能允许攻击者修改语句的含义或执行任意的SQL命令。

/*
     * SQL queries
     * Get data to display
     */
    $sQuery = "
        SELECT SQL_CALC_FOUND_ROWS ".str_replace(" , ", " ", implode(", ", $aColumns))."
        FROM   $sTable
        $sWhere
        $sOrder
        $sLimit
    ";
    **$rResult = mysql_query( $sQuery, $gaSql['link'] ) or die(mysql_error());**

在以下情况下会发生SQL注入错误:1.数据从不受信任的源进入程序。 2.数据用于动态构建SQL查询。

示例:以下代码动态构造并执行一个SQL查询,该查询搜索与指定名称匹配的项目。 该查询将显示的项目限制为所有者与当前通过身份验证的用户的用户名相匹配的项目。 ...

$userName = $_SESSION['userName'];
$itemName = $_POST['itemName'];
$query = "SELECT * FROM items WHERE owner = '$userName' AND itemname = '$itemName';";
$result = mysql_query($query);

...此代码打算执行的查询如下所示:

SELECT * FROM items
WHERE owner = <userName>
AND itemname = <itemName>;

但是,由于查询是通过连接常量查询字符串和用户输入字符串动态构造的,因此只有在itemName不包含单引号字符的情况下,该查询才能正确运行。 如果具有用户名wiley的攻击者为itemName输入字符串“name”或“a”=“a”,则查询变为以下内容:

SELECT * FROM items
WHERE owner = 'wiley'
AND itemname = 'name' OR 'a'='a';

OR'a'='a'条件的添加会导致where子句始终评估为true,因此查询在逻辑上等同于更简单的查询:

SELECT * FROM items;

查询的简化允许攻击者绕过查询只返回经过身份验证的用户拥有的项目的要求; 该查询现在返回存储在商品表中的所有条目,而不管其指定的所有者。

所以我们在下面的code-

  • Filtering-

    $ sWhere =“”; if(isset($ _GET ['sSearch'])&& $ _GET ['sSearch']!=“”){$ sWhere =“WHERE(”; for($ i = 0; $ i $ sWhere。= $ aColumns [ '$'i。“LIKE'%”。mysql_real_escape_string($ _GET ['sSearch'])。“%'OR”;} $ sWhere = substr_replace($ sWhere,“”,-3); $ sWhere。=')' ;}

  • SQL查询 -

    $ sQuery =“SELECT SQL_CALC_FOUND_ROWS”.str_replace(“,”,“”,implode(“,”,$ aColumns))“FROM $ sTable $ sWhere $ sOrder $ sLimit”; $ rR​​esult = mysql_query($ sQuery,$ gaSql ['link'])或die(mysql_error());

  • Ordering-

    $ sOrder =“”; if(isset($ _GET ['iSortCol_0'])){$ sOrder =“ORDER BY”; 对于($ i = 0; $ iGET ['bSortable'.intval($ GET ['iSortCol'。$ i])] ==“true”){ $ sOrder。= $ aColumns [intval($ GET ['iSortCol' 。$ i])]。“”.mysql_real_escape_string($ GET ['sSortDir'。$ i])。“,”; }}

    $sOrder = substr_replace( $sOrder, "", -2 );
    if ( $sOrder == "ORDER BY" )
    {
        $sOrder = "";
    }
    

    }

  • Paging-

    $ sLimit =“”; if(isset($ _GET ['iDisplayStart'])&& $ _GET ['iDisplayLength']!='-1'){$ sLimit =“LIMIT”.mysql_real_escape_string($ _GET'iDisplayStart'])“,”.mysql_real_escape_string ($ _GET'iDisplayLength']); **}

  • 5-单独的列过滤 -

        for ( $i=0 ; $i<count($aColumns) ; $i++ )
        {
            if ( isset($_GET['bSearchable_'.$i]) && $_GET['bSearchable_'.$i] == "true" && $_GET['sSearch_'.$i] != '' )
            {
                if ( $sWhere == "" )
                {
                    $sWhere = "WHERE ";
                }
                else
                {
                    $sWhere .= " AND ";
                }
                **$sWhere .= $aColumns[$i]." LIKE '%".mysql_real_escape_string($_GET['sSearch_'.$i])."%' ";**
            }
        }
    

    请帮助我如何删除我的代码中的SQL注入。

    任何人都可以帮助我失去东西的地方? 任何人帮助表示赞赏!


    您可以用双单引号替换每个单引号。

    $itemName = str_replace("'","''",$name);
    

    如果你无法做出任何重大改变,这将会在一个紧要关头。 虽然之前的评论是正确的。 最好的方法是使用参数化查询。

    链接地址: http://www.djcxy.com/p/93465.html

    上一篇: SQL Injection in server

    下一篇: How to detect SQL Injection sitting at a reverse proxy?