【问题标题】:Do I need to escape echo'd strings for console output?我是否需要为控制台输出转义回显字符串?
【发布时间】:2013-09-15 11:06:45
【问题描述】:

我无法确定我是否在这里过于偏执,但如果我从命令行运行 PHP 脚本并且该脚本回显了用户定义的内容,我是否需要转义它?

例如,这会不会有潜在的危险,或者文本是否会直接以纯文本的形式回显?

$test = 'shutdown -h now';
echo $test;

如果我确实需要转义,是不是我想要的 escapeshellarg() 函数?

【问题讨论】:

  • 是的。如果您将用户定义的参数传递给exec()shell_exec(),您应该这样做。
  • 这个问题明确说明是关于echoing out user defined content,与exec() 或类似的无关。

标签: php shell


【解决方案1】:

shell 解释来自标准输入的命令,但您正在写入标准输出。所以一切都很好

但是,为了防止您不小心将它们复制粘贴到终端中,逃避它们绝不是一个坏主意

【讨论】:

  • 感谢 hek2mgl,这是有道理的 =)。我想我只是又想太多了!
  • @Ric np :) 另请注意 ComFreek 的回答。某些序列可能会破坏您的终端输出
【解决方案2】:

我不完全同意其他答案。

你写到标准输出是对的,所以输入不会被解释为命令,但是一些特殊的控制序列可以调用一些与shell相关的行为。例如,请参阅here

这些不能调用其他程序或命令,但它们会惹恼用户(他必须输入 reset 才能重置 shell)。

【讨论】:

  • 有趣... ComFreek,您将如何防范?执行(“重置”);也许最后?
  • @Ric exec('reset'); 听起来不错!如果您正在输出随机数据(除了手动转义它们),我目前看不到其他方法
  • @Ric 我认为转义并不像人们想象的那么复杂。这些字符应该很容易在字符串流中捕获。我不是这方面的专家,所以我不能提供任何进一步的建议。此链接可能对您有所帮助:stackoverflow.com/questions/6534556/…
  • @hek2mgl reset 不会重置整个终端吗?然后将清除输出。
【解决方案3】:

应该没有危险。用户不能以这种方式调用任何命令。当然,如果您没有使用 exec() 或两者之间的类似功能。请注意,从命令行向 phpcli 传递任何参数都是危险的。因为这个参数可能包含“`”,所以在shell中执行命令得到结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 2014-03-20
    • 2019-05-02
    • 2011-05-16
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    相关资源
    最近更新 更多