Автор Тема: Запомняне на паролата от web логин форма. Chrome?  (Прочетена 16479 пъти)

Naka

  • Напреднали
  • *****
  • Публикации: 3395
    • Профил
Имам следният проблем, който е от много време и не мога да го реша.
Имам обикновенна веб форма:

Код:
<form action="javascript:void(0);" method='POST' id='txtAuth' onsubmit='encryptData() >
<input type="text" name="user"  size="10" />
<input type="password" name="passwrd"  size="10" />
        <input type="submit" value="Вход" />
</form>

След събмит браузера обикновенно предлага да се запомни ли юзернема и паролата.
Обаче аз правя и някои 'фокуси' по формата с JS, преди събмита. И тук почват проблемите.
Лисицата работи идеално, а всички Хроме базирани браузери  не.  Хрома не предлага да се запомни паролата!!! Иначе всичко друго му работи.

Проблемът който го разбрах е фундаментален. Лисицата предлага запомняне на паролата преди Събмита. Лисицата не я интерсува какво правиш с формата по нататък, интересува я какво си въвел във формата.
А хрома работи различно. Хрома предлага запомняне на паролата след като е настъпил Събмита. ???

И понеже аз правя някои работи с формата преди събмита, то Хрома не предлага запомняне.
Идеии?
Няма ли някакъв JS метод с който може да се форсира запомняне на паролата от браузера. Идва ми на ума и друго нещо. Има два JS метода с които може да се запомнят данни на клиентският компютър.

https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API

Едното е sessionStorage - (да не се бърка със сесия!) и то трае докато има отворен браузер - след това се изтрива. Това очевидно не върши работа.

Другото е с localStorage. Това е перманенто и оцелява след затваряне на браузера. Но доколко това е правилно решение?
 

------
PS Не искам да го правя с https:// засега по различни причини. все още не му е дошло времето.


« Последна редакция: Mar 02, 2018, 17:23 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

4096bits

  • Напреднали
  • *****
  • Публикации: 6137
    • Профил
Не се занимавам с тези неща и каквото зная е почти от обща култура, но...

Запомнянето на паролата не е ли просто бизквитка без краен срок, която просто помни потребител и сумата на  паролата? Какво повече е нужно? В крайна сметка, към сайта не се изпраща самата парола и без туй.
Активен

As they say in Mexico, "Dasvidaniya!" Down there, that's two vidaniyas.

n00b

  • Напреднали
  • *****
  • Публикации: 1248
  • Distribution: OSX
  • Window Manager: 10.6, 10.8, 10.9
  • Live to hack, hack to live.
    • Профил
Ако си ми пред очите ще ти издърпам ушите.

Ето код:
<body>
    <form action="test.html" name="formlogin" id="formlogin">
        Username: <input type="text" name="username" id="username" />   
        Password: <input type="password" name="password" id="password"/>
        <input type="submit" name="Submit" value="Submit" />
    </form>
</body>
При това ще се покаже "запазването" защото имаш екшън и сочи към нещо.

Ако се налага да правиш корекция по формата - ето пример - onsubmit:
<form name="login_form" id="login_form" action="" method="POST" onsubmit="handleFunction('action_login', document.getElementById('user_name_id').value, document.getElementById('password_id').value); return false;">
    <div class="login_line">name<input name="user_name" id="user_name_id" size="16" maxlength="16" value="" type="text"></div>
    <div class="login_line">password<input name="password" id="password_id" size="16" maxlength="16" type="password"></div>
    <div class="login_line">&nbsp;<input class="icon icon_accept" value="login" type="submit"></div>
</form> <!-- login_form -->

Събмита можа да дрънне един false и да спре изпращането на формата. Виж си документацията.
Активен

mobilio - професионални мобилни приложения

Naka

  • Напреднали
  • *****
  • Публикации: 3395
    • Профил
Събмита можа да дрънне един false и да спре изпращането на формата. Виж си документацията.

Аз нарочно сложих <form action="javascript:void(0);" ..
За да съм абсолютно сигурен че няма да се събмитне в прав текст паролата (например към  <form action="test.html" ..) ако случайно не сработи onsubmit='encryptData()

Вътре в encryptData() в края и - да имам return false; но какво ще стане ако
в encryptData() ако някъде средата има например синтактична грешка? По спомени тогава не се стигаше до return false; и формата се събмитваше. ??? в encryptData() ползвам и чужд js код (за RSA) ...та и не съм много уверен какви ги върши. Сега не ми се ръчка пак работещ код пак да го пробвам....


