【问题标题】:system function call, any suggestions?系统函数调用,有什么建议吗?
【发布时间】:2012-02-22 11:31:16
【问题描述】:

我有一个用户需要登录的网站,并且身份验证基于 SESSION 变量和 DB。

为了简化,让我这样描述: 我有属于组的简单用户,我有组管理员。他们都拥有订阅。当组经理决定升级服务时,会立即为他的所有用户完成。我需要更新所有订阅,并且需要单独为每个订阅收费。

所以。我需要做的就是去DB,开始一个一个的去:

1. charge
2. receive status from cc company.
3. update the DB entry accordingly.
4. repeat for next simple user

问题是,当组管理员更新服务时,我需要启动批处理,这可能需要一段时间才能完成,但如果组管理员出于某种原因关闭浏览器(按下停止按钮, 断电, 无数其他原因导致连接断开), 动作无法完成。并且用户不会得到治疗。

我认为解决此问题的方法是使用 PHP 脚本启动 shell 命令。我会将参数发送到像 system("php batch.php?ID=$group_id?process=all") 这样的脚本,这反过来可能会完成工作。

我的问题是,我习惯于通过 SESSION 参数等对我的用户和整个网站的数据进行身份验证。但在这种情况下(调用系统命令),我不能真正去检查谁实际解雇了那个脚本。它可能是用户,也可能是我想要的脚本。

我想阻止用户访问该脚本,并且我希望该脚本在发布后完成。

我怎样才能做到这一点?还有其他建议吗?

谢谢!

【问题讨论】:

  • 在触发该系统调用之前进行身份验证.. 并防止 Web 服务器访问 bach.php
  • 太棒了,如何防止访问该脚本?
  • 检查您的网络服务器的文档...谷歌?所以?

标签: php shell system


【解决方案1】:
  1. 将值作为 argv 参数传递 (php batch.php $group_id all)
  2. 检查这些是否存在于$_SERVER['argv']

为了记录,$_SERVER['argv'] 是命令行的$_GET。网页不能设置 argv 值,所以你很安全。

当然最好不要将此文件放在您的网络目录中。

【讨论】:

  • 好吧,我找不到 $_SYSTEM 数组,但显然有一个保留的 $argv[], $argc 会有所帮助,谢谢!
  • 等等,什么?我的意思是$_SERVER。更新了我的答案。你绝对应该避免使用 $argv 和 $argc。
  • 哦...为什么不使用 argv 和 argc 呢?
  • 总是使用超全局变量。就这么简单:-)
  • 我知道这是正确的答案,但我想知道为什么
猜你喜欢
  • 2019-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多