[PHP] Re: a question on session ID and security

2007-05-28 Thread Jared Farrish

1. script for login process is located on a SSL-enabled server, so
usernames and passwords are encrypted.

https:// is an envelope encryption, so POST data, which is a part of the
packet data, not packet headers, is encrypted. As long as you POST or COOKIE
data that needs encryption, you're fine. GET is not secure.


2. upon successful login, user is relocated to a non-SSL-enabled server
which hosts the scripts that contain the authenticated-user-only features.

If this is what you're doing (header() or a meta-refresh html tag).


So, while usernames and passwords are protected by SSL, the PHPSESSID is
not. In other words, anyone who captures that HTTP GET packet can get
the session ID. Is that true?

There are a few different attack vectors with SESSION data. Needless to say,
never store or authenticate by a PHP SESSION id only; use cookies or encrypt
a page with script and include() the content per page, and force users to
login every page change.


Another question is while that session ID is valid only before an
unset() and a session_destroy(). So the attacker who has the session ID
must fake the session before the real user logout. Is that true?

Before the session is destroyed and the temp file where it is stored is
deleted from the harddrive. Do not store sensitive information or use a
SESSION id to authenticate a user.


--
Jared Farrish
Intermediate Web Developer
Denton, Tx

Abraham Maslow: "If the only tool you have is a hammer, you tend to see
every problem as a nail." $$


[PHP] Re: a question on session ID and security

2007-05-29 Thread Jared Farrish

On 5/29/07, Stut <[EMAIL PROTECTED]> wrote:


What utter crud. An SSL connection encrypts the whole HTTP conversation,
including headers and even the URL you are requesting. The response is
also encrypted. It doesn't matter whether you're doing a POST or a GET
request, it's all encrypted.



The URL string is encrypted in HTTPS? Well, I was certainly under a
different impression (same with headers). Since I can't say I know any
better beyond a shadow of a doubt, I'll take your word for it. : )

Cookies are no more secure than the session ID. The general conclusion

from many years of discussion in the web community is that the user
experience is diminished so much by not trusting a session ID that the
security improvements are not justified.



So by storing sensitive information in a SESSION, you're safer? Only if the
session doesn't get read... I don't know, I guess in the security sense, it
should be seen as a part of the "conversation" as you put it, so if you
can't trust SESSION, you probably shouldn't use it at all for secure
applications. I still don't see the sense in storing sensitive information
in a session, at least one that persists; if it is passed to a temp table in
a database and destroyed across calls, I can see that as a better solution,
as long as you have a strong database security configuration.

If you're really concerned then your best bet is to reduce the session

lifetime to 5-10 minutes. Another 'trick' people sometimes use is to
store the user agent in the session and expire it if a request tries to
use an existing session with a different user agent. Unfortunately you
cannot rely on the IP address remaining the same throughout a session,
so don't build that into your session validation.



Well, if you use COOKIES, you can pass a secondary hash key that can be used
to validate the actual key against a footprint for a visitor (from
$_SERVER). Salt in a date/timestamp and SHA1 or other, and I feel like
that's a pretty good way to check against a visitor. I just think it feels
flimsy to validate a user on a SESSION key only.

--
Jared Farrish
Intermediate Web Developer
Denton, Tx

Abraham Maslow: "If the only tool you have is a hammer, you tend to see
every problem as a nail." $$


--
Jared Farrish
Intermediate Web Developer
Denton, Tx

Abraham Maslow: "If the only tool you have is a hammer, you tend to see
every problem as a nail." $$


Re: [PHP] Re: a question on session ID and security

2007-05-29 Thread Stut

Jared Farrish wrote:

1. script for login process is located on a SSL-enabled server, so
usernames and passwords are encrypted.

https:// is an envelope encryption, so POST data, which is a part of the
packet data, not packet headers, is encrypted. As long as you POST or 
COOKIE

data that needs encryption, you're fine. GET is not secure.


What utter crud. An SSL connection encrypts the whole HTTP conversation, 
including headers and even the URL you are requesting. The response is 
also encrypted. It doesn't matter whether you're doing a POST or a GET 
request, it's all encrypted.



2. upon successful login, user is relocated to a non-SSL-enabled server
which hosts the scripts that contain the authenticated-user-only 
features.

If this is what you're doing (header() or a meta-refresh html tag).


So, while usernames and passwords are protected by SSL, the PHPSESSID is
not. In other words, anyone who captures that HTTP GET packet can get
the session ID. Is that true?
There are a few different attack vectors with SESSION data. Needless to 
say,
never store or authenticate by a PHP SESSION id only; use cookies or 
encrypt

a page with script and include() the content per page, and force users to
login every page change.


Cookies are no more secure than the session ID. The general conclusion 
from many years of discussion in the web community is that the user 
experience is diminished so much by not trusting a session ID that the 
security improvements are not justified.


If you're really concerned then your best bet is to reduce the session 
lifetime to 5-10 minutes. Another 'trick' people sometimes use is to 
store the user agent in the session and expire it if a request tries to 
use an existing session with a different user agent. Unfortunately you 
cannot rely on the IP address remaining the same throughout a session, 
so don't build that into your session validation.



Another question is while that session ID is valid only before an
unset() and a session_destroy(). So the attacker who has the session ID
must fake the session before the real user logout. Is that true?

Before the session is destroyed and the temp file where it is stored is
deleted from the harddrive. Do not store sensitive information or use a
SESSION id to authenticate a user.


