Недостающее переупорядочение байта при передаче данных

Различный порядок байтов хоста и сети

Описание

Недостающее переупорядочение байта при передаче данных происходит, когда вы не используете функцию порядка байтов:

  • Перед передающими данными к сетевому сокету.

  • После получения данных из сетевого сокета.

Риск

Некоторые архитектуры системы реализуют порядок байтов с прямым порядком байтов (младший значащий байт сначала), и другие системы реализуют обратный порядок байтов (старший значащий байт сначала). Если порядок байтов отправленных данных не совпадает с порядком байтов системы получения, значение, возвращенное, когда чтение данных является неправильным.

Фиксация

После получения данных из сокета используйте функцию порядка байтов, такую как ntohl(). Перед передающими данными к сокету используйте функцию порядка байтов, такую как htonl().

Примеры

развернуть все

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <byteswap.h>
#include <unistd.h>
#include <string.h>


unsigned int func(int sock, int server)
{
    unsigned int num;   /* assume int is 32-bits */
    if (server)
    {
        /* Server side */
        num = 0x17;
		/* Endianness of server host may not match endianness of network. */
        if (send(sock, (void *)&num, sizeof(num), 0) < (int)sizeof(num)) 
        {
            /* Handle error */
        }
        return 0;
    }
    else {
        /* Endianness of client host may not match endianness of network. */
        if (recv (sock, (void *)&num, sizeof(num), 0) < (int) sizeof(num))  
        {
            /* Handle error */
        }
		
		/* Comparison may be inaccurate */
        if (num> 255)  
        {
            return 255;
        }
        else
        {
            return num;
        }
    }
}
        
      

В этом примере переменная num присвоена шестнадцатеричное значение 0x17 и отправляется по сети клиенту с сервера. Если хост сервера является прямым порядком байтов, и сеть является обратным порядком байтов, num передается как 0x17000000. Клиент затем читает неправильное значение для num и сравнивает его с локальным числовым значением.

Исправление — использует функцию порядка байтов

Прежде, чем отправить num от хоста сервера, используйте htonl(), чтобы преобразовать от хоста до сетевого порядка байтов. Точно так же прежде, чем считать num на хосте клиента, используйте ntohl(), чтобы преобразовать от сети, чтобы разместить порядок байтов.

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <byteswap.h>
#include <unistd.h>
#include <string.h>

unsigned int func(int sock, int server)
{
    unsigned int num;   /* assume int is 32-bits */
    if (server)
    {
        /* Server side */
        num = 0x17;
		
		/* Convert to network byte order. */
        num = htonl(num); 
        if (send(sock, (void *)&num, sizeof(num), 0) < (int)sizeof(num)) 
        {
            /* Handle error */
        }
        return 0;
    }
    else {
        if (recv (sock, (void *)&num, sizeof(num), 0) < (int) sizeof(num)) 
        {
            /* Handle error */
        }
		
		/* Convert to host byte order. */
        num = ntohl(num); 
        if (num > 255) 
        {
            return 255;
        }
        else
        {
            return num;
        }
    }
} 

Информация о результате

Группа: Программирование
Язык: C | C++
Значение по умолчанию: 'off'
Синтаксис командной строки: MISSING_BYTESWAP
Влияние: носитель
ID CWE: 188, 198

Введенный в R2017b