Php 会话cookie中的自动验证与安全性

Php 会话cookie中的自动验证与安全性,php,session,cookies,Php,Session,Cookies,我有一个关于安全和会话cookies的问题。 我正在创建的站点使用以下命令: 当用户正确登录时,我给会话一个cookie“authenticate”。 在脚本的后面,我正在使用这个cookie。 比如: 但现在的问题是。。。 由于安全原因,我的直觉说:不安全!!!。。。。 是否有一种更安全的方法来完成此任务? 这是完全安全的方式吗 thnx高级版。您需要了解PHP会话和cookie之间的区别 cookie是服务器发送到浏览器的字符串,浏览器必须在每次后续请求时将其发送回服务器,直到cookie过

我有一个关于安全和会话cookies的问题。 我正在创建的站点使用以下命令:

当用户正确登录时,我给会话一个cookie“authenticate”。 在脚本的后面,我正在使用这个cookie。 比如:

但现在的问题是。。。 由于安全原因,我的直觉说:不安全!!!。。。。 是否有一种更安全的方法来完成此任务? 这是完全安全的方式吗


thnx高级版。

您需要了解PHP会话和cookie之间的区别

cookie是服务器发送到浏览器的字符串,浏览器必须在每次后续请求时将其发送回服务器,直到cookie过期。
例如,如果服务器响应的请求标题为
Set Cookie:foo=abc123;Expires=Wed,2021年6月9日10:18:14 GMT
,在2012年6月9日之前的每个后续请求中,浏览器必须发送请求头
Cookie:foo=abc123

在PHP脚本上,
$\u COOKIE['foo']
将是
abc123

PHP会话基于cookie,但它们不会将值存储在cookie中。
如果存储
$\u会话['foo']='abc123'
,服务器将不会将
foo=abc123
作为cookie发送到客户端,而是创建存储在服务器上的会话,并将仅将会话ID作为cookie发送。
因此,当您调用时,PHP会在服务器上生成一个新会话,并带有一个自动生成的id(如果您感兴趣,可以使用读取id)。然后,它将(自动)向客户端发送一个cookie,类似于这里的
phpsessid=PHP\u SESSION\u ID\u
。所有这些都是由PHP自动完成的,您不必担心这一点

在这个故事的结尾,是的,你的代码是安全的。这是因为您没有设置cookie
authenticated=pass
(这将是不安全的,因为客户端很容易覆盖cookie),而是将该值存储在PHP会话存储中,客户端只看到会话id

PS:您可能希望在会话中存储更多有用的信息,例如数据库中经过身份验证的用户的用户id或任何其他有意义的信息,而不仅仅是存储布尔值“authenticated”

PS2:PHP会话对未启用Cookie的浏览器提供了传统支持,但在2015年这是毫无意义的(我想知道谁仍然禁用Cookie!-如果你这样做,90%的网站将停止工作)。因此,您应该确保有以下两个ini设置:(文档:)


根据我的说法,它是安全的。应该注意(尽管有些离题,因为它假设应用程序的其余部分是不安全的),您应该将
session\u id()
绑定到客户端IP。这将有助于防止会话劫持和cookie窃取+我的解释很好。@ʰᵈˑ谢谢:)说到将会话绑定到IP。。。有些人可能会争辩说,这不是100%可靠的,因为(至少在过去)在某些情况下,同一用户可以连接不同的IP,即使是在不同的类别(例如公司)。另一个好主意是将会话绑定到浏览器的用户代理,因为会话的长度肯定不会改变。哦,是的,我同意。我的意思是检查
session\u id()
是否对IP有效,而不是通过传入IP来获取
session\u id()
。这样,如果有人劫持你的cookie并获取你的
PHPSESSID
,他们必须在同一个网络上,或者欺骗他们的IP(?)——这使得劫持变得更难,是的,但不可能?不确定。是的,我明白你的意思。将IP(和/或用户代理)存储在
$\u SESSION
中,并在每个页面上验证它,这很容易。事实上,我相信@Qualcuno解释了cookie和SESSION之间的区别,并很好地触及了安全方面,从而保证了一个可接受的答案-但这取决于你
:)
if ($_SESSION['authenticate'] === 'fail'){do something}
else if ($_SESSION['authenticate'] === 'pass'){do something else}
session.use_cookies 1
session.use_only_cookies 1