The session ID should be used for exactly what it says on the tin - 
identifying a session. PHP takes care of this for you by looking at the 
sessions it is maintaining for one matching the ID it's given. You can 
and should authenticate the continuation of a session based on the 
session ID (otherwise there's not much point having the session because 
the user will need to login for each page request), but you should not 
be storing the session ID anywhere because it's not a permanent value.


To invalidate a session ID you just need to call session_destroy. There 
are people who do the following just to be sure that the data in a 
session is destroyed, but AFAIK it's not necessary...


foreach (array_keys($_SESSION) as $key) unset($_SESSION[$key]);

-Stut

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] Re: a question on session ID and security

2007-05-29 Thread Zoltán Németh
2007. 05. 29, kedd keltezéssel 10.09-kor Stut ezt írta:
> Jared Farrish wrote:
> >> 1. script for login process is located on a SSL-enabled server, so
> >> usernames and passwords are encrypted.
> > https:// is an envelope encryption, so POST data, which is a part of the
> > packet data, not packet headers, is encrypted. As long as you POST or 
> > COOKIE
> > data that needs encryption, you're fine. GET is not secure.
> 
> What utter crud. An SSL connection encrypts the whole HTTP conversation, 
> including headers and even the URL you are requesting. The response is 
> also encrypted. It doesn't matter whether you're doing a POST or a GET 
> request, it's all encrypted.
> 
> >> 2. upon successful login, user is relocated to a non-SSL-enabled server
> >> which hosts the scripts that contain the authenticated-user-only 
> >> features.
> > If this is what you're doing (header() or a meta-refresh html tag).
> > 
> >> So, while usernames and passwords are protected by SSL, the PHPSESSID is
> >> not. In other words, anyone who captures that HTTP GET packet can get
> >> the session ID. Is that true?
> > There are a few different attack vectors with SESSION data. Needless to 
> > say,
> > never store or authenticate by a PHP SESSION id only; use cookies or 
> > encrypt
> > a page with script and include() the content per page, and force users to
> > login every page change.
> 
> Cookies are no more secure than the session ID. The general conclusion 
> from many years of discussion in the web community is that the user 
> experience is diminished so much by not trusting a session ID that the 
> security improvements are not justified.
> 
> If you're really concerned then your best bet is to reduce the session 
> lifetime to 5-10 minutes. Another 'trick' people sometimes use is to 
> store the user agent in the session and expire it if a request tries to 
> use an existing session with a different user agent. Unfortunately you 
> cannot rely on the IP address remaining the same throughout a session, 
> so don't build that into your session validation.
> 
> >> Another question is while that session ID is valid only before an
> >> unset() and a session_destroy(). So the attacker who has the session ID
> >> must fake the session before the real user logout. Is that true?
> > Before the session is destroyed and the temp file where it is stored is
> > deleted from the harddrive. Do not store sensitive information or use a
> > SESSION id to authenticate a user.
> 
> The session ID should be used for exactly what it says on the tin - 
> identifying a session. PHP takes care of this for you by looking at the 
> sessions it is maintaining for one matching the ID it's given. You can 
> and should authenticate the continuation of a session based on the 
> session ID (otherwise there's not much point having the session because 
> the user will need to login for each page request), but you should not 
> be storing the session ID anywhere because it's not a permanent value.
> 
> To invalidate a session ID you just need to call session_destroy. There 
> are people who do the following just to be sure that the data in a 
> session is destroyed, but AFAIK it's not necessary...
> 
> foreach (array_keys($_SESSION) as $key) unset($_SESSION[$key]);

or just simply
$_SESSION = array();

greets
Zoltán Németh

> 
> -Stut
> 

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] Re: a question on session ID and security

2007-05-29 Thread Stut

Zoltán Németh wrote:

2007. 05. 29, kedd keltezéssel 10.09-kor Stut ezt írta:

Jared Farrish wrote:

1. script for login process is located on a SSL-enabled server, so
usernames and passwords are encrypted.

https:// is an envelope encryption, so POST data, which is a part of the
packet data, not packet headers, is encrypted. As long as you POST or 
COOKIE

data that needs encryption, you're fine. GET is not secure.
What utter crud. An SSL connection encrypts the whole HTTP conversation, 
including headers and even the URL you are requesting. The response is 
also encrypted. It doesn't matter whether you're doing a POST or a GET 
request, it's all encrypted.



2. upon successful login, user is relocated to a non-SSL-enabled server
which hosts the scripts that contain the authenticated-user-only 
features.

If this is what you're doing (header() or a meta-refresh html tag).


So, while usernames and passwords are protected by SSL, the PHPSESSID is
not. In other words, anyone who captures that HTTP GET packet can get
the session ID. Is that true?
There are a few different attack vectors with SESSION data. Needless to 
say,
never store or authenticate by a PHP SESSION id only; use cookies or 
encrypt

a page with script and include() the content per page, and force users to
login every page change.
Cookies are no more secure than the session ID. The general conclusion 
from many years of discussion in the web community is that the user 
experience is diminished so much by not trusting a session ID that the 
security improvements are not justified.


If you're really concerned then your best bet is to reduce the session 
lifetime to 5-10 minutes. Another 'trick' people sometimes use is to 
store the user agent in the session and expire it if a request tries to 
use an existing session with a different user agent. Unfortunately you 
cannot rely on the IP address remaining the same throughout a session, 
so don't build that into your session validation.



Another question is while that session ID is valid only before an
unset() and a session_destroy(). So the attacker who has the session ID
must fake the session before the real user logout. Is that true?

