Php 从输入表单到C源代码,检查不允许的关键字

Php 从输入表单到C源代码,检查不允许的关键字,php,c,Php,C,从html表单输入区域,我编写了一个C源文件(使用PHP‘file_put_contents’),然后编译并运行它(),并使用PHP打印结果 但是在运行之前,我检查输入数据,把我认为是C禁止的单词,比如“fOPEN”,“GOTO”等等。(使用PHP'strpos') 为什么是“fopen”?因为我不希望使用此表单的用户打开PHP源文件并从中获取合理的数据 我的问题是:是否有可能使用转义序列或黑客使用的任何其他东西来使用这些被禁止的词语 实际源代码的摘录: -汇编: $reponseModele

从html表单输入区域,我编写了一个C源文件(使用PHP‘file_put_contents’),然后编译并运行它(),并使用PHP打印结果

<>但是在运行之前,我检查输入数据,把我认为是C禁止的单词,比如“fOPEN”,“GOTO”等等。(使用PHP'strpos')

为什么是“fopen”?因为我不希望使用此表单的用户打开PHP源文件并从中获取合理的数据

我的问题是:是否有可能使用转义序列或黑客使用的任何其他东西来使用这些被禁止的词语

实际源代码的摘录: -汇编:

$reponseModele = shell_exec("gcc -o source.exe source.c  2>&1");
$contenuTest = "static int ctz = 0; \n#include <stdlib.h> \n" . "$srcprog";
  • 要运行(使用“scanf”的输入数据)

    $reponseTest=shell_exec(“gcc-o cource.exe&1”)

编辑1 PHP源文件中没有任何秘密(除了数据库密码…但不是“根”密码…)

我考虑到这样一个事实,即安全性非常低,但由于它是一个个人网站,对于教育和学生评估,风险是有限的,除非用户可以从此网站发起大规模攻击

正如我在评论中所说的,我检查了一些C关键字(从您的评论中,我添加了'asm'、'extern'、'volatile'),检查了循环

要控制的东西可能是“malloc”

仍然要记住的问题是:是否有可能转义字符以便执行“fopen”或其他关键字

更多的PHP代码将有所帮助 $srcprog是主要的C源代码,我添加了一个计数(我将更改名称…)$contenuTest是要编译的代码:

$reponseModele = shell_exec("gcc -o source.exe source.c  2>&1");
$contenuTest = "static int ctz = 0; \n#include <stdlib.h> \n" . "$srcprog";

将文字列入黑名单是不够的。无法验证远程用户提供的代码是否不会尝试任何恶意行为。无法通过限制程序的源文本来防止恶意访问:如果要运行不受信任的代码,则需要操作系统沙箱(例如,在虚拟机内运行代码,并将该机器与其他所有内容隔离)。(即便如此,也存在幽灵攻击VM主机的危险。)

让您了解这里的危险:编写一个在堆栈上构造任意字节的程序,然后“意外地”将执行返回到该缓冲区,这将是微不足道的;这意味着攻击者可以编写直接执行的任意机器代码。编译器对此无能为力(它可能会发出警告,但这些警告可以被禁用),并且关键字黑名单不会阻止您在堆栈上分配值或从函数返回,如果您希望程序能够执行任何有用的操作,则不会

更不用说这里有很多琐碎的拒绝服务攻击:攻击者只需编写一个程序就可以攻击,或者永远消耗100%的CPU,或者编写许多其他东西,这些东西可能不是明显恶意的,但会使您的服务器无法用于任何其他工作


一位评论员提到这一点,证明这种方法永远不可能奏效。更有力的证明是,它证明了程序的任何非平凡语义属性都是不可判定的。本质上,如果给你一段代码,问你“这段代码是否做X”任何X值,总有一些代码是做X的,但如果你不实际执行它,看看会发生什么,你就无法理解这一点。

黑名单词是不够的。无法验证远程用户提供的代码是否不会尝试任何恶意行为。无法通过限制程序的源文本来防止恶意访问:如果要运行不受信任的代码,则需要操作系统沙箱(例如,在虚拟机内运行代码,并将该机器与其他所有内容隔离)。(即便如此,也存在幽灵攻击VM主机的危险。)

让您了解这里的危险:编写一个在堆栈上构造任意字节的程序,然后“意外地”将执行返回到该缓冲区,这将是微不足道的;这意味着攻击者可以编写直接执行的任意机器代码。编译器对此无能为力(它可能会发出警告,但这些警告可以被禁用),并且关键字黑名单不会阻止您在堆栈上分配值或从函数返回,如果您希望程序能够执行任何有用的操作,则不会

更不用说这里有很多琐碎的拒绝服务攻击:攻击者只需编写一个程序就可以攻击,或者永远消耗100%的CPU,或者编写许多其他东西,这些东西可能不是明显恶意的,但会使您的服务器无法用于任何其他工作


一位评论员提到这一点,证明这种方法永远不可能奏效。更有力的证明是,它证明了程序的任何非平凡语义属性都是不可判定的。本质上,如果给你一段代码,问你“这段代码是否做X”任何X值,总有一些代码是做X的,但如果你不实际执行它,看看会发生什么,你就无法理解这一点。

仅从要点来看,您试图做的基本上类似于使用php的用户帐户运行ssh服务器,而不使用密码。我的意思是,我不能阻止你,但请注意你所做的是非常非常危险的!支持@DavidStockinger。简单的过滤器不起作用,有一些简单的方法可以解决它们,例如内联汇编程序、宏魔术等。如果可以检测到程序是正确的,并且没有做任何无效的事情,那么您已经解决了暂停问题(阅读相关内容)。另外,如果您的PHP源文件本身包含敏感数据,这也表明缺乏良好的安全卫生。不要在源代码中嵌入秘密,而是让敏感数据成为环境的一个属性,由您的部署机制控制。@DavidStockinger和成员:e