Лучший способ защитить приложение Ajax

Вы забыли сообщить нам, является ли ваша последовательность model.Content.Children<NewsItem>() IEnumerable или IQueryable.

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

Если последовательность IEnumerable, я бы посоветовал создать класс Compare, который сделает сравнение за вас. Преимущество состоит в том, что если в будущем вы решите заказать по-другому, ваш LINQ не изменится. Недостаток: это не будет работать с базами данных (вот почему я спросил, было ли это IQueryable). Случай IEnumerable находится в конце.

IQueryable

IQueryable чаще всего используется, когда запрос должен быть выполнен другим процессом, таким как система управления базами данных. Поскольку это должно быть выполнено кем-то другим, функциональность ограничена довольно простыми функциями. В конце концов: вы могли бы создать VeryUsefulFunction(), но SQL этого не знает.

Если опубликованная дата не установлена, я хочу вместо этого упорядочить по дате создания

Поэтому нам нужно выбрать, где вы извлекаете OrderDate: или ОпубликованоDate или CreatedDate. После этого вы можете сделать заказ по OrderDate

var result = model.Content.Children<NewsItem>().Select(newsItem => new
{
    OrderDate = newsItem.PublishedDate ?? newsItem.CreatedDate,
    Item = newsItem,
})
.OrderBy(newsItem => newsItem.OrderDate)

// if desired, throw away the OrderDate:
.Select(newsItem => newsItem.Item)

Несколько LINQ-to-entity не примут оператор объединения нулей (??). В этом случае вы получите исключение во время выполнения. В этом случае вам нужно использовать троичный оператор (?:)

IEnumerable

Вы можете использовать код IQueryable также как Enumerable. Однако в этом случае вы бы смешали концепцию «более раннего newsItem» с вашей обработкой, сделав их менее читабельными, менее тестируемыми и менее изменяемыми. Например, если вам нужна концепция упорядочивания новостей снова и снова, вам придется скопировать и вставить этот код. Кроме того, если в будущем вы захотите упорядочить по-другому, например, упорядочить по длине новостного элемента, вам нужно будет найти и переписать все ваши операторы LINQ, которые упорядочивают новостные элементы.

Лучше было бы определить, какая новость предшествует другой новости. Для этого вы пишете класс, который реализует IComparer<NewsItem>.

class NewsItemComparer : IComparer<NewsItem>
{
    public static readonly IComparer<NewsItem> Default = new NewsItemComparer();
    private static readonly IComparer<DateTime> dateComparer = Comparer<DateTime>.Default;

    public int Compare(NewsItem x, NewItem y)
    {
        // TODO: decide what to do if x or y NULL: exception? first? last?

        return dateComparer.Compare(x.PublishedDate ?? x.CreatedDate,
                                    y.PublishedDate ?? y.CreatedDate);
    }
}

Использование:

var result = model.Content.Children<NewsItem>()
    .OrderBy(newsItem => newsItem, NewsItemComparer.Default);

Это выглядит намного лучше, чем помещение кода сравнения в ваш запрос. Если вы решите сравнивать по-другому, этот код и все другие, которые хотят сравнить ваши NewsItems, не изменятся. Даже довольно просто реализовать различные методы сравнения, например, по дате, по длине или по автору ...

13
задан user10520 23 September 2008 в 03:16
поделиться

6 ответов

Лично, я не нашел использование SSL для всего сайта (или большая часть из него), чтобы быть излишеством. Возможно, только что, когда скорости и подача были медленнее. Теперь я не смущался бы подвергать любую часть сайта под SSL.

, Если Вы решили, что использование SSL для всего сайта приемлемо, Вы могли бы рассмотреть просто использование старой "Стандартной аутентификации", куда сервер возвращается 401 ответ, который заставляет браузер запрашивать имя пользователя/пароль. Если Ваше приложение может жить с этим типом входа в систему, работает отлично для Ajax и всех других доступов к Вашему сайту, потому что браузер обрабатывает повторно отправляющие запросы с соответствующими учетными данными (и безопасно, если Вы используете SSL, но только , если Вы используете SSL - не используют Основного автора с плоскостью http!).

1
ответ дан 2 December 2019 в 02:18
поделиться

SSL - необходимость, предотвращая прозрачные соединения прокси, которые могли использоваться несколькими пользователями. Тогда я просто проверил бы входящий IP-адрес с тем, который аутентифицировался.

Повторно аутентифицируйте:

  • , как только IP-адрес изменяется
  • на времени, больше, чем n секунды без любого запроса
  • индивидуально на любой важной транзакции
1
ответ дан 2 December 2019 в 02:18
поделиться

Общее решение состоит в том, чтобы хешировать идентификатор сессии пользователя и передачу, которая в с каждым запросом для обеспечения запроса прибывает от действительного пользователя (см. этот слайд-шоу ). Это довольно безопасно от перспектива CSRF , но если бы кто-то осуществлял сниффинг данных, то это могло бы быть прервано. В зависимости от Ваших потребностей ssl всегда будет самым безопасным методом.

1
ответ дан 2 December 2019 в 02:18
поделиться

Ваш лучший выбор использует соединение SSL по ранее аутентифицируемому соединению с чем-то Apache и/или Tomcat. основанная на форме аутентификация в любой, с необходимым соединением SSL дает Вам безопасное соединение. Веб-приложение может тогда обеспечить безопасность и идентификационные данные для сессии, и клиентский Ajax не должен касаться безопасности.

0
ответ дан 2 December 2019 в 02:18
поделиться

Что, если Вы помещаете "сгенерированную" метку времени на каждый из ответов с сервера и приложения Ajax, могло всегда использовать cookie с последней меткой времени.

0
ответ дан 2 December 2019 в 02:18
поделиться

Вы могли бы попытаться читать книжную безопасность Ajax Billy Hoffman и Bryan Sullivan. Я нашел, что это изменило мой образ мыслей о безопасности. Существуют очень определенные предложения для каждой фазы Ajax.

0
ответ дан 2 December 2019 в 02:18
поделиться
Другие вопросы по тегам:

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