清理用户输入以注入 Curl CURLOPT_USERPWD值

Sanitise user inputs for injection into Curl CURLOPT_USERPWD values

提问人:Ric 提问时间:4/8/2023 更新时间:4/8/2023 访问量:34

问:

这听起来可能有点晦涩难懂,但简而言之,我正在构建一种中间人包装器 API 端点,它使用 HTTP 基本身份验证,但通过在与另一个端点的另一个 HTTP 基本身份验证连接中重复使用它们来验证用户提交的身份验证凭据。

也就是说,我正在使用 Curl 连接到另一个端点,并在其中使用用户提供的身份验证凭据作为该请求的身份验证凭据。所以我这样做:

    curl_setopt($ch, CURLOPT_USERPWD, $_SERVER['PHP_AUTH_USER'] . ":" . $_SERVER['PHP_AUTH_PW']);

但显然这需要消毒。除此之外,如果用户传递包含冒号的用户名或密码,这将是一个问题,因为冒号用于分隔两个值。我敢肯定,基本身份验证用户名中也不允许使用其他字符,或者允许但需要转义?

我应该从字面上为这些 rawurlencode() 吗?我相信 Curl 有效地将这些标头作为 url 参数传递,所以这对我来说是有意义的,但我找不到任何具体的东西?

显然,我熟悉转义和清理输入,我只是不习惯将用户输入入侵到 Curl 标头中!

PHP Curl 清理

评论

1赞 Alex Howansky 4/8/2023
RFC2617明确禁止在用户标识中使用冒号进行基本身份验证:如果您已经在使用基本身份验证来获取,那么应该不可能获得带有冒号的值。也就是说,检查一个肯定不会有什么坏处,如果发现就中止。userid = *<TEXT excluding ":">$_SERVER['PHP_AUTH_USER']
1赞 Alex Howansky 4/8/2023
(请注意,密码可以带有冒号,因为字符串在遇到的第一个字符串时会拆分。
0赞 Ric 4/8/2023
谢谢亚历克斯。所以,你会这样做吗? 没有任何实际的逃脱?curl_setopt($ch, CURLOPT_USERPWD, str_replace(':', '', $_SERVER['PHP_AUTH_USER']) . ":" . $_SERVER['PHP_AUTH_PW']);
1赞 Alex Howansky 4/8/2023
不。从理论上讲,您现有的代码很好,您不必再做任何事情,因为 userid 中永远不应该有冒号。在实践中,您可能需要仔细检查。if (strpos($_SERVER['PHP_AUTH_USER'], ':') !== false) throw new Exception('Illegal username');

答: 暂无答案