【问题标题】:Setting a SESSION variable directly from a POST value直接从 POST 值设置 SESSION 变量
【发布时间】:2014-03-07 05:41:07
【问题描述】:

我有两个向数据库添加数据的表单。第一个表单要求提供基本详细信息(姓名、电子邮件、电话等)并存储它们。更进一步,用户可以向他们的帐户添加选项(例如接收时事通讯、接收促销等)

第二种形式使用会话变量来验证用户是谁:当他们登录或注册时,他们的电子邮件地址被设置为会话变量,如下所示:

$_SESSION['buyer_email'] = $_POST['email'];

但是我提交到数据库的所有数据都使用 PDO 在提交之前对其进行清理,所以我的问题是:

上面这行代码可以安全使用吗?它还没有经过这样的消毒,虽然我无法想到任何事情,但他们有什么方法可以操纵这个直接的 POST -> SESSION 吗?

使用 PDO 提交数据,然后从数据库中检索电子邮件并将返回的值设置为会话变量会更好,还是这种做法过大和不必要?

【问题讨论】:

  • 最好不要相信用户输入,并在将其设置为会话变量之前检查$_POST['email'] 中的电子邮件(格式)是否正确。
  • 在任何地方使用放置在会话中的值都是一个问题。规则 #1 - 验证输入,转义输出。
  • 所以你说我应该对 post 值做 something (正如我所怀疑的那样!) - 因为我对电子邮件地址做所有正常的事情(例如格式, PDO 的事情,等等。)那么将会话变量从通过检查的值设置到数据库中是否有意义?

标签: php mysql session pdo


【解决方案1】:

我假设您将使用$_SESSION['buyer_email'] - 就像显示它一样。为避免跨站点脚本等问题。您应该始终将其转义然后使用它。

【讨论】:

  • 不,会话变量将仅用于验证 - 显示的有关用户的任何数据都将来自数据库。
  • 所以验证它,转义它,将它发送到数据库,然后从数据库中检索它并将会话变量设置为它。这样存储的电子邮件地址将与会话变量相同(当然是安全的),因此可以通过在数据库中查找会话电子邮件来识别用户是谁?
  • 如果该值只是设置为未使用,那么没有理由逃避它。但是,这是一个很好的做法。这样以后在您决定要展示它的道路上是安全的。
  • 啊遇到一个相关的问题!我无法从数据库中检索电子邮件,因为我没有对该用户的电子邮件地址的任何引用! (以前我在查询“选择电子邮件 = 会话变量”中使用预设会话变量。我想我必须转义它并手动执行 PDO 所做的事情并以这种方式设置它,或者是否有另一种方法可以从中检索它数据库??
  • 您让 PDO 使用占位符值为您执行 SQL 转义,并且您应该执行 HTML 转义以防止 XSS only 在带有 echo 的页面上呈现它。否则将其保留为原始形式。
猜你喜欢
  • 1970-01-01
  • 2013-08-25
  • 1970-01-01
  • 2013-02-07
  • 1970-01-01
  • 1970-01-01
  • 2012-08-12
  • 2020-08-13
  • 1970-01-01
相关资源
最近更新 更多