Получение ошибки Запись успешно обновлена. Неустранимая ошибка: необработанная ошибка: вызов функции-члена fetch_assoc () в массиве. - PullRequest
0 голосов
/ 02 марта 2019
<?php 

    getdata();

    function getdata(){     
        $server="";
        $dbHost = "localhost";
        $dbDatabase = "h_php";
        $dbPasswrod = "";
        $dbUser = "root";
        $mysqli = new mysqli($dbHost, $dbUser, $dbPasswrod, $dbDatabase);
        // Check connection
        if ($mysqli->connect_error) {
            die("Connection failed: " . $mysqli->connect_error);
        } 
        $sql = "SELECT * from items";
        $result = mysql_query($query);      
        if(!$result) die("Oh crap...: " . mysql_error());
        $rows = mysql_num_rows($result);
        for ($j = 0 ; $j <= $rows; $j++)
        {
            $row = mysql_fetch_row($result);                
            $row[1]= $server;
            $command = "nslookup ".$server;
                exec($command, $result);
                $nslookup_result="";
                foreach($result as $line){
                $nslookup_result.= $line."<br> ";   
                }
            updatenslookup($server,$nslookup_result);
        }
        $mysqli->close();   
    }   

    function updatenslookup($url,$nsresult) {
        // Create connection
        $dbHost = "localhost";
        $dbDatabase = "h_php";
        $dbPasswrod = "";
        $dbUser = "root";
        $mysqli = new mysqli($dbHost, $dbUser, $dbPasswrod, $dbDatabase);
        // Check connection
        if ($mysqli->connect_error) {
            die("Connection failed: " . $mysqli->connect_error);
        } 
        $updatesql = "UPDATE `items` SET `description`='".$nsresult."' WHERE `title` ='".$url."'";

        if ($mysqli->query($updatesql) === TRUE) {
            echo "Record updated successfully";

        } else {
            echo "Error updating record: " . $mysqli->error;
        }

        $mysqli->close();

    }
?>

1 Ответ

0 голосов
/ 02 марта 2019

Этот бит не имеет смысла для меня:

 function getdata(){     
    $server="";  //<---------- set here
    $dbHost = "localhost";
    $dbDatabase = "h_php";
    $dbPasswrod = "";
    $dbUser = "root";
    $mysqli = new mysqli($dbHost, $dbUser, $dbPasswrod, $dbDatabase);
    // Check connection
    if ($mysqli->connect_error) {
        die("Connection failed: " . $mysqli->connect_error);
    } 
    $sql = "SELECT * from items";
    $result = mysql_query($query);      
    if(!$result) die("Oh crap...: " . mysql_error());
    $rows = mysql_num_rows($result);
    for ($j = 0 ; $j <= $rows; $j++)
    {
        $row = mysql_fetch_row($result);                
        $row[1]= $server;  //<---- sure you want to do this
        //your basically setting $row[1] = '' on every iteration
        //so your command below is "nslookup " because $server = ''

        $command = "nslookup ".$server;
            exec($command, $result);
            $nslookup_result="";
            foreach($result as $line){
            $nslookup_result.= $line."<br> ";   
            }
        updatenslookup($server,$nslookup_result);
    }
    $mysqli->close();   
}   

Мне кажется, что этот бит $row[1]= $server; задом наперед.

Но давайте не будем забывать о проблемах SQLInjection здесь:

 function updatenslookup($url,$nsresult) {
    // Create connection
    $dbHost = "localhost";
    $dbDatabase = "h_php";
    $dbPasswrod = "";
    $dbUser = "root";
    $mysqli = new mysqli($dbHost, $dbUser, $dbPasswrod, $dbDatabase);
    // Check connection
    if ($mysqli->connect_error) {
        die("Connection failed: " . $mysqli->connect_error);
    } 
    $updatesql = "UPDATE `items` SET `description`='".$nsresult."' WHERE `title` ='".$url."'";

    if ($mysqli->query($updatesql) === TRUE) {
        echo "Record updated successfully";

    } else {
        echo "Error updating record: " . $mysqli->error;
    }

    $mysqli->close();

} 

В частности, этот материал:

 function updatenslookup($url,$nsresult) {
    //  ....
    $updatesql = "UPDATE `items` SET `description`='".$nsresult."' WHERE `title` ='".$url."'";
   //  ....
 }

Большая проблема в том, что я могу вставить в таблицу все, что захочу, затем вы берете эти данные и стреляете прямо в

  exec("nslookup ".$row[1], $result); //simplified  $server = $row[1] + exec("nslookup ".$server)

Так что теоретически я могу (или могу быть в состоянии) вводить свои собственные вызовы командной строки в exec, по крайней мере, до некоторой степени.Я не уверен, что все, что кто-то может сделать с этими проблемами, каков будет худший случай, но я бы в любом случае избегал этого.

У меня нет возможности узнать, где находятся данные для updatenslookup($url,$nsresult) приходит или если он чистый, но это не имеет значения.Одна из причин, по которой нужно подготовить sql, заключается в том, чтобы иметь защищенное право в том случае, если проблема заключается в том, чтобы вы могли четко определить, просто посмотрев на запрос, является ли он безопасным или нет.И вам не нужно беспокоиться об отсутствии некоторой части данных, которые могли бы проникнуть туда.

Вы должны использовать escapeshellarg как минимум и устранить уязвимости SQL, подготовивзапросы.

Что касается этого Call to a member function fetch_assoc() on array, я даже не вижу в вашем коде вызова fetch_assoc().Может быть, я пропустил это, но все, что я вижу, это $row = mysql_fetch_row($result); для чтения данных, что является процедурным, когда вы используете ООП в другом коде.что раздражает ... но я понимаю, вот почему я сейчас использую только PDO ...

и т. д.

Я всегда чувствую себя плохо, когда делаю чью-то тяжелую работу, но ябыло бы упущением не упомянуть такую ​​большую дыру в безопасности.

Приветствия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...