Я разработал решение грубой силы.Обратите внимание, что я прекрасно понимаю, что это взлом.Но я застрял в ситуации необходимости обходить другой код, над которым у меня нет контроля.
По сути, я создал обработчик ONSUBMIT, который проверяет форму для повторяющихся скрытых полей и проверяет, что онивсе заполнены правильными данными.Похоже, это гарантирует, что строка POST содержит данные независимо от того, как форма отображается, и серверная часть Java, кажется, тоже довольна ею.
Я проверял это в следующих ситуациях:
- Код генерирует отдельные экземпляры скрытых полей (что иногда случается)
- Код генерирует несколько экземпляров скрытых полей
- Код не создает экземпляров скрытых полей (что должно никогда не случиться, но эй ...)
Мое условие 'else' содержит чуть-чуть магии MooTools, но в остальном это просто.
Может быть, кто-то найдет это полезным однажды ...
Спасибо за помощь!
<form method="post" name="loginform" id="loginform" action="/login" onsubmit="buildDeviceFP(this);">
<script type="text/javascript">
function insertFieldValues( fields, sValue )
{
if ( 'length' in fields )
{
// We got a collection of form fields
for ( var x = 0; x < fields.length; x++ ) {
fields[x].value = sValue;
}
}
else
{
// We got a single form field
fields.value = sValue;
}
}
function buildDeviceFP( oForm )
{
// Get the element collections for Device Fingerprint & Language input fields from the form.
var devicePrintElmts = oForm.elements.deviceprint;
var languageElmts = oForm.elements.language;
// 'devicePrintElmts' & 'languageElmts' *should* always exist. But just in case they don't...
if ( devicePrintElmts) {
insertFieldValues( devicePrintElmts, getFingerprint() );
} else if ( oForm.deviceprint ) {
oForm.deviceprint.value = getFingerprint();
} else {
$('logonbox').adopt(
new Element( 'input', {'type':'hidden', 'name':'deviceprint', 'value':getFingerprint()} )
);
}
if ( languageElmts) {
insertFieldValues( languageElmts, getLanguage() );
} else if ( oForm.language ) {
oForm.language.value = getLanguage();
} else {
$('logonbox').adopt(
new Element( 'input', {'type':'hidden', 'name':'language', 'value':getLanguage()} )
);
}
}
</script>