Понимание структуры Json, созданной службой WCF с поддержкой AJAX - PullRequest
1 голос
/ 24 октября 2010

Добрый день

В Visual Studio 2010 я могу добавить в свое решение новый элемент под названием Служба WCF с поддержкой AJAX .Это добавит новый файл .svc.

Позже я создал метод только для целей отладки:

[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class DataAccessService
{
    [WebGet]
    [OperationContract]
    public MyClass DoWork()
    {
        var o = new MyClass
        {
            Id = 1,
            FirstName = "Junior",
            LastName = "Mayhe"
        }; 
        return o;
    }
}

При отладке здесь получается строка Json:

{"d":
    {"__type":"MyClass:#MyProject",
    "Id":1,
    "FirstName":"Junior",
    "LastName":"Mayhe"
    }
}

Вопрос в том, чтоэто "d"?Это какой-то код типа результата для строки Json, и если да, есть ли другие коды?

заранее спасибо

Ответы [ 2 ]

1 голос
/ 25 октября 2010

Это всего лишь "d", и оно предназначено для защиты от некоторых межсайтовых скриптовых атак.

например. рассмотрим метод, который возвращает массив конфиденциальных данных int (например, остатки на банковских счетах). Может быть возвращено как:

[10000,12300,15000]

Или:

{"d":[10000,12300,15000]}

Проблема в том, что в первом случае (очень продвинутая и неясная, но тем не менее реальная) атака, при которой другой сайт может украсть эти данные, включив вызов службы в тег и переопределив конструктор массива JavaScript. Атака невозможна, если JSON выглядит как последний случай.

В Microsoft были некоторые разговоры о расширении формата за пределы "d", но я не думаю, что он когда-либо шел.

0 голосов
/ 24 октября 2010

Ваш ответ просто инкапсулируется с родительским объектом с именем "d".Он был представлен в веб-службах ASP.NET 3.5 в качестве повышения безопасности для предотвращения взлома JSON.

Клиентские прокси, сгенерированные для вашего сервиса, уберут "d", так что вы никогда даже не узнаете, что он там был.Но поскольку ваша служба на самом деле не будет использоваться для чего-либо, кроме запросов AJAX, вам придется обращаться к вашим объектам JSON через свойство ".d".Я бы порекомендовал использовать JSON2 для анализа ответа, поскольку на момент написания этой статьи не все браузеры имели встроенную поддержку JSON.

Вы можете прочитать немного больше о проблеме безопасности здесь .

...