Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-这是允许用户提供正则表达式的安全方法吗_Php_Regex_User Input_Sanitization_Remote Execution - Fatal编程技术网

PHP-这是允许用户提供正则表达式的安全方法吗

PHP-这是允许用户提供正则表达式的安全方法吗,php,regex,user-input,sanitization,remote-execution,Php,Regex,User Input,Sanitization,Remote Execution,我希望允许提交小型用户定义的正则表达式进行测试。但是,从运行服务器使用到更坏的代码>代码>(< /代码>用法),还有很多问题需要考虑。 据我所知,我已经处理了我在下面代码中能想到的所有问题。他们有我没想到的攻击载体吗?(我知道这是一个相当天真的问题) 如果您想查看空字节注入的示例: $user_regex = '.+~e' . chr(0); $user_match = 'system("whoami")'; var_dump(preg_replace("~$user_regex~u", $u

我希望允许提交小型用户定义的正则表达式进行测试。但是,从运行服务器使用到更坏的代码>代码>(< /代码>用法),还有很多问题需要考虑。 据我所知,我已经处理了我在下面代码中能想到的所有问题。他们有我没想到的攻击载体吗?(我知道这是一个相当天真的问题)

如果您想查看
空字节
注入的示例:

$user_regex = '.+~e' . chr(0);
$user_match = 'system("whoami")';

var_dump(preg_replace("~$user_regex~u", $user_match, 'foo'));

显然,测试字符串是否为有效正则表达式的唯一方法是编译它(这是在调用任何匹配函数时完成的),因此您所做的非常有意义

从5.4开始,您添加的空字节保护实际上是不必要的,因为已经在和中进行了检查。特别是后者是一个相对较新(2011年)的问题

设置一个较低的回溯和递归限制是一个足够好的沙盒,也许您还可以检查最大长度


也就是说,这个特定的解决方案不提供使用修饰符的能力,例如
/s
/i
/m
;也许这不是您目前主要关心的问题,而是值得思考的:)

您可以告诉他们输入类似{expression}的内容,然后使用preg_replace()。这样,他们只使用你允许他们使用的东西。

如果(strpos($regex,0)!==false&&trim($regex)){return false;}
在顶部会更容易理解:)谢谢,我更新了它。另外,请注意
chr(0)!=0
Ah,检查文档,您将看到的第二个参数可以是整数值:)只是一个旁注:您可能希望将分隔符和正则表达式修饰符存储在单独的变量中。这样“用户”就可以定义自己的修饰符,并在提供正则表达式时考虑到这一点。当然,你可以限制选择。修改器也是如此。我会想象像
$delimiter这样的东西$正则表达式$定界符$修饰符
。请注意,如果您使用括号作为分隔符(f.ex.
“($regex)u”
),您的用户不必猜测应该另外转义哪个分隔符。空字节保护实际上是必要的。PHP只检查结尾分隔符前的空字节。@谢谢,我已经相应地更新了答案;我们都是对的:)
$user_regex = '.+~e' . chr(0);
$user_match = 'system("whoami")';

var_dump(preg_replace("~$user_regex~u", $user_match, 'foo'));