Безопасность WCF - список того, что я не понимаю

Я написал эту небольшую функцию несколько лет назад:

function sqlvprintf($query, $args)
{
    global $DB_LINK;
    $ctr = 0;
    ensureConnection(); // Connect to database if not connected already.
    $values = array();
    foreach ($args as $value)
    {
        if (is_string($value))
        {
            $value = "'" . mysqli_real_escape_string($DB_LINK, $value) . "'";
        }
        else if (is_null($value))
        {
            $value = 'NULL';
        }
        else if (!is_int($value) && !is_float($value))
        {
            die('Only numeric, string, array and NULL arguments allowed in a query. Argument '.($ctr+1).' is not a basic type, it\'s type is '. gettype($value). '.');
        }
        $values[] = $value;
        $ctr++;
    }
    $query = preg_replace_callback(
        '/{(\\d+)}/', 
        function($match) use ($values)
        {
            if (isset($values[$match[1]]))
            {
                return $values[$match[1]];
            }
            else
            {
                return $match[0];
            }
        },
        $query
    );
    return $query;
}

function runEscapedQuery($preparedQuery /*, ...*/)
{
    $params = array_slice(func_get_args(), 1);
    $results = runQuery(sqlvprintf($preparedQuery, $params)); // Run query and fetch results.   
    return $results;
}

Это позволяет запускать операторы в однострочном C # -ish String.Format, например:

runEscapedQuery("INSERT INTO Whatever (id, foo, bar) VALUES ({0}, {1}, {2})", $numericVar, $stringVar1, $stringVar2);

Он избегает использования типа переменной. Если вы попытаетесь параметризовать имена таблиц и столбцов, это будет терпеть неудачу, поскольку она помещает каждую строку в кавычки, которая является недопустимым синтаксисом.

ОБНОВЛЕНИЕ БЕЗОПАСНОСТИ: предыдущая версия str_replace разрешала инъекции, добавляя токены {#} в пользовательские данные. Эта версия preg_replace_callback не вызывает проблем, если замена содержит эти токены.

24
задан Cœur 15 April 2017 в 17:15
поделиться

2 ответа

Я не знаю все ответы, но здесь являюсь теми, я действительно знаю

  1. , транспортная безопасность означает, что коммуникация шифруется, в то время как сообщение транспортируется так, это нельзя считать и или вмешаться. Безопасность сообщения означает, что содержание самого сообщения шифруется, транспорт однако не обязательно. Безопасность сообщения может, например, использоваться с HTTP, в то время как транспортная безопасность потребовала бы использования HTTPS (или другая привязка).
  2. принципал IPrincipal = Поток. CurrentPrincipal;
  3. никакой ответ
  4. Да, хотя сам SSL использует сертификаты, это не то же. Вы можете сделать, чтобы клиент отправил сертификат, который известен сервису или который подписывается доверенными полномочиями, к которым знает сервис, кто клиент и позволить ли им выполнять вызов или нет. Используя SSL только гарантирует, что третьи лица не могут считать коммуникацию между клиентом и сервисами путем прерывания сетевых пакетов.
  5. принципал IPrincipal = Поток. CurrentPrincipal; принципал. Идентификационные данные. Имя;
    • у Вас нет Ни одного, Транспорта, сообщение и Смешанная безопасность как Ваши опции однако Транспортная безопасность потребует вызова конечной точки с помощью HTTPS, так как это - защищенная версия протокола
    • РЕДАКТИРОВАНИЕ: Проверьте обсуждение в этот форум .

И вопросы, конечно, не глупы.

P.S. Я могу рекомендовать книгу , программируя сервисы WCF Juval Lowy, который это действительно подробно и идет с действительно полезной платформой, расширяющей WCF/Simplifying определенные вещи.

15
ответ дан olle 29 November 2019 в 00:22
поделиться

Выезд Руководство по безопасности WCF. При необходимости в большей информации необходимо быть в состоянии найти все это там, его довольно полное. Хотя похоже, что @olle дал довольно полный ответ....

4
ответ дан AviD 29 November 2019 в 00:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: