Member 11589429 Ответов: 3

Как определить, что пользователь отправляет одну и ту же строку запроса более одного раза в url-адресе


Вот мой пример страницы сайта.Я даю этот url-адрес(Api) другим :

http://localhost:someport/Test.aspx?name=pinky&SId=123& PhoneNo=XXXX

На этой странице я обрабатываю qurystring следующим образом

if (Request.QueryString["name"] != null)
{
   Name = Request.QueryString["name"].ToString();                               
}


Другие могут сделать запрос/позвонить на мою страницу из своего программного обеспечения.Некоторое время они могут передавать одну и ту же строку запроса более двух раз.Подобный этому

http://localhost:someport/Test.aspx?name=pinky&SId=123&PhoneNo=XXXX&SId=43


На моей странице

String SId = "";
 if (Request.QueryString["SId"] != null)
    {
       SId= Request.QueryString["SId"].ToString();                               
    }

SId= "123,43";   


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

1 & gt; Как определить, присутствует ли строка запроса более одного раза. 2 & gt; Если имя пользователя pass = pinky& rani,моя страница поднимает только pinky.

Как обрабатывать?

Что я уже пробовал:

String SId = "";
 if (Request.QueryString["SId"] != null)
    {
       SId= Request.QueryString["SId"].ToString();                               
    }

SId= "123,43"; 

3 Ответов

Рейтинг:
2

Richard Deeming

Вместо того чтобы проверять наличие специальных символов, которые могли бы законно появиться внутри значения, проверьте количество разнесенных значений:

string[] ids = Request.QueryString.GetValues("SId");
if (ids == null)
{
    // The user didn't provide any values for the "SId" parameter.
}
else if (ids.Count != 1)
{
    // The user provided more than one value for the "SId" parameter.
}
else
{
    SId = ids[0];
}


F-ES Sitecore

Как бы выглядел параметр запроса, если бы запятая была фактической частью данных, а не обозначала, что данные имеют несколько значений?

Richard Deeming

Что-то вроде: ?q=x,y&q=z

Request.QueryString["q"] = "x,y,z";
Request.QueryString.GetValues("q") = { "x,y", "z" };

F-ES Sitecore

По какой-то причине я думал, что браузер смешал значения вместе независимо от того, откуда я взял эту идею. +5 за то, что научил меня чему-то новому, однако если вы знаете, что запятой не будет, то проверка ее существования все равно более эффективна, даже если она "менее правильна".

Richard Deeming

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

public String this[String name]
{
    get { return Get(name); }
    set { Set(name, value); }
}

public virtual String Get(String name) 
{
    ArrayList values = (ArrayList)BaseGet(name);
    return GetAsOneString(values);
}

private static String GetAsOneString(ArrayList list) 
{
    int n = (list != null) ? list.Count : 0;
    if (n == 1) 
    {
        return (String)list[0];
    }
    else if (n > 1) 
    {
        StringBuilder s = new StringBuilder((String)list[0]);
        for (int i = 1; i < n; i++) 
        {
            s.Append(',');
            s.Append((String)list[i]);
        }
        
        return s.ToString();
    }
    else 
    {
        return null;
    }
}

То GetValues метод просто копирует значения в массив:
public virtual String[] GetValues(String name) 
{
    ArrayList values = (ArrayList)BaseGet(name);
    return GetAsStringArray(values);
}

private static String[] GetAsStringArray(ArrayList list)
{
    int n = (list != null) ? list.Count : 0;
    if (n == 0) return null;
    
    String [] array = new String[n];
    list.CopyTo(0, array, 0, n);
    return array;
}

Источник[^]

F-ES Sitecore

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

Richard Deeming

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

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

Это, вероятно, не будет очень заметно, но это, конечно, не будет более эффективным, чем использование GetValues.

F-ES Sitecore

Я рассчитал его время, и он вышел быстрее, чтобы проверить наличие запятой, возможно, в конечном итоге это сделал прирост эффективности StringBuilder над строковым массивом (SB будет выделять память только один раз, а не один раз на элемент массива, предполагая, что мы не имеем дело с огромными строковыми параметрами)

Richard Deeming

Это кажется странным, но я думаю, что они оптимизировали StringBuilder для такого рода вещей. :)

Рейтинг:
2

F-ES Sitecore

Когда значение появляется более одного раза, когда вы его запрашиваете, оно разделяется запятыми, так что просто ищите запятую

if (Request.QueryString["id"].IndexOf(',') != -1)
{
    // show message
}


Рейтинг:
0

Karthik_Mahalingam

попробовать это

string queryString = Request.QueryString.ToString();
         bool isMoreThan1 = queryString.Split(new string[] { "SId=" }, StringSplitOptions.RemoveEmptyEntries).Length > 1;