Before the session is destroyed and the temp file where it is stored is
deleted from the harddrive. Do not store sensitive information or use a
SESSION id to authenticate a user.
The session ID should be used for exactly what it says on the tin - 
identifying a session. PHP takes care of this for you by looking at the 
sessions it is maintaining for one matching the ID it's given. You can 
and should authenticate the continuation of a session based on the 
session ID (otherwise there's not much point having the session because 
the user will need to login for each page request), but you should not 
be storing the session ID anywhere because it's not a permanent value.


To invalidate a session ID you just need to call session_destroy. There 
are people who do the following just to be sure that the data in a 
session is destroyed, but AFAIK it's not necessary...


foreach (array_keys($_SESSION) as $key) unset($_SESSION[$key]);


or just simply
$_SESSION = array();


I consider this is very bad practice, but I've just checked the manual 
page for session_destory and it recommends the following to completely 
destroy a session...




-Stut

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] Re: a question on session ID and security

2007-05-29 Thread Stut

Jared Farrish wrote:

On 5/29/07, Stut <[EMAIL PROTECTED]> wrote:


What utter crud. An SSL connection encrypts the whole HTTP conversation,
including headers and even the URL you are requesting. The response is
also encrypted. It doesn't matter whether you're doing a POST or a GET
request, it's all encrypted.


The URL string is encrypted in HTTPS? Well, I was certainly under a
different impression (same with headers). Since I can't say I know any
better beyond a shadow of a doubt, I'll take your word for it. : )


The only part of an SSL connection that's not encrypted is the 
handshaking that goes on to set it up in the first place. Everything 
after that, the GET/POST line, headers and the body as well as the 
entire response is encrypted.



Cookies are no more secure than the session ID. The general conclusion
from many years of discussion in the web community is that the user
experience is diminished so much by not trusting a session ID that the
security improvements are not justified.


So by storing sensitive information in a SESSION, you're safer? Only if the
session doesn't get read... I don't know, I guess in the security sense, it
should be seen as a part of the "conversation" as you put it, so if you
can't trust SESSION, you probably shouldn't use it at all for secure
applications. I still don't see the sense in storing sensitive information
in a session, at least one that persists; if it is passed to a temp 
table in

a database and destroyed across calls, I can see that as a better solution,
as long as you have a strong database security configuration.


I never said it was safer to store sensitive information in a session - 
stop adding words! All I said was that the whole discussion of session 
security has been done to death and the conclusion is that you put the 
minimum possible on the client (the session ID) and store everything 
else on the server. If security is a big enough issue that you worry 
about data in the session being read then you need a dedicated server.


If on the other hand you mean credit card information when you say 
sensitive data, there is no reason on earth why that should ever be 
*stored* anywhere on your server(s), even a "temp" table.


As far as the relative security of cookies against sessions, they are 
basically as insecure as each other in most cases, but your cookies are 
at the mercy of the users setup which is something I'm just not willing 
to trust.


The bottom line is that anything sent to or received from the user is 
insecure, and any security that can be added beyond SSL is easily worked 
around.



If you're really concerned then your best bet is to reduce the session

lifetime to 5-10 minutes. Another 'trick' people sometimes use is to
store the user agent in the session and expire it if a request tries to
use an existing session with a different user agent. Unfortunately you
cannot rely on the IP address remaining the same throughout a session,
so don't build that into your session validation.


Well, if you use COOKIES, you can pass a secondary hash key that can be 
used

to validate the actual key against a footprint for a visitor (from
$_SERVER). Salt in a date/timestamp and SHA1 or other, and I feel like
that's a pretty good way to check against a visitor. I just think it feels
flimsy to validate a user on a SESSION key only.


Indeed, you can validate a session by using certain information from the 
$_SERVER array, but bear in mind that none of it is necessarily 
persistant. I don't know of any examples, but I'm sure somewhere there 
is a crappy browser that changes its user agent for every request. 
However, of all the options I think the user agent is your best bet if 
you really feel you need to worry about it.


In your comment above you seem to be suggesting passing that "secondary 
hash key" between requests via a cookie. Why not just store that in the 
session? Then it doesn't go outside your app. And as mentioned 
previously you have a lot more control over the session data than you do 
over cookie data.


Here one final thought... if there was a reliable way to add security to 
sessions don't you think that one of the multitude of web development 
languages out there would have done it, including PHP?


-Stut

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] Re: a question on session ID and security

2007-05-29 Thread Jared Farrish

On 5/29/07, Stut <[EMAIL PROTECTED]> wrote:


The only part of an SSL connection that's not encrypted is the
handshaking that goes on to set it up in the first place. Everything
after that, the GET/POST line, headers and the body as well as the
entire response is encrypted.



One of these days I'm actually going to run some tests so I can see what is
actually happening.  I would sound completely ignorant speaking of packets
as if I knew them that well, so I won't!

I never said it was safer to store sensitive information in a session -

stop adding words! All I said was that the whole discussion of session
security has been done to death and the conclusion is that you put the
minimum possible on the client (the session ID) and store everything
else on the server. If security is a big enough issue that you worry
about data in the session being read then you need a dedicated server.

If on the other hand you mean credit card information when you say
sensitive data, there is no reason on earth why that should ever be
*stored* anywhere on your server(s), even a "temp" table.



I find the best way to advice people on SESSIONS is not to trust them, and
thus not store any kind of sensitive information within them (SSN, credit
card, even phone numbers and whatnot). Since I don't happen to use sessions
or cookies that often (for this reason), maybe my advice is a little biased.
I store user data in cookies...

