1) sessions are typically scoped in time, and
2) if the session is revealed, it can't be used for credential stuffing (using the same credentials on a different website to see if the password was used there too.)
Having said that I'm not being an apologist: The design should be better
Just clarifying, do you mean basic auth with the `Authorization: Basic base64(username : password)` scheme?
But this is of course even worse because most servers log this. Headers are not often logged.
https://www.ietf.org/rfc/rfc3986.txt
FYI
Asking as someone who works with forum software on a daily basis.
https://forums.lenovo.com/api/v1/user/getCountryByIp https://forums.lenovo.com/api/v1/forums/getForumAccess https://forums.lenovo.com/api/v1/forums/getCurrentForumTrees https://forums.lenovo.com/api/v1/topic/getTopic?fid=6&tid=51...
Also interesting that they have no auth requirement on the getCountryByIp route
var __currentForum =
window.CommuntiyForums&&CommuntiyForums.findCommuntiyHomepageByUrlPath()||'';
if(__currentForum&&__currentForum.hit){
lmdBrandVal = "Forum Details:"+ __currentForum.forum.board;
}else{
var __websiteInfo = sessionStorage&&sessionStorage.websiteInfo ? sessionStorage.websiteInfo : sessionStorage.currentCommuntiySite;
if(__websiteInfo&&JSON.parse(__websiteInfo).board) {
lmdBrandVal = "Forum Details:" + JSON.parse(__websiteInfo).board;
}
}By the time I arrived the damage was wide and it was easier to leave it consistently wrong than try and fix across several codebases.
So the only remaining issues are security issues around sharing your computer with other people, or programs. I guess stealing a session id is mildly less problematic than stealing the password in case the password is re-used elsewhere.
Server knows the plaintext password already, too.
Servers should NOT be storing passwords in plaintext, ever. This has been clear for at least 20 years now. You should only store a salted hash of a password, and please, do not roll your own. Use one of the many popular libraries for this.Very different case from storing them in plain text in the database or elsewhere.
To be clear: a properly designed system can and should operate without the server ever knowing the plaintext password.
Not even close. Why?
* Re-use across sites: people unfortunately reuse passwords across services. That means that getting access to these cookies would be great for credential stuffing attacks. A session identifier is no use for that type of attack.
* Re-auth across devices: you can't typically exchange a session for another session on a different device, but you sure can do so with a password.
* Session ids can be revoked with less user impact (they have to log in again). Passwords can be revoked too (it's a password reset), but it impacts users far more.
As other comments mention, passwords should be manipulated in memory, only stored hashed and salted by a strong algorithm, and seen by the bare minimum of software. Preferably handled by software designed for handling passwords and other sensitive credentials. There are commercial options, free options, and open source options.
(Full disclosure, I work for an auth company.)
Ever had Google deny you access for a perfectly valid username/password combo when loging in from "unfamiliar" location? :) Or a bank ask you for SMS code when logging in from a different browser?
It really depends on level of paranoia of the authentication system. You can have user device validation even with username/password, and you may not have it for session IDs in a different implementation.
(I wrote a few thousand words on MFA a year or so ago: https://fusionauth.io/learn/expert-advice/authentication/mul... )
Usually, a responsible website will password-hash the plain-text password into a hashed string before saving the hashed string into their storage. Password-hash is a special hashing process designed to be reasonability slow, so an attacker who somehow obtained the hashed string cannot easily collide the hash with another plain-text.
Some password-hash configuration can took few milliseconds to run, that's really expensive if you have to do that for every request just so you can compare the client password-hash v.s. the one stored on your server.
(Full disclosure, I designed few session manage systems for my job before :D)
After initially setting a password, the database/server should only store a salted hash.
No exceptions.
I can selectively deauth a user to make them login again in short order and take his password.
It depends on the level of compromise, of course.
Return a 401 on the "logout" page?
Not if they're HttpOnly cookies. Then it requires actually compromise/mitm of the application server code to recover the cookies.
I was able to sign up and sign in repeatedly. I never saw a 'RMEPass' cookie set, nor was I able to click 'remember me'.
So it seems like they have fixed at least one part of this issue.
[1]: Screenshot at https://forums.lenovo.com/t5/Other-Linux-Discussions/Thinkpa...