我还没有在这里找到这个问题,我已经对此做了一些快速的谷歌研究,但我无法找到这个问题的明确或好的答案。
是否可以在输入字段中注入一段php代码。这实际上有用。
//for instance.
//Ill fill in '"test()"' in the field.
<input type="text" name="input" value="'"test()"'">
$injection = $_POST/*(or $_GET)*/['input']; // coming from the input
public function test(){
echo "injection successful";
}
这可能吗?
答案 0 :(得分:7)
有可能,但不是那样。如果你在脚本中执行的操作,那么代码将按原样(作为字符串)分配给变量$ injection。
但是你可以这样执行:
$injection = $_POST/*(or $_GET)*/['input'];
eval($injection);
还有其他方法,但都有相同的问题:您必须将字符串实际评估为执行它的代码。 eval
是最明显的解决方案。
但是实施这个时要非常小心!如果您为外界打开这样的表单,每个人都可以执行任何脚本,包括可能破坏您的服务器或窃取您的密码的脚本。
答案 1 :(得分:1)
您发布的代码段无害,但根据您对用户提供的数据的处理方式,可以在code-injection attack中使用。链接的维基有一些例子,其中有几个:
$posted = $_POST['user_input'];
eval($posted);//<--- NEVER DO THIS
但是,10年后,我从来没有 甚至已经接近我甚至担心梦想不得不倒下的地步这条路线。
在将用户数据传递给exec
时,另一个可能性稍微不太可能的漏洞是不可避免的转义:
$cmdArgument = $_POST['flag'];
exec('ls '.$cmdArgument, $return, $status);
如果我将此作为&#34;标记&#34; 值传递给您,可能会让您感到脆弱:
-lta && /usr/bin/env php -r 'echo __DIR__;'
并使用该输入开始搞乱您的文件系统
要再次保护,请使用escapeshellarg
和escapeshellcmd
函数来清理输入。
更常见,同样危险但更容易被忽视的是:
$requested = $_GET['page'];
require $requested.'.php';
相反,如果您想要require
这样的脚本,那么更安全,更简单的方法就是:
switch ($_GET['page'])
{
case 'admin':
require 'admin.php';
break;
case 'user':
require 'user.php';
break;
default:
require 'error.php';
break;
}
答案 2 :(得分:0)
PHP exec command可以执行发布到服务器的代码。否则,在文本框中编写的PHP代码将不会作为PHP进行交互,而是作为普通字符串进行交互。