One thing that makes this all completely irrevelent is that, for someone
with physical access to authenticated browser session (such as an
co-worker), no amount of security will prevent misuse of a session.

As far as the relative security of cookies against sessions, they are

basically as insecure as each other in most cases, but your cookies are
at the mercy of the users setup which is something I'm just not willing
to trust.



True. I should have a fallback to use SESSION if cookies are not available,
but if I'm doing that, why not go whole-hog?

The bottom line is that anything sent to or received from the user is

insecure, and any security that can be added beyond SSL is easily worked
around.



And SSL is rendered moot for users who gain browser access to an
authenticated session. Security, I believe, is a matter of pushing
vulnerabilities into a corner. You can't ever make any system completely
secure, as such a system would be virtually useless.


Well, if you use COOKIES, you can pass a secondary hash key that can be
> used
> to validate the actual key against a footprint for a visitor (from
> $_SERVER). Salt in a date/timestamp and SHA1 or other, and I feel like
> that's a pretty good way to check against a visitor. I just think it
feels
> flimsy to validate a user on a SESSION key only.

Indeed, you can validate a session by using certain information from the
$_SERVER array, but bear in mind that none of it is necessarily
persistant. I don't know of any examples, but I'm sure somewhere there
is a crappy browser that changes its user agent for every request.
However, of all the options I think the user agent is your best bet if
you really feel you need to worry about it.



What happens if someone is behind a proxy? Never tested that, but if someone
were to make a proxy sanitizer that purposefully skewed what it reports in
the headers, that approach could be difficult to troubleshoot.

In your comment above you seem to be suggesting passing that "secondary

hash key" between requests via a cookie. Why not just store that in the
session? Then it doesn't go outside your app. And as mentioned
previously you have a lot more control over the session data than you do
over cookie data.



The whole point of using a shared hash is to provide notional benefit by
providing a secondary key, that is stored on the browser, which is used to
build the authenticated token, which is then matched to the server token.
This is a type of security hash similar to the one you suggested above
(using $_SERVER variables), only stored in a cookie.

Different approach for different folks... : )

Here one final thought... if there was a reliable way to add security to

sessions don't you think that one of the multitude of web development
languages out there would have done it, including PHP?



I certainly don't think you're implying I thought I had given some new,
"better" way of doing sessions that nobody had given before? Curious
statement.

--
Jared Farrish
Intermediate Web Developer
Denton, Tx

Abraham Maslow: "If the only tool you have is a hammer, you tend to see
every problem as a nail." $$


Re: [PHP] Re: a question on session ID and security

2007-05-29 Thread Stut

Jared Farrish wrote:

On 5/29/07, Stut <[EMAIL PROTECTED]> wrote:


The only part of an SSL connection that's not encrypted is the
handshaking that goes on to set it up in the first place. Everything
after that, the GET/POST line, headers and the body as well as the
entire response is encrypted.


One of these days I'm actually going to run some tests so I can see what is
actually happening.  I would sound completely ignorant speaking of packets
as if I knew them that well, so I won't!


Sniff an SSL connection and you'll see it. Most of the traffic is gibberish!


I never said it was safer to store sensitive information in a session -

stop adding words! All I said was that the whole discussion of session
security has been done to death and the conclusion is that you put the
minimum possible on the client (the session ID) and store everything
else on the server. If security is a big enough issue that you worry
about data in the session being read then you need a dedicated server.

If on the other hand you mean credit card information when you say
sensitive data, there is no reason on earth why that should ever be
*stored* anywhere on your server(s), even a "temp" table.


I find the best way to advice people on SESSIONS is not to trust them, and
thus not store any kind of sensitive information within them (SSN, credit
card, even phone numbers and whatnot). Since I don't happen to use sessions
or cookies that often (for this reason), maybe my advice is a little 
biased.

I store user data in cookies...


You do? What sort of data? Nothing sensitive I hope.


One thing that makes this all completely irrevelent is that, for someone
with physical access to authenticated browser session (such as an
co-worker), no amount of security will prevent misuse of a session.


The best you can hope to provide is end-to-end security and security on 
the server end. Anything beyond the connection at the client is out of 
your control and not worth worrying about.



As far as the relative security of cookies against sessions, they are

basically as insecure as each other in most cases, but your cookies are
at the mercy of the users setup which is something I'm just not willing
to trust.


True. I should have a fallback to use SESSION if cookies are not available,
but if I'm doing that, why not go whole-hog?


Fallback to sessions? That makes no sense to me. Aside from the fact 
that you are storing application data on the client machine (which could 
be in a library for all you know), you are also transferring all that 
data for every page request. I really do think you should reconsider 
this approach.



The bottom line is that anything sent to or received from the user is
insecure, and any security that can be added beyond SSL is easily worked
around.


And SSL is rendered moot for users who gain browser access to an
authenticated session. Security, I believe, is a matter of pushing
vulnerabilities into a corner. You can't ever make any system completely
secure, as such a system would be virtually useless.


"The only secure computer is one that's never switched on."

Can't remember who said that, but it's completely true. However, the 
essence of a secure web application, for me, lies in not sending 
anything to the client that the client doesn't need to know about.



Well, if you use COOKIES, you can pass a secondary hash key that can be
> used
> to validate the actual key against a footprint for a visitor (from
> $_SERVER). Salt in a date/timestamp and SHA1 or other, and I feel like
> that's a pretty good way to check against a visitor. I just think it
feels
> flimsy to validate a user on a SESSION key only.