В краен случай да и това е решение....Доста време съм я тествал работи вече 3 години и и хванах вяра.

въпрос:
има ли разлика между
Код:
<form.... onsubmit='encryptData(); return false;'>
и когато е само вътре  ???

Код:
<form.... onsubmit='encryptData();'>
function encryptData()
{
..
..
return false;
}
« Последна редакция: Mar 06, 2018, 11:05 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

n00b

  • Напреднали
  • *****
  • Публикации: 1248
  • Distribution: OSX
  • Window Manager: 10.6, 10.8, 10.9
  • Live to hack, hack to live.
    • Профил
onsubmit сработва на ниво форма. А има и глобален onsubmit който работи на ниво прозорец.

да - ако има грешка не сработва. В гитхъб има 100на кодове поне.

между двата НЯМА разлика.
Активен

mobilio - професионални мобилни приложения

remotexx

  • Напреднали
  • *****
  • Публикации: 3194
    • Профил
Има разлика колеги
желателно е винаги да се вика експлицитно (когато ст-та не зависи т.е. не се променя/наглася във функцията)  и не е само за четимост

т.е. това е винаги за предпочитане (ако се знае предварително какво искаме true/false)
onsubmit='encryptData(); return false;'
onsubmit='encryptData(); return true;'

защото функцията може да върне true/false но може и да върне undefined или exception и т.н.
а това е лоша практика
onsubmit='return encryptData();'
защото напр. ако забравиш един return по подразбиране ф-ята ще върне undefined
return [[expression]]; - The expression whose value is to be returned. If omitted, undefined is returned instead.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/return

или напр. ако от некадърен код за де/криптиране дойдат изключения като 'Divide by zero error'  ;D
Активен

4096bits

  • Напреднали
  • *****
  • Публикации: 6137
    • Профил
Разбирачи, я дайде линк към добри уроци по JS. Или по-добре, да пробвам да науча Node?
Активен

As they say in Mexico, "Dasvidaniya!" Down there, that's two vidaniyas.

n00b

  • Напреднали
  • *****
  • Публикации: 1248
  • Distribution: OSX
  • Window Manager: 10.6, 10.8, 10.9
  • Live to hack, hack to live.
    • Профил
ами... то там сега сложно има разни ES5, ES6 и други кючеци.

Освен ако не търсиш за чистия JS?
Активен

mobilio - професионални мобилни приложения

Naka

  • Напреднали
  • *****
  • Публикации: 3395
    • Профил
след смяна на
Код:
<form action="" method='POST' id='txtAuth' autocomplete='on' onsubmit='encryptData(); return false;' >

Проблема при Хрома остана. Не се оправи. :'( Нещо много на дълбоко е. Хрома прави някакви гимнастики да определи след логина дали наистина си се логнал и чак тогава оферира 'запази паролата'. А той откъде ще знае как работи сайта ??? ??? ???

А FF нали е по 'тъпичък' работи. Даже ти предлага да запомни и грешнo въведена име/парола. :o 

PS: ---------
action="" е валиден относителен адрес в текущият домейн: example.com/'' . но даже и да е action="test.php" пак не работи и това го пробвах....

Тук има описан същият проблем...Но е от 2010 и както изглежда, че още не е оправен. Явно хромаджиите го броят за feature.
https://bugs.chromium.org/p/chromium/issues/detail?id=43219

Цитат на: 4096bits
Разбирачи, я дайде линк към добри уроци по JS.
Аз JS хич не го обичам. Бърка ми в мозъка. За всеки проблем ровя по-отделно в нета.
« Последна редакция: Mar 14, 2018, 14:27 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

4096bits

  • Напреднали
  • *****
  • Публикации: 6137
    • Профил
ами... то там сега сложно има разни ES5, ES6 и други кючеци.

Освен ако не търсиш за чистия JS?
Знам ли?! Каква е разликата?
Активен

As they say in Mexico, "Dasvidaniya!" Down there, that's two vidaniyas.

n00b

  • Напреднали
  • *****
  • Публикации: 1248
  • Distribution: OSX
  • Window Manager: 10.6, 10.8, 10.9
  • Live to hack, hack to live.
    • Профил
Проблема при Хрома остана. Не се оправи. :'( Нещо много на дълбоко е. Хрома прави някакви гимнастики да определи след логина дали наистина си се логнал и чак тогава оферира 'запази паролата'. А той откъде ще знае как работи сайта ??? ??? ???


Дай линк да го видя
Активен

mobilio - професионални мобилни приложения

Naka

  • Напреднали
  • *****
  • Публикации: 3395
    • Профил
