2014-10-16 28 views
1

我从来没有想过要这样做,并且不确定风险。这是每个页面的一次会话,取而代之的是访问的下一个页面。将完整查询添加到PHP会话变量?

做类似下面的事情有什么安全风险?如果有的话?

$_SESSION['somename'] = "SELECT `something` FROM `table` WHERE `something`='blah'"; 

这是一个安全的方法,如果不是,什么是更安全的方法来存储将被替换的一次性查询?

将查询存储在临时mysql表中可能更安全。但我想避免额外的mysql调用。

+0

好吧,它只是一个像其他任何字符串,但我没有看到的重点。为什么查询不在页面中? – 2014-10-16 22:00:49

+2

我不会这样做。你提供一个表名,如果你没有正确防范SQL注入 - 我现在可以尝试去掉它。为什么冒险呢? – 2014-10-16 22:01:52

+0

ajax远程文件,读取会话查询。查询从不相同。异步提供了有关正在发送的内容的可读信息。 – 2014-10-16 22:03:15

回答

1

由于可能通过SQL注入来泄露可能被DROPPED泄露的表名,因此使用PHP设置变量不是一种安全的方法。现在,会话变量存储在服务器上,不能被浏览器访问。但是,为什么会引入一种坏习惯,可能会导致开发团队中不熟悉的人使用它来设置cookie?那么你有一个很大的问题,开始是良性的。将数据放在充当用户标识符的PHP会话变量中会更好。

2

它不应该太有害(见下文),但这是不好的做法。

数据库查询是数据/模型层,会话管理是一个完全不同的话题。你会在keeping those separate中做一个大忙。

此外,如果您需要缓存某些内容,则应缓存结果,而不是查询。但是,您可以通过向结果添加标识符来确保结果与用户相关联。

例如,您可以将数据库查询结果存储在Memcached中的数组中,其中数组键是用户ID。

如果您担心MySQL调用的性能,您应该查看规范化和正确的索引。

关于潜在危害的一点说明:会话数据存储在文件系统中或(很少)存储在内存中。在共享主机系统上,可能会或可能不会执行阻止其他用户读取会话数据的措施。另一方面,您的PHP源代码也可以以明文形式读取,并且通常具有相同的权限,所以没有额外的攻击媒介。如果其他人可以写入会话数据,将引入真正的安全威胁。但我希望在严肃的托管业务的机器上没有这样的设置。