ASP.NET Платежная форма Требуется руководство - PullRequest
3 голосов
/ 13 октября 2010

Ребята, прошу прощения, если вопрос менее организован и менее понятен. Я тороплюсь: (

В моем веб-приложении есть форма оплаты, которую необходимо отправить на другую страницу ASP.NET (назовем ее http://vendor.com/getpay.aspx) находится на другом сервере.

Эта страница выполнит некоторые мумбо-юмбо-работы, а затем перенаправит их на текущий сайт платежного шлюза.

Когда я публикую свою платежную форму в getpay.aspx через простую HTML-форму, она работает и перенаправляет нормально.

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

  1. Мне нужно, чтобы скрытые входы формы были серверными элементами управления, чтобы я мог связать некоторые значения, сгенерированные моим кодом (я думаю, я могу сделать это как классический способ asp с использованием <% =%>, но это похоже на обратно в стандарт!)
  2. Я попробовал HttpWebRequest в приведенном ниже коде, он публикует форму, но браузер не перенаправляет на страницу Платежного шлюза.
  3. Я публикую информацию о платеже не по протоколу https, как я могу предотвратить вмешательство пользователя в опубликованные данные?.
  4. Я хочу проверить форму оплаты в бэкэнде, а затем опубликовать ее, я не могу доверять введенным пользователем данным.
  5. Также результат был возвращен на мою страницу перенаправления с добавленными строками запроса. Это также происходит через не https. насколько я могу доверять этим данным перенаправления?

Большое спасибо

1 Ответ

3 голосов
/ 13 октября 2010

Создайте форму, очистив Ответ и переписав HTML-форму HTTP в очищенный ответ.Когда я вернусь домой, я переберу свой старый код и приведу пример.

РЕДАКТИРОВАТЬ: ОК, вот мой код, мне пришлось воссоздать, потому что я все еще на работе, но он выглядит примерно так:

Создайте промежуточную страницу для захвата ваших переменных со страницы ASPX и затем используйте ее для отправки в виде «простой» формы:

        protected void Page_Load(object sender, EventArgs e)
        {

            // Capture the post to this page
            IDictionary<string, string> variables = new Dictionary<string, string>();

            variables.Add("test", Request.Form["test"]); // collect all variables after checking they exist

            RewriteContent(variable);
        }

        public void RewriteContent(IDictionary<string, string> variables)
        {
            string formContent = @"
    <html>
        <head>
            <title>My Form</title>
        </head>
        <body>
            <form action='' method=''>";

            foreach (KeyValuePair<string, string> keyVal in variables)
            {
                formContent += @"<input type='" + keyVal.Key + "' value='" + keyVal.Value + "' />";
            }

        formContent += @"
            </form>
        </body>
    </html>"; // Add either an auto post in a javascript or an explicit submit button

            Response.Clear();
            Response.Write(formContent);
            Response.Flush();
            Response.End();
        }

РЕДАКТИРОВАТЬ 2: Извините, я только что понял, что не ответил надругие вопросы.

Q3 / Q4 / Q5.Если вы не используете https, вы не можете остановить фальсификацию или быть уверенным, что ответ правильный, но вы можете ограничить вероятность того, что это фальшивка.Это может быть достигнуто путем хеширования значений с помощью секретного ключа, который совместно используется на вашем конце и в пункте назначения, а затем, когда вы получите ответ, вы должны хешировать значения и сравнить с хешем, который вам отправляется, прежде чем вы примете, что этодействительный.

Большинство механизмов оплаты проверяются таким образом, обычно с помощью хэша MD5 или SHA1, дополнительную информацию можно найти по следующим ссылкам:

http://msdn.microsoft.com/en-us/library/system.security.cryptography.sha1.aspx http://www.developerfusion.com/code/4601/create-hashes-md5-sha1-sha256-sha384-sha512/ http://snippets.dzone.com/posts/show/5816

РЕДАКТИРОВАТЬ 3: Делая некоторое шифрование сейчас и думал, что я поделюсь с вами некоторым кодом (потому что я такой хороший).Может дать вам представление о том, что делать, и вы, вероятно, сможете писать лучше, чем я, поэтому просто приведите в порядок мой беспорядок:)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using log4net;

namespace MyCompany.Cipher
{
    private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

    public string GenerateSha1HashForString(string valueToHash, EncodeStyle encodeStyle)
    {
        string hashedString = string.Empty;

        try
        {
            hashedString = SHA1HashEncode(Encoding.UTF8.GetBytes(valueToHash), encodeStyle);
        }
        catch (Exception ex)
        {
            if (log.IsErrorEnabled) { log.Error(string.Format("{0}\r\n{1}", ex.Message, ex.StackTrace)); }
            throw new Exception("Error trying to hash a string; information can be found in the error log", ex);
        }

        return hashedString;
    }

    private string ByteArrayToString(byte[] bytes, EncodeStyle encodeStyle)
    {
        StringBuilder output = new StringBuilder(bytes.Length);

        if (EncodeStyle.Base64 == encodeStyle)
        {
            return Convert.ToBase64String(bytes);
        }

        for (int i = 0; i < bytes.Length; i++)
        {
            switch (encodeStyle)
            {
                case EncodeStyle.Dig:
                    //encode to decimal with 3 digits so 7 will be 007 (as range of 8 bit is 127 to -128)
                    output.Append(bytes[i].ToString("D3"));
                    break;
                case EncodeStyle.Hex:
                    output.Append(bytes[i].ToString("X2"));
                    break;
            }
        }

        return output.ToString();
    }

    private string SHA1HashEncode(byte[] valueToHash, EncodeStyle encode)
    {
        SHA1 a = new SHA1CryptoServiceProvider();
        byte[] arr = new byte[60];
        string hash = string.Empty;

        arr = a.ComputeHash(valueToHash);
        hash = ByteArrayToString(arr, encode);

        return hash;
    }
}

Поместите его в класс, где ваш проект сможет увидеть, и онможет создать хеш SHA1 на основе строкового значения, вызвав открытый метод.

...