Докарах го до някъде...Успях да го накарам да излезе pop-up за запомняне....При мен проблема е бил, че наред с видимата форма имам и друга скрита форма която я събмитвам с JS. И събмитването на друга форма не се харесва на Хрома. Направих го с XMLHttpRequest() вместо с *.submit(). Но не само това го спираше има още подробности >:( >:(
Като го дооправя ще пиша подробно.

Междувременно имам няколко допълнителни въпроси.

1. При отказана оторизация -от веб форма!!! кой статус код  (4xx) трябва да се върне?
https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#4xx_Client_errors

Най-много приляга 401 Unauthorized. Но той пък е за другите оторизации - basic, digest (не е за веб форми). И стандарта изисква да се върне заедно с него и  WWW-Authenticate ??? ??? ???
(WWW-Authenticate: предизвиква съвсем друга реакция на браузера. Той предизвиква поп-ап за парола, който поп-ап е на самият бразузер. Това съвсем не е необходимо!!!!!!)
Най-много да понарушим стандарта и да не изпращаме WWW-Authenticate :D

403 Forbidden и той не става. Той по скоро е откъз до достъп до ресурс и има смисъл на permanently forbiden и то за всички юзери. Нищо в него не казва че клиента може да опита пак и да се поправи.

------------------------
2. За спирането събмита на формата има ли разлика между

Код:
<form.... onsubmit='encryptData(); return false;'>
.....
и
Код:
<form.... onsubmit='event.preventDefault(); encryptData();'>
.....



« Последна редакция: Mar 27, 2018, 15:48 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

n00b

  • Напреднали
  • *****
  • Публикации: 1248
  • Distribution: OSX
  • Window Manager: 10.6, 10.8, 10.9
  • Live to hack, hack to live.
    • Профил
Връщаш си 200 ОК.
Активен

mobilio - професионални мобилни приложения

Naka

  • Напреднали
  • *****
  • Публикации: 3395
    • Профил
Връщаш си 200 ОК.

Ха ха ама не става. Са като го оправих проблема - възникна противоположният проблем. Сега пък не мога да го спра. ;D :o  ;D Винаги излиза този поп-ап за запомняне....... И при грешна парола.

Спирам го само с 4хх код!!! Та те така.

--------------------------------

Отдавна всичко оправих. Да обобщя:
Какво Спира запомнянето на паролите. Причините може да са няколко.
------------------------------------------

1. <form action="javascript:void(0);" ....>  Благодаря на n00b-а щях вечно да цикля..
      (Благодаря и на Ремо за експлицит връщането на false.)

2. Попълването на една форма, а събмитването (с JS) на друга. Това беше моят случай. За да се запомни паролата трябва да се събмитне същата форма.

3. След събмит връщането в страница в която я има същата форма. Ако съществува същата форма, Браузерът си мисли че няма успешен логин и затова не предлага.
Ако все пак е необходимо след успешен логи да отиде на същата страница то формата трябва да се изтрие с JS.
Общо взето за да се запомни паролата след събмита трябва да се отиде на друга страница.




Какво кара браузерът да опознае двойката юзер/парола от формата.
--------------------
Първо си мислих че ги опознава по name='user' или name='username' и name='password'
Имената на полета изобщо не влияят. Много е по-просто.

За парола запомня първото поле тип парола.
<input ...  type="password">

За юзер запомня първото предхождащо го текст поле (независимо как се казва) преди паролата.
......
<input ...  type="text">
......
<input ...  type="password">
....


------------------------
Открих и друг начин по който може да се спре изпращането на някое поле от формата. На мен ми трябваше да се спре изпращането на password полето защото е в открит вид. Трикът е малко хакерски. За да се спре изпращането на някое поле, просто трябва да не му се задава име.

Код:
<form action="" method='POST' id='txtAuth' onsubmit='encryptData() >
<input type="text" name="user"  size="10" />
<input type="password"  size="10" />
        <input type="hidden" name="password_encoded"  size="10" />
        <input type="submit" value="Вход" />
</form>

в случая <input type="password"  size="10" /> няма name='xxxxxx' и затова не се събмитва, но пък понеже все пак съществува и е type="password"  то браузера го предлага заедно с предното <input type="text" ...> да се запомни.


----
Освен това се оказа че имало и API-та за тази цел. За менажирането на запомнянето на паролите и/или друга инfормация. Наричат ги Credentials, обаче работят само в https ????

https://developer.mozilla.org/en-US/docs/Web/API/PasswordCredential




« Последна редакция: Jul 31, 2018, 15:51 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.