【问题标题】:use php variables for awk regex commands将 php 变量用于 awk 正则表达式命令
【发布时间】:2015-05-03 07:27:34
【问题描述】:

尝试使用 php 实现自动建议。使用 awk 生成的自动建议列表

    $input= $_GET["term"];
   $suggest=array();
   exec('awk \'BEGIN{FS=","}/.$input./{print $2,"-cost-",$1}\' 3.txt',$suggest);
   echo json_encode($suggest)

代替 $input 来测试 autosuggest 我使用了一个 charachrecter eg.A,工作正常。但是我无法将动态字符作为 awk 的输入。 .$input 出了点问题。不知道怎么写转义字符

提前致谢

【问题讨论】:

  • 您确定将 GET 参数替换为未经处理的 shell 命令是个好主意吗?如果我访问你的网站并通过term=';rm -Rf / #,你不太可能喜欢这个结果。

标签: php regex awk


【解决方案1】:

转身

exec('awk \'BEGIN{FS=","}/.$input./{print $2,"-cost-",$1}\' 3.txt',$suggest);

进入:

exec('awk \'BEGIN{FS=","}/'.$input.'/{print $2,"-cost-",$1}\' 3.txt',$suggest);

您忘记终止第一个',这是必需的,因为您无法在单引号字符串中展开变量。

旁注:正如 cmets 中所指出的,您可能需要三思而后行,盲目接受 GET 参数作为 shell 命令,而不进行某种安全检查。用户可以并且很快就会找到利用该漏洞的方法...

【讨论】:

  • 我认为更好的解决方案是在 exec 调用之前使用 putenv("input=$input") 并使用 exec('awk -F, -v input="$input" \'$0 ~ input { print $2, "-cost-", $1 }\' 3.txt', $suggest) 将变量从环境中取出,或者更好的是,使用 proc_open 来做同样的事情。免责声明:代码未经测试,生锈的 php-fu。
  • 感谢您的及时回复。 @Wintermute 您能否提供一些关键词以了解有关安全检查的更多信息
  • @user1869714 是的,我倾向于同意 Wintermute 的评论。由于我对 PHP 也很生疏,所以我不会试图用我的任何进一步建议来破坏答案,但请仔细研究一下。
  • 我认为可以使用exec('awk -F, -v input=' . escapeshellarg($input) . ' \'$0 ~ input { print $2, "-cost-", $1 }\' 3.txt', $suggest);,再考虑一下。 Linkescapeshellarg 文档。 OWASP 是一个很好的资源,在code injectioncommand injection 上有相关文章。这可以作为一个起点。
猜你喜欢
  • 2020-11-14
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
  • 2020-09-20
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多