Php 使用mysql跟踪会话而不是信任服务器?

Php 使用mysql跟踪会话而不是信任服务器?,php,mysql,Php,Mysql,一些上下文…如果你不耐烦,跳到底部提问 我正试图限制拥有有效用户名和密码对的用户访问我(未来)网站的四个页面。为此,我有一个简单的PHP/HTML表单…在我的PHP/HTML表单中,客户端键入用户名和密码,点击“提交”…数据进入POST,另一个PHP脚本使用mySQL数据库中的SELECT验证用户/密码对 用户密码表: uid(主键,INT),用户名(varchar 32),密码(char 128) 如果匹配有效,则会查找访问表以查看特定用户名有权访问的页面(1表示访问,0表示无访问): 用户访

一些上下文…如果你不耐烦,跳到底部提问

我正试图限制拥有有效用户名和密码对的用户访问我(未来)网站的四个页面。为此,我有一个简单的PHP/HTML表单…在我的PHP/HTML表单中,客户端键入用户名和密码,点击“提交”…数据进入POST,另一个PHP脚本使用mySQL数据库中的SELECT验证用户/密码对

用户密码表: uid(主键,INT),用户名(varchar 32),密码(char 128)

如果匹配有效,则会查找访问表以查看特定用户名有权访问的页面(1表示访问,0表示无访问):

用户访问表: uid(主键,INT)、securename0(TINYINT)、securepage1(TINYINT)

然后,PHP脚本打印出指向他们可以访问的安全页面的链接。如果我理解正确,我读过的文章和书籍会说,通常在客户端存储一个cookie,会话ID指向服务器上的会话文件,该文件存储用户名/密码对和任何其他会话变量,直到超时或用户注销

我不想把钱花在专用服务器上。因此,所有PHP会话信息都集中保存在服务器上,以及运行在服务器上的其他客户的其他六个网站。这让我觉得非常不安全

问题是……绕过所有这些,在我自己的mySQL表中存储/跟踪每个用户的会话信息会更安全吗?ie。类似这样:

会话表: sessionkey(PRIMARYKEY,CHAR(128)),uid(INT),expiretimedate(DATETIME),accesstosecurepage0(TINYINT),accesstosecurepage1(TINYINT)

因此,当用户点击任何“安全”页面时,它将检查他们的会话id cookie(如果存在),然后在会话表上进行选择以查看是否存在特定的“会话密钥”,然后根据accesstosecurepage0、1、2等的设置为他们提供访问权限


这会比其他方法更好吗?还是我在浪费时间?

我认为这不会使您的应用程序更安全。当有人检索另一个用户的会话ID并假装是他们时,就会发生会话劫持。您的会话表不会阻止这种情况发生。(顺便说一句,我跳到了底部,希望我没有错过任何重要的细节:)


它甚至可能会降低安全性,因为您现在给了劫持者两种窃取会话数据的方法:一种是通过文件系统,另一种是通过数据库。至于哪一个比另一个更安全,我不太确定,但我认为这取决于你自己对其中一个的安全程度。

这个问题和会话本身一样古老,尽管可能与你的原因稍有不同。安全性不是问题,因为会话劫持发生在某人获得用户的会话ID并将其发送到服务器时。因此,使用数据库存储会话数据与在计算机上使用文件一样不安全——这基本上是相同的

当需要多台服务器来承载一个站点,或者需要跨不同但相关的域存储会话时,往往会使用数据库会话。然而,如果不使用预先构建的框架,那么从头开始建立这个框架需要做更多的工作

如果您不需要此功能,那么使用标准会话就足够了。

可能更安全,是的——毕竟,共享主机是您担心的那种安全漏洞的臭名昭著的目标,但是,MySQL服务器与所有其他资源一样,由其他用户共享和访问,最坏的情况是,损失完全相同

然而,对效率的打击可能是无法忍受的,而且几乎肯定会减轻额外的内心平静。为了完全避免使用会话或类似的机制,您甚至没有一种简单的方法来缓存数据库结果,并且每个页面加载、每个人的查询(一个不必要的查询)很可能被证明是不可接受的


更不用说,您正在以SQL注入的形式将一类漏洞替换为一类全新的漏洞。

但用于存储会话的临时文件通常未加密,并且在共享托管环境中具有
o+r
权限。到目前为止,将会话保存在DB中可能会更安全一些,它们不应该是未加密的o_OI concurr。会话数据的存储位置或多或少都不安全(假设服务器文件系统和数据库是安全的)。不过,它还有其他好处,例如,如果您运行多个web服务器,但需要会话内容在所有服务器上保持一致。@prodigitalson:通常数据库的配置要比文件系统好得多(可能是因为它需要的知识更少;)。更糟糕的是,虽然您通常可以调整自己文件(如PHP脚本、配置文件等)的读取权限,但您通常无法访问PHP.ini来调整会话数据的位置或权限。@NiklasB。另一个需要考虑的是,有很多代码不能防止SQL注入攻击。数据库仅作为数据访问代码是安全的。从这个意义上讲,它可能不太安全。嗯,这不是共享主机不太“安全”的唯一原因。在许多情况下,服务器没有得到适当的保护,无法防止权限升级或未经授权的文件访问(如从其他客户处读取数据库配置文件)。如果你不想花很多钱的话,也许VServer是一种选择?在德国,每个月只需几欧元。是的,但是DB服务器的默认配置通常比文件系统权限的配置好(这需要额外的知识和经常缺少的调整),这是我给它“潜力”的唯一原因