Indeed, you can validate a session by using certain information from the
$_SERVER array, but bear in mind that none of it is necessarily
persistant. I don't know of any examples, but I'm sure somewhere there
is a crappy browser that changes its user agent for every request.
However, of all the options I think the user agent is your best bet if
you really feel you need to worry about it.


What happens if someone is behind a proxy? Never tested that, but if 
someone

were to make a proxy sanitizer that purposefully skewed what it reports in
the headers, that approach could be difficult to troubleshoot.


This is precisely my point. At some point you have to ask yourself 
whether it's worth worrying about? If you're dealing with high-value 
transactions then you probably need something more akin to a 
client-server solution than a web-based solution. That way you can 
control the client-side a lot better than you can in a web-based 
application.



In your comment above you seem to be suggesting passing that "secondary
hash key" between requests via a cookie. Why not just store that in the
session? Then it doesn't go outside your app. And as mentioned
previously you have a lot more control over the session data than you do
over cookie data.


The whole point of using a shared hash is to provide notional benefit

Fwd: [PHP] Re: a question on session ID and security

2007-05-29 Thread Jared Farrish

On 5/29/07, Stut <[EMAIL PROTECTED]> wrote:


Don't get me wrong, I don't want to discourage anyone from thinking
about ways to improve it, but personally I consider this issue done to
death.



Well, I think the difference is that you send one key (a session identifier)
and hash on user agent report, while I send an authentication key and a
secondary hash key stored in cookies. I'm sending only nominally more
information than you are, so I don't think there's THAT much difference
between what we're saying here. As a lot of users would store session id's
as cookies, and fall back to a query string id, like I said, I don't see
much of a difference in our approaches, except you don't seem to think mine
is acceptable since it's not a "session" id.

If you supply the salt (instead of relying on it being provided, vis a vis,
user agent report), and store that in a cookie on the client, and then that
client can't reproduce an accurate, unchanged version of that cookie, what
change in either the salt and/or the auth id would make this approach
unacceptable (and not break the authentication)? I see major web firms use
cookies all the time, so I'm not sure why there is a bias against cookies,
besides a user that doesn't support cookies in the first place (which is a
real concern, I admit).

I remember a poster on a wall of a tech dept my friend worked for that had a
faux-advert for a "security dongle" for a computer. Essentially, it was a
rubber stopper that was put on a power cable that provided a "100% secure
air gap."

Whether it's been settled or not, I'm not nearly as played out on discussing
it (especially if I'm not getting aspects correct) as I am about browser
bickering, OS wars, and all the other "dispassionate" discourse currently
"enlightening" the internet. At least with security, there's some known
benefit to discussing it!
--
Jared Farrish
Intermediate Web Developer
Denton, Tx

Abraham Maslow: "If the only tool you have is a hammer, you tend to see
every problem as a nail." $$


--
Jared Farrish
Intermediate Web Developer
Denton, Tx

Abraham Maslow: "If the only tool you have is a hammer, you tend to see
every problem as a nail." $$


Re: [PHP] Re: a question on session ID and security

2007-05-29 Thread Jared Farrish

That's not what I'm saying. My basic question is why send the "secondary
hash key" to the client when it doesn't need it? Use the authentication
key to identify the users data, then get the "secondary hash key" from
that data. The browser never needs to see the hash, and from a purist
security point of view it could potentially reveal more about your
security methods than you need to.


The idea is that the secondary hash key replaces the user agent sniff.


But the point here is that both pieces of information required to
authenticate that client are stored on the client. If someone can get
one of them they can get the other, so it's no more secure than just
accepting the one cookie without bothering to authenticate it in any way.


The token isn't any more secure than tokenizing a user agent and salting it
into a digest. The client still knows what their user agent string says, and
this string can also be guessed (how random can they be?), but at least you
can manipulate a secondary hash key per day/hour, week, whatever.


I have nothing against cookies at all, but I think the line between
cookies and session data is pretty clear.


I would just ask where? (No, really.) If it was clear, then a link to a
tutorial on PHP session security is helpful.


Cookies should be used to...

a) remember a user between sessions (but not authenticate them)
b) remember a session ID during a session
c) remember user preferences for anonymous users, or where there is no
such concept as users on the site


I agree 100% on everything except the logic on authentication. How would you
finish the following:

Sessions should be use to...

a) ?
b) ?
c) ?


Sessions should be used for everything else. If you're finding that
you're storing huge amounts of data in cookies, switch to using
sessions. If you find that you're storing so-called "sensitive"
information in cookies, switch to sessions.


I don't store anything in cookies that are meant to be useful on the
server-side, save an auth string and a corresponding generated salt. This
will probably change on my next big project, but for the moment, I'm not
much of a fan of SESSIONS that persist. This is based on limited experience
and anecdotal evidence, so opinions may very.


I'm more than happy to discuss it, but please tell me you got the point
about whatever extra security is possible is likely to have been added
by the majority of web application platforms, including PHP.


Of course. We're talking methodology (implementation of what is available),
so I'm not sure why you feel the above is necessary.


I'm all for talking about it and seeing if there is a better way, but I
also know that people far smarter than me have been talking about it for
over 20 years, and what we have is what they've come up with. Ignoring
the other possibilities like client certificates there's not really
anything more you can do without introducing the possibility or even
likelihood that the user experience will be shafted.


If it's an accepted methodology, please describe the entire methodology. If
you think it's obvious, it should be easy, and a link is beneficial.

