Шифрование идентификатора в URL в ASP.NET MVC

Измените ширину и высоту фильма:

Добавьте этот код в метод onDraw перед movie.draw

canvas.scale((float)this.getWidth() / (float)movie.width(),(float)this.getHeight() /      (float)movie.height());

или

canvas.scale(1.9f, 1.21f); //this changes according to screen size

Масштаб для заполнения и масштаб для соответствия:

Уже есть хороший ответ на этот вопрос:

https://stackoverflow.com/a / 38898699/5675325

11
задан Chuck Conway 22 May 2009 в 00:26
поделиться

5 ответов

Я написал в блоге сообщение об этой самой теме, включая полный исходный код.

Он позволяет вам шифровать и расшифровывать данные, хранящиеся в форме строки запроса, используя 16 char key:

Я нашел отличный набор базовых классов для решения этой проблемы, но в большинстве случаев часть сводится к одному классу. Для этого класса требуется 16-символьный ключ какое-то значение для шифрования и значение для шифрования. Вы также можете при необходимости установите срок действия.

using System.Collections.Specialized;
using System.Security;
using System.Text;
using System.Web;
using EncryptionMVC.Security.Encryption.Utility.Interfaces;
using EncryptionMVC.Security.Encryption.Utility;
namespace Security.Encryption.QueryString
{
    /// 
    /// Provides a secure means for transfering data within a query string.
    /// 
    public class SecureQueryString : NameValueCollection
    {

        private string timeStampKey = '__TS__';
        private string dateFormat = 'G';
        private IEncryptionUtility mEncryptionUtil;
        private DateTime m_expireTime = DateTime.MaxValue;

        /// 
        /// Creates an instance with a specified key.
        /// 
        /// The key used for cryptographic functions, required 16 chars in length.
        public SecureQueryString(string key) : base()
        {
            mEncryptionUtil = new EncryptionUtility(key);
        }

        /// 
        /// Creates an instance with a specified key and an encrypted query string.
        /// 
        /// The key used for cryptographic functions, required 16 chars in length.
        /// An encrypted query string generated by a  instance.
        public SecureQueryString(string key, string queryString) : this(key)
        {
            Deserialize(DecryptAndVerify(queryString));
            CheckExpiration();
        }

        /// 
        /// Returns a encrypted query string.
        /// 
        /// 
        public override string ToString()
        {
            return EncryptAndSign(Serialize());
        }

        private void Deserialize(string queryString)
        {
            string[] nameValuePairs = queryString.Split('&');
            for (int i = 0; i <= nameValuePairs.Length - 1; i++) {
                string[] nameValue = nameValuePairs(i).Split('=');
                if (nameValue.Length == 2) {
                    base.Add(nameValue(0), nameValue(1));
                }
            }

            if (base.GetValues(timeStampKey) != null) {
                string[] strExpireTime = base.GetValues(timeStampKey);
                m_expireTime = Convert.ToDateTime(strExpireTime(0));
            }
        }

        private string Serialize()
        {
            StringBuilder sb = new StringBuilder();
            foreach (string key in base.AllKeys) {
                sb.Append(key);
                sb.Append('=');
                sb.Append(base.GetValues(key)(0).ToString());
                sb.Append('&');
            }

            sb.Append(timeStampKey);
            sb.Append('=');
            sb.Append(m_expireTime.ToString(dateFormat));

            return sb.ToString();
        }

        private string DecryptAndVerify(string input)
        {
            return mEncryptionUtil.Decrypt(input);
        }

        private string EncryptAndSign(string input)
        {
            return mEncryptionUtil.Encrypt(input);
        }

        private void CheckExpiration()
        {
            if (DateTime.Compare(m_expireTime, DateTime.Now) < 0) {
                throw new ExpiredQueryStringException();
            }
        }

        /// 
        /// Gets or sets the timestamp in which this string should expire
        /// 
        public DateTime ExpireTime {
            get { return m_expireTime; }
            set { m_expireTime = value; }
        }
    }
}

Чтобы зашифровать какое-то значение и передать его другому действию в MVC, вы должны сделайте что-то вроде следующего.

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(FormCollection collection)
{
    SecureQueryString qs = new SecureQueryString(mKey);

    qs('YourName') = collection('name');
    qs.ExpireTime = DateTime.Now.AddMinutes(2);

    Response.Redirect('Home.aspx/About?data=' + HttpUtility.UrlEncode(qs.ToString()));
}

В действии, на которое мы выполняем перенаправление, вам понадобится то же самое ключ и само значение строки запроса для его расшифровки. Имейте в виду, что если у вас нет правильного ключа или вы пытаетесь расшифровать значение по истечении срока класс вызовет исключение.

public ActionResult About()
{
    if (Request('data') != null) {
        try {
            SecureQueryString qs = new SecureQueryString(mKey, Request('data'));

            ViewData('Message') = 'Your name is ' + qs('YourName');
        }
        catch (Exception ex) {

        }
    }
    return View();
}

Я не тратил много времени на подробное объяснение источника, потому что он так давно я это не написал. Также имейте в виду, что это было задолго до мои первые дни испытаний ... (но похоже, что он работает)

Как всегда, исходный код для этого образца доступен для загрузки.

7
ответ дан 3 December 2019 в 04:14
поделиться

Есть разница между шифрованием и кодированием; эти методы не предназначались для шифрования.

Поскольку шифрование трудно сделать правильно и невероятно легко ошибиться (хотя оно все еще выглядит таким же «зашифрованным», как и правильное решение), я рекомендую вам вместо этого использовать идентификаторы GUID:

http://www.calemadr.com/.../ {6F0184E4-809F-4e30-8A5B-4DC144135A54}

SQL-сервер имеет уникальный тип идентификатора только для этого случая.

2
ответ дан 3 December 2019 в 04:14
поделиться

Хммм ... Это, вероятно, не будет иметь никакого значения, но вы можете попробовать библиотеку AntiXSS и ее метод URLEncode ().

http://www.codeplex.com/AntiXSS

HTH, Чарльз

1
ответ дан 3 December 2019 в 04:14
поделиться

Я удивлен, что UrlEncode не работает. Как выглядит результат вашего шифрования?

После того, как вы зашифруете свой Guid, попробуйте кодировать его в Base64 с помощью метода Convert.ToBase64String . Затем UrlEncode строку Base64, чтобы сделать ее приемлемой строкой для включения в ваш URL.

1
ответ дан 3 December 2019 в 04:14
поделиться

Не знаю, имеет ли это для вас какое-то значение, но я решил эту проблему самостоятельно. Мне пришлось удвоить urlencode.

Например

Server.UrlEncode (Server.UrlEncode (строка для кодирования))

Проблема, похоже, в том, что Request.Querystring (закодированная строка) автоматически выполняет декодирование, которое завинчивает до шифрования. Хотел бы я объяснить получше, но я все еще немного запутался

1
ответ дан 3 December 2019 в 04:14
поделиться
Другие вопросы по тегам:

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