gpt4 book ai didi

javascript - 用户定义的正则表达式安全问题

转载 作者:可可西里 更新时间:2023-11-01 14:03:03 24 4
gpt4 key购买 nike

如果我使用用户定义的输入字符串在我的服务器上运行用户定义的正则表达式,是否存在任何安全问题?我不是在问单一语言,而是任何语言,PHP 是我想了解的主要语言之一。

例如,如果我有以下代码:

<?php

if(isset($_POST['regex'])) {
preg_match($_POST['regex'], $_POST['match'], $matches);
var_dump($matches);
}

?>
<form action="" method="post">
<input type="text" name="regex">
<textarea name="match"></textarea>
<input type="submit">
</form>

假设这不是受控环境(即用户不可信),上述代码有哪些风险?如果为其他语言编写类似的代码,那么这些其他语言是否存在风险?如果是,哪些语言包含威胁?

我已经发现了“邪恶的正则表达式”,但是,无论我在我的计算机上尝试什么,它们似乎都可以正常工作,请参见下文。

PHP

<?php
php > preg_match('/^((ab)*)+$/', 'ababab', $matches);var_dump($matches);
array(3) {
[0] =>
string(6) "ababab"
[1] =>
string(0) ""
[2] =>
string(2) "ab"
}
php > preg_match('/^((ab)*)+$/', 'abababa', $matches);var_dump($matches);
array(0) {
}

JavaScript

phantomjs> /^((ab)*)+$/g.exec('ababab');
{
"0": "ababab",
"1": "ababab",
"2": "ab",
"index": 0,
"input": "ababab"
}
phantomjs> /^((ab)*)+$/g.exec('abababa');
null

这使我相信 PHP 和 JavaScript 具有针对恶意正则表达式的故障安全机制。基于此,我认为其他语言也具有类似的功能。

这是一个正确的假设吗?

最后,对于可能有害的任何或所有语言,是否有任何方法可以确保正则表达式不会造成损害?

最佳答案

当您使用用户定义的字符串运行用户定义的正则表达式时,用户可能会制作灾难性回溯正则表达式,通常失败输入导致系统拒绝服务。

使用您的示例 ^((ab)*)+$,您需要稍长一些的失败输入来导致灾难性回溯生效:"abababababababababababababababababababababababd”

  • 对于 PHP 版本,请调用 preg_last_error应该返回 PREG_BACKTRACK_LIMIT_ERROR
  • 对于 JS 版本,上面的代码不会在 Firefox 26 中造成灾难性的回溯,浏览器返回 false。在 Chrome 31.0.1650.63 m 和 Internet Explorer 11 上,可以观察到灾难性的回溯。

根据语言/库的 API,API 可能会提供一个选项来限制回溯尝试的次数或设置操作超时;强烈建议您设置限制以防止服务器上的 DoS。

  • PCRE 默认在 1000 万次回溯尝试后停止,次数可以配置。
  • .NET Regex类带有一个 API 来限制匹配所需的时间。

如果语言没有提供如此方便的 API,强烈建议您实现自己的超时机制以超时执行。

除非正则表达式引擎的规范包括防止灾难性回溯的要求(例如 PCRE 有一个默认回溯限制),否则您不应该依赖特定实现的行为(如 Firefox 的情况)如上所述)。

关于javascript - 用户定义的正则表达式安全问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20928677/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com