2013-05-14 2 views
2

У меня есть немного смешная проблема, и я уверен, что другие здесь найдут легко решить. Мне нужно хэш всей строки запроса, а затем включить это значение хеша в данные сообщения.Javascript post data order

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

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

Любая идея, что я могу сделать неправильно, или как я могу гарантировать, что порядок элементов одинаковый как при построении строки, так и в представлении?

Соответствующий фрагмент кода:

var allFormDat = document.getElementById("frmPayment").elements; 
var hashingString =''; 
var hashVal; 
for (i=0;i<allFormDat.length;i++) { 
    if (allFormDat[i].className!="nohash"){ 
     hashingString+=allFormDat[i].name+'='+allFormDat[i].value+'&'; 
    } 
} 
hashingString.substring(0, hashingString.length - 1); 
hashingString += '[salt]'; 

hashVal=SHA1(hashingString); 
frm.hashValue.value=hashVal; 

document.getElementById('frmPayment').submit(); 
+0

Можете ли вы подробно рассказать о каких (запутывающих) результатах, которые вы видите? Кроме того, пока вы на нем, вы можете легко добавить проверку в цикле, чтобы 'if (i === length - 1)' вы не добавляете '&'; таким образом вам не придется вынимать его из строки, когда вы закончите. –

+0

Конечно, две основные вещи, я думаю. Когда я удаляю данные сообщения, хеш-значение находится в середине строки (в то время как скрытый элемент находится в самом конце представленной формы), а значение хэша не совпадает, когда я беру эти данные и sha1 его внешне .. – bjm

+1

Ах, спасибо за идею на чеке. Это чувствовалось ужасно kludgy .. – bjm

ответ

1

Прежде всего, вы не URI-кодирующие компоненты. Вы, вероятно, следует:

var field = allFormDat[i]; 
hashingString += encodeURIComponent(field.name) + '=' 
       + encodeURIComponent(field.value) + '&'; 

substring не работает на месте. Вам нужно будет переподключить:

hashingString = hashingString.substring(0, hashingString.length - 1);