Перенаправление с данными поста - БЕЗ строки запроса

Я пытаюсь отправить данные в платежный шлюз WorldPay. В настоящее время я делаю это (успешно), создавая строку запроса (идентификатор платежа, сумма, данные клиента и т. д.) и объединяя их с базовым URL-адресом WorldPay, например:

https://secure-test.worldpay.com/wcc/purchase?instId=12345&testMode=100&amount=999

... и выполнение стандартного Response.Redirect([выше_url]).

Это работает, как и предполагалось, но я обеспокоен тем, что раскрытие этой информации в строке запроса, вероятно, побудит людей атаковать ее (например, изменение ключа «количество», скажем, на «1»!).

Примеры WorldPay доходят только до предоставления базовой HTML-формы, но, поскольку данные отправляются с использованием этого метода, вышеуказанная проблема никогда не возникает. К сожалению, мне нужно выполнить некоторую предварительную обработку (обновление статуса заказа и т. д.) ПЕРЕД перенаправлением пользователя в WorldPay для завершения платежа, поэтому мне остается задаться вопросом, можно ли это сделать программно?

Я подозреваю, что пытаюсь сделать то же самое, что и this вопрос: Программно перенаправить пользователя на сайт WorldPay, передав все необходимые детали платежа, не раскрывая значения строки запроса.

Это возможно?


person Nick H    schedule 06.02.2015    source источник
comment
Вы можете создать форму динамически с помощью метода = 'post' и всех параметров в виде скрытых полей. И отправить эту форму   -  person husnain_sys    schedule 06.02.2015
comment
@NickH Насколько я понимаю, это зависит от того, что может понять эта внешняя служба (в вашем случае WorldPay). Если у него есть возможность считывать значения сообщений формы, вы определенно можете подготовить данные POST и перенаправить.   -  person Siva Gopal    schedule 06.02.2015


Ответы (1)


Служба поддержки WorldPay предоставила мне решение. Копаясь в их источнике, я вижу, что они делают то, что [я подозреваю] предлагал husnain_sys:

            var formBuilder = new StringBuilder();
        formBuilder.AppendLine("<html><head>");
        formBuilder.AppendLineFormat("</head><body onload=\"document.{0}.submit()\">", formName);
        formBuilder.AppendLineFormat("<form name=\"{0}\" method=\"{1}\" action=\"{2}\" >", formName, Method.ToString(), Url);
        for (int i = 0; i < _inputValues.Keys.Count; i++) {
            formBuilder.AppendLineFormat("<input name=\"{0}\" type=\"hidden\" value=\"{1}\">", 
                HttpUtility.HtmlEncode(_inputValues.Keys[i]), HttpUtility.HtmlEncode(_inputValues[_inputValues.Keys[i]]));
        }
        formBuilder.AppendLine("</form>");
        formBuilder.AppendLine("</body></html>");

        _httpContext.Response.Clear();
        _httpContext.Response.Write(formBuilder.ToString());
        _httpContext.Response.End();

Это все еще выглядит как взлом (конечно, перенаправление не должно выполняться через JS?), Но что ж, это работает! Спасибо, парни. Надеюсь, это поможет кому-то другому.

person Nick H    schedule 06.02.2015