I do think the stated best practice of SESSIONS, at this point, probably
does need to be described to be further useful as a topic of discussion.
I've been a little unclear in some things, so I get the feeling we've got
the same point of view, with one slight deviation (I think it's slight...).


Re: [PHP] Re: a question on session ID and security

2007-05-29 Thread Jared Farrish

On 5/29/07, Jared Farrish <[EMAIL PROTECTED]> wrote:


I do think the stated best practice of SESSIONS, at this point, probably
does need to be described to be further useful as a topic of discussion.
I've been a little unclear in some things, so I get the feeling we've got
the same point of view, with one slight deviation (I think it's slight...).



Just thought I'd post this:

Primer on PHP session security:
http://www.php-mag.net/itr/online_artikel/psecom,id,513,nodeid,114.html

--
Jared Farrish
Intermediate Web Developer
Denton, Tx

Abraham Maslow: "If the only tool you have is a hammer, you tend to see
every problem as a nail." $$


Re: [PHP] Re: a question on session ID and security

2007-05-29 Thread Stut

Jared Farrish wrote:

That's not what I'm saying. My basic question is why send the "secondary
hash key" to the client when it doesn't need it? Use the authentication
key to identify the users data, then get the "secondary hash key" from
that data. The browser never needs to see the hash, and from a purist
security point of view it could potentially reveal more about your
security methods than you need to.


The idea is that the secondary hash key replaces the user agent sniff.


But by doing that you're exposing how your app validates the 
authentication key, leaving it open to being transferred to another machine.



But the point here is that both pieces of information required to
authenticate that client are stored on the client. If someone can get
one of them they can get the other, so it's no more secure than just
accepting the one cookie without bothering to authenticate it in any way.


The token isn't any more secure than tokenizing a user agent and salting it
into a digest. The client still knows what their user agent string says, 
and

this string can also be guessed (how random can they be?), but at least you
can manipulate a secondary hash key per day/hour, week, whatever.


It's actually less secure than using the user agent because someone 
looking at the cookies on the client gets no indication that you're 
using the user agent to verify that it's the same client making the request.



I have nothing against cookies at all, but I think the line between
cookies and session data is pretty clear.


I would just ask where? (No, really.) If it was clear, then a link to a
tutorial on PHP session security is helpful.


I've asked the internals list why PHP doesn't natively validate the 
session ID by using the user agent or other variables because I actually 
don't know the reasoning behind it. I'll let you know what they say.



Cookies should be used to...

a) remember a user between sessions (but not authenticate them)
b) remember a session ID during a session
c) remember user preferences for anonymous users, or where there is no
such concept as users on the site


I agree 100% on everything except the logic on authentication. How would 
you

finish the following:

Sessions should be use to...

a) ?
b) ?
c) ?


a) Store data between requests
b) There is no B

That's the definition of a session. It's a server-side store of data 
related to a single user of a web application.



Sessions should be used for everything else. If you're finding that
you're storing huge amounts of data in cookies, switch to using
sessions. If you find that you're storing so-called "sensitive"
information in cookies, switch to sessions.


I don't store anything in cookies that are meant to be useful on the
server-side, save an auth string and a corresponding generated salt. This
will probably change on my next big project, but for the moment, I'm not
much of a fan of SESSIONS that persist. This is based on limited experience
and anecdotal evidence, so opinions may very.


By "sessions that persist" do you mean sessions that live on between 
visits by a user? If so then that's a totally different kettle of fish 
and IMHO should be avoided at all costs.



I'm more than happy to discuss it, but please tell me you got the point
about whatever extra security is possible is likely to have been added
by the majority of web application platforms, including PHP.


Of course. We're talking methodology (implementation of what is available),
so I'm not sure why you feel the above is necessary.


Look at the session facilities provided by any web development platform. 
They all work the same was as PHP sessions, that is to say storing a 
session ID in a cookie or passing it in URLs. I'm not aware of any 
system that uses extra validation, and the reason for that is that there 
is no guaranteed method.


But you're right, the everybody-else-does-it-that-way argument is never 
very strong, but I think it's worth noting. As mentioned earlier, I have 
asked the internals list to give a reason why the session extension does 
no additional validation.



I'm all for talking about it and seeing if there is a better way, but I
also know that people far smarter than me have been talking about it for
over 20 years, and what we have is what they've come up with. Ignoring
the other possibilities like client certificates there's not really
anything more you can do without introducing the possibility or even
likelihood that the user experience will be shafted.


If it's an accepted methodology, please describe the entire methodology. If
you think it's obvious, it should be easy, and a link is beneficial.


20 years was an exaggeration given the age of the web, but the need to 
persist data related to any given user of a website between requests has 
been an issue for well over 10 years.


The first "solution" was cookies. The problem with cookies is that 
they're very inefficient and insecure. Inefficient because they get 
transferred with eve

Re: [PHP] Re: a question on session ID and security

2007-05-29 Thread Jared Farrish

But by doing that you're exposing how your app validates the
authentication key, leaving it open to being transferred to another

machine.

True. Although I'm only exposing a part of the auth chain, not *how* that is
constructed to produce the actual authentication token.

It does not, however, tie the session to a specific browser instance on a
remote machine; this is a problem. Of course, if the hash token uses the
reported UA when created... :P


It's actually less secure than using the user agent because someone
looking at the cookies on the client gets no indication that you're
using the user agent to verify that it's the same client making the

request.

But as you said, it's a reasonable thing to guess that it's being used as a
salt or verifier, and may be spoofed using semi-random UA strings if you are
testing for remote session hijacking weaknesses. If my salt changes
according to a time/date/other, or is produced at random (somehow), even if
it is transferred, it should still expire and be invalid by my own control.


