Php 当使用system()和用户输入时,以root用户身份运行C是否危险?

Php 当使用system()和用户输入时,以root用户身份运行C是否危险?,php,c,shell,Php,C,Shell,基本上,我想要实现的是通过php在java控制台中运行命令。我想这样做的方式可能太牵强了,所以如果有更简单的方式,请告诉我 所以我想到的是在php中使用exec()或shell\u exec()通过tmux会话输入命令。问题是apache在www数据上运行,用户无法创建tmux会话(出于某种原因)。 在互联网上搜索了很长时间后,我发现。以root用户身份执行应用程序的一种方法。即使它是从另一个用户执行的。我尝试了这个,这显然是可行的,但现在我想通过参数从php运行命令。但我不确定这是否会因为注射

基本上,我想要实现的是通过php在java控制台中运行命令。我想这样做的方式可能太牵强了,所以如果有更简单的方式,请告诉我

所以我想到的是在php中使用
exec()
shell\u exec()
通过tmux会话输入命令。问题是apache在www数据上运行,用户无法创建tmux会话(出于某种原因)。 在互联网上搜索了很长时间后,我发现。以root用户身份执行应用程序的一种方法。即使它是从另一个用户执行的。我尝试了这个,这显然是可行的,但现在我想通过参数从php运行命令。但我不确定这是否会因为注射而不安全。毕竟,它确实需要用户输入。或者只要我在php中使用
escapeshellarg()
escapeshellcmd()
,我就不必担心这个问题了


提前感谢您的帮助:)

在root(通过sudo)执行的脚本中,我将以下内容用于检查传递的参数。我猜想您必须以相同的方式检查每一行输入,然后检查每一行上的命令,以确定是否要执行它

如果您的服务器不是以root用户身份运行,而是以其他“普通”用户身份运行,则会更加安全。所以我同意这是个坏主意,但如果我必须这么做,那么我会用这个:

# Check to make sure the parameters do not have special characters
security_check () {
  # echo does not execute the contents of "$@" provided it is inside
  # double quotes.
  SC_PARMS1="`echo \"$@\" | tr \"\\\`<>|\" \"xxxx\"`"
  SC_PARMS2="`echo \"$@\" | tr \"\\\`<>|\" \"yyyy\"`"
  # Can't use "$@" in if test as it executes the contents, hence we
  # must compare 2 different converted strings.
  if [ "$SC_PARMS1" != "$SC_PARMS2" ]; then
    echo "`uname -n`: Security abort in: $0 $@"
    return 1
  fi
  unset SC_PARMS1 SC_PARMS2
  return 0
}

while read line ; do
    security_check "$line"
    if [ $? = 0 ]; then
        echo "We could execute $line"
        # Now we need to check the commands we allow
        if [ "$line" = "ls" ]; then
            # This test is very rudimentary, you might need to do a set -- $line and
            # examine more than just the command ($1 at that point)
            eval $line
        fi
    fi
done
#检查以确保参数没有特殊字符
安全检查(){
#echo不执行“$@”的内容,前提是它在内部
#双引号。
SC|u PARMS1=“`echo\\'$@\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'xxxx\'”
SC|u PARMS2=“`echo\'$@\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'yyyy\'”
#在执行内容时,不能在if测试中使用“$@”,因此
#必须比较两个不同的转换字符串。
如果[“$SC_PARMS1”!=“$SC_PARMS2”];则
echo“`uname-n`:在:$0$@”中安全中止
返回1
fi
取消SC_PARMS1 SC_PARMS2
返回0
}
读行时;做
安全检查“$line”
如果[$?=0];然后
echo“我们可以执行$line”
#现在我们需要检查允许的命令
如果[“$line”=“ls”];然后
#这个测试非常初级,您可能需要做一组--$line和
#检查的不仅仅是命令($1)
eval$行
fi
fi
完成
以root用户身份运行任何类型的服务器都不是一个好主意。尝试查看是否可以为真正的超级用户需求保留root,并使用服务帐户(即非root帐户)运行应用程序。

是。

(括号中的这一行只是为了满足至少30个字符的要求。)

这是安全的

只要它能正确逃逸。这听起来比正确地转义输入并确保其100%安全要容易得多


但是你确定所有这些访问都是必需的吗?如果攻击者试图以某种方式进入,您应该限制他们的访问权限。拥有root访问权限比只拥有一个用户帐户要糟糕得多

你的意思是要运行一个提供基于文本的用户界面的Java程序吗?我相信这是不安全的,允许注入。独立于注入问题,你真的希望任意用户能够以root身份在服务器上运行任意命令吗?在我看来,称之为“不安全”似乎是一种轻描淡写的说法。@JohnBollinger是的,没错。更具体地说,我正在尝试与minecraft服务器通信。@rici-hmh,是的,我想是的。还有其他选择吗?或者,如果我逃避某些字符,问题会得到解决吗?好的,我会看看是否能找到另一种方法。但如果我找不到任何东西,我会用这个。谢谢