是否可以通过输入字段注入PHP代码?

时间:2014-05-23 09:54:23

标签: php code-injection

我还没有在这里找到这个问题,我已经对此做了一些快速的谷歌研究,但我无法找到这个问题的明确或好的答案。

是否可以在输入字段中注入一段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";
}

这可能吗?

3 个答案:

答案 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__;'

并使用该输入开始搞乱您的文件系统 要再次保护,请使用escapeshellargescapeshellcmd函数来清理输入。

更常见,同样危险但更容易被忽视的是:

$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进行交互,而是作为普通字符串进行交互。