I've asked the internals list why PHP doesn't natively validate the
session ID by using the user agent or other variables because I actually
don't know the reasoning behind it. I'll let you know what they say.


I would think it's because browsers are flaky and you can't really rely on
them, and that means you can't build it into the system check.


That's the definition of a session. It's a server-side store of data
related to a single user of a web application.


I think this is another reason why the internals don't support
authentication of sessions. Is it up to a session to authenticate itself?
Should it be? What if you wanted to override that behavior?


By "sessions that persist" do you mean sessions that live on between
visits by a user? If so then that's a totally different kettle of fish
and IMHO should be avoided at all costs.


I agree. :D


Look at the session facilities provided by any web development platform.
They all work the same was as PHP sessions, that is to say storing a
session ID in a cookie or passing it in URLs. I'm not aware of any
system that uses extra validation, and the reason for that is that there
is no guaranteed method.


Ah, so. You are right...


But you're right, the everybody-else-does-it-that-way argument is never
very strong, but I think it's worth noting.


I don't mind "this is standard practice," but EXPLAIN what you mean. What
standard practice?

This is an area that I want my knowledge to overlap others... Bruce
Schneier, in all his glory, makes this point about roll-your-own security
solutions:

Bruce Scheier, http://www.schneier.com/essay-031-ft.txt

The submission document for the algorithm I submitted with my
colleagues at Counterpane was the length of a book.

This [make hashing algorithms] is hard to do.
But even normally rational people tend to be
blinded by a bright shiny new algorithm.  It seems so easy.  The
unfortunate truth is anybody can design an algorithm that he himself
cannot break.  It's actually profound.  Anyone out there, from the
best cryptographer to the random person on the street, can sit down
with a pencil and paper, design an algorithm and say, "I can't break
it."  And then here's the fallacy—because you can't break it, you
make the following assumption: "Therefore, it must be secure." So we
end up with lots of proprietary algorithms.  We have a lot of amateur
cryptanalysts who will design the algorithms, do some work and then
say, "Look I can't break it, therefore it's secure."  My feeling is
that if the designers haven't proven themselves by breaking several
published algorithms, why should I look at their designs?  The odds
of them being secure are pretty negligible.  Indeed, the top five AES
candidates—this is top five based on a formal poll of
cryptographers—were actually designed by teams that have
cryptanalysts on them.  They seem to be the fastest, the most
elegant, the best performing, the ones that seem to be the most
secure.  Still, nobody trusts them—give us a couple of years to stare
at them.  Eventually, we're going to have a new standard.

There's no reason that I can think of ever to use a new and
unanalyzed algorithm.  There's never any benefit.  There might be the
personal pride of the designer.  Other than that, you might as well
use a known algorithm.  So the moral there is "never, ever trust a
proprietary algorithm."


I have to admit that some of this back-and-forth comes from my desire to get
what I want out of your responses, which I know is probably a little
frustrating. How do people who know little about PHP know what session best
practices are, spelled out? I'm not a noob, but I've still learned a good
deal from your responses that I didn't know before. What about the OP?


20 years was an exaggeration given the age of the web, but the need to
persist data related to any given user of a website between requests has
been an issue for well over 10 years.


Sure, but referring to how l

Re: [PHP] Re: a question on session ID and security

2007-05-29 Thread Stut

Jared Farrish wrote:

I've asked the internals list why PHP doesn't natively validate the
session ID by using the user agent or other variables because I actually
don't know the reasoning behind it. I'll let you know what they say.


I would think it's because browsers are flaky and you can't really rely on
them, and that means you can't build it into the system check.


I'm not sure how much closer to the horses mouth I can get...

http://marc.info/?l=php-dev&m=118046750523448&w=2


That's the definition of a session. It's a server-side store of data
related to a single user of a web application.


I think this is another reason why the internals don't support
authentication of sessions. Is it up to a session to authenticate itself?
Should it be? What if you wanted to override that behavior?


Seeing as how the session functionality is provided through an 
extension, overriding it is simplicity itself. Plus there is already a 
way to implement a session handler in user space.



I don't mind "this is standard practice," but EXPLAIN what you mean. What
standard practice?


I'm sorry, I had assumed you knew how PHP sessions work. When a session 
is created it is assigned a unique ID. That ID is transported between 
the client and the server on each request. The server uses that ID to 
identify which session it is, get the data and make it available to the 
scripts.


I have to admit that some of this back-and-forth comes from my desire to 
get

what I want out of your responses, which I know is probably a little
frustrating. How do people who know little about PHP know what session best
practices are, spelled out? I'm not a noob, but I've still learned a good
deal from your responses that I didn't know before. What about the OP?


If there's anything you want me to go into in more detail please just 
ask. I certainly don't think I know it all, but I've been around this 
block more than a few times. On the other hand I'm always open to the 
possiblity that there's a better way(tm).



In all reality, I actually agree with you about sessions in my
heart-of-hearts (maybe a little more now after this thread), as they are 
the

simplest to implement, and the checks performed on authentication are as
robust as any involving cookies (which can become hopelessly bogged down in
checks, digests, and rechecks), although I posit the SAME thing can be
achieved with instances of cookies. However, simplicity should be the
operative word, and the complexity of the approach I have described is more
than a little troublesome.


The same "functionality" can be achieved with cookies, just like the 
functionality of a calculator can be achieved with an abacus.



