【发布时间】:2016-10-18 13:24:29
【问题描述】:
我有一个用作本地网络服务器的 openwrt 路由器,我创建了一个网页以在我的 3G 调制解调器上拨打 USSD,脚本如下所示:
<html>
<title>CHECK USSD</title>
<body>
<?php
if($_POST['send']){
$ussd=$_POST['ussd'];
exec('ussd.py '.$ussd,$out);
echo "Result: ".$out[0];
}
?>
<form action="" method="post">
USSD :<input type="text" autofocus name="ussd" size="14" value="">
<input name="send" type="submit" value="Send Ussd">
</form>
</body>
</html>
ussd.py 是我用来检查 USSD 的 python 脚本。问题在于,当用户尝试在输入框中输入某种脚本时,例如:$(echo "hacked" > /www/index.html) 或$(rm -fr /root/*),这些脚本也会被执行。所以人们可以很容易地破解我的路由器。我怎样才能防止这种情况发生?
【问题讨论】:
-
您应该彻底验证您的用户输入,然后再将其输入
exec。使用正则表达式。任何与您想要接受作为输入的紧密定义不匹配的内容都应立即丢弃。 -
@FranzGleichmann 同意,仅仅使用
escapeshellarg并认为你已经完成了是不够安全的。 -
您可以将接受的命令列表放在一个数组中,并在运行输入的命令之前检查它是否与任何接受的命令匹配