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

时间:2012-03-02 23:35:36

标签: php mysql

某些背景信息......如果您不耐烦,请跳到底部查询...

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

userpassword表: uid(PRIMARY KEY,INT),用户名(varchar 32),密码(char 128)

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

useraccess表: uid(PRIMARY KEY,INT),securename0(TINYINT),securepage1(TINYINT)......

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

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

问题是......在我自己的mySQL表中绕过所有这些并存储/跟踪每用户会话信息会更安全吗?即。像这样的东西:

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

因此,当用户点击任何“安全”页面时,它会检查他们的会话ID cookie(如果存在),然后在会话表上执行SELECT以查看是否存在该特定“sessionkey”,然后根据它们授予他们访问权限什么accessstosecurepage0,1,2等。设置为。

这会比替代方案更好还是我在浪费时间?

3 个答案:

答案 0 :(得分:1)

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

它甚至可能使安全性降低,因为您现在正在为劫持者提供两种窃取会话数据的方法:一种是通过文件系统,一种是通过数据库。至于哪一个比另一个更安全,我不太确定,但我认为这取决于你自己保护任何一个。

答案 1 :(得分:1)

这个问题与会话本身一样悠久,尽管可能与你的原因略有不同。安全性不是问题,因为当有人获取用户的会话ID并将其发送到服务器时会发生会话劫持。因此,使用数据库存储会话数据与在机器上使用文件一样不安全 - 它基本上是相同的。

当需要多个服务器来托管一个站点,或者需要跨不同但相关的域存储会话时,往往会使用数据库会话。但是,如果不使用预先构建的框架,那么从头开始设置它还需要做更多的工作。

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

答案 2 :(得分:0)

潜在的更安全,是的 - 毕竟,共享主机是一个臭名昭着的目标,正是您所担心的那种安全漏洞,但是,MySQL服务器再一次被其他用户共享和访问就像所有其他资源一样,在最坏的情况下,损坏是完全相同的。

然而,效率的提升可能会令人无法忍受,几乎可以肯定会减轻额外的安心。为了完全避免使用会话或类似机制,你甚至没有一种简单的方法来缓存数据库结果和每个页面加载的查询 - 每个人 - 一个不必要的查询 - 可能被证明是不可接受的

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