I appreciate that you posted the historical information on sessions and
cookies. Whether it's accurate to reality, I don't know, but it makes 
sense,

not lemons, so for now, it's good enough for me!


It was definitely abridged, but that's the jist of how sessions evolved.


p.s. Maybe everyone wasn't around when that history occurred...


Don't throw your youth at me, it's unlikely to help.

-Stut

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] Re: a question on session ID and security

2007-05-30 Thread Richard Lynch
On Tue, May 29, 2007 7:42 am, Stut wrote:
> Here one final thought... if there was a reliable way to add security
> to
> sessions don't you think that one of the multitude of web development
> languages out there would have done it, including PHP?

Several reliable security additions have been discussed in this
thread; But they are not "general purpose" to be built-in to PHP.

-- 
Some people have a "gift" link here.
Know what I want?
I want you to buy a CD from some indie artist.
http://cdbaby.com/browse/from/lynch
Yeah, I get a buck. So?

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] Re: a question on session ID and security

2007-05-30 Thread Richard Lynch
On Tue, May 29, 2007 10:36 am, Jared Farrish wrote:
>> But the point here is that both pieces of information required to
>> authenticate that client are stored on the client. If someone can
>> get
>> one of them they can get the other, so it's no more secure than just
>> accepting the one cookie without bothering to authenticate it in any
>> way.
>
> The token isn't any more secure than tokenizing a user agent and
> salting it
> into a digest. The client still knows what their user agent string
> says, and
> this string can also be guessed (how random can they be?), but at
> least you
> can manipulate a secondary hash key per day/hour, week, whatever.

The token is LESS secure, because it's obvious what you are doing --
You are sending out a clear red flag to a Bad Guy that they need this
extra token to get back in.

If they can get the first cookie, they can get the second just as easily.

You've added zero extra security.

-- 
Some people have a "gift" link here.
Know what I want?
I want you to buy a CD from some indie artist.
http://cdbaby.com/browse/from/lynch
Yeah, I get a buck. So?

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] Re: a question on session ID and security

2007-05-30 Thread Jared Farrish

On 5/30/07, Richard Lynch <[EMAIL PROTECTED]> wrote:> If they can get the first
cookie, they can get the second just as easily.

I thought this said "just as weasily" at first, and I thought, "Ain't that
the truth..."

--
Jared Farrish
Intermediate Web Developer
Denton, Tx

Abraham Maslow: "If the only tool you have is a hammer, you tend to see
every problem as a nail." $$


Re: Fwd: [PHP] Re: a question on session ID and security

2007-05-29 Thread Stut

Jared Farrish wrote:

On 5/29/07, Stut <[EMAIL PROTECTED]> wrote:


Don't get me wrong, I don't want to discourage anyone from thinking
about ways to improve it, but personally I consider this issue done to
death.


Well, I think the difference is that you send one key (a session 
identifier)

and hash on user agent report, while I send an authentication key and a
secondary hash key stored in cookies. I'm sending only nominally more
information than you are, so I don't think there's THAT much difference
between what we're saying here. As a lot of users would store session id's
as cookies, and fall back to a query string id, like I said, I don't see
much of a difference in our approaches, except you don't seem to think mine
is acceptable since it's not a "session" id.


That's not what I'm saying. My basic question is why send the "secondary 
hash key" to the client when it doesn't need it? Use the authentication 
key to identify the users data, then get the "secondary hash key" from 
that data. The browser never needs to see the hash, and from a purist 
security point of view it could potentially reveal more about your 
security methods than you need to.



If you supply the salt (instead of relying on it being provided, vis a vis,
user agent report), and store that in a cookie on the client, and then that
client can't reproduce an accurate, unchanged version of that cookie, what
change in either the salt and/or the auth id would make this approach
unacceptable (and not break the authentication)? I see major web firms use


But the point here is that both pieces of information required to 
authenticate that client are stored on the client. If someone can get 
one of them they can get the other, so it's no more secure than just 
accepting the one cookie without bothering to authenticate it in any way.



cookies all the time, so I'm not sure why there is a bias against cookies,
besides a user that doesn't support cookies in the first place (which is a
real concern, I admit).


I have nothing against cookies at all, but I think the line between 
cookies and session data is pretty clear.


Cookies should be used to...

a) remember a user between sessions (but not authenticate them)
b) remember a session ID during a session
c) remember user preferences for anonymous users, or where there is no 
such concept as users on the site


Sessions should be used for everything else. If you're finding that 
you're storing huge amounts of data in cookies, switch to using 
sessions. If you find that you're storing so-called "sensitive" 
information in cookies, switch to sessions.


I remember a poster on a wall of a tech dept my friend worked for that 
had a

faux-advert for a "security dongle" for a computer. Essentially, it was a
rubber stopper that was put on a power cable that provided a "100% secure
air gap."

Whether it's been settled or not, I'm not nearly as played out on 
discussing

it (especially if I'm not getting aspects correct) as I am about browser
bickering, OS wars, and all the other "dispassionate" discourse currently
"enlightening" the internet. At least with security, there's some known
benefit to discussing it!


I'm more than happy to discuss it, but please tell me you got the point 
about whatever extra security is possible is likely to have been added 
by the majority of web application platforms, including PHP.


I'm all for talking about it and seeing if there is a better way, but I 
also know that people far smarter than me have been talking about it for 
over 20 years, and what we have is what they've come up with. Ignoring 
the other possibilities like client certificates there's not really 
anything more you can do without introducing the possibility or even 
likelihood that the user experience will be shafted.


-Stut

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php