gpt4 book ai didi

php - 如何阻止 escapeshellarg() 在 Windows 上将 "s 变成空格?

转载 作者:行者123 更新时间:2023-12-05 07:03:54 25 4
gpt4 key购买 nike

PHP 函数 escapeshellarg() 变成了这个:

"A schema"."A table"

进入这个:

" A schema . A table "

也就是说,它将引号替换为空格而不是引号。预期和期望的结果(由我)是:

"\"A schema\".\"A table\""

这浪费了我生命中无数的故障排除时间。很长一段时间,我只是想不通发生了什么。我的大脑从来没有想过它会愚蠢到完全删除双引号!即使这“使其安全”,在转义它们时这样做也是一件很奇怪的事情,这不仅是处理此问题的标准和受支持的方式,而且不会导致使用此功能时出现任何问题。

需要注意的是,我已经阅读了以下评论:https://www.php.net/escapeshellarg

我也读过很多其他文本提示这个功能和 Windows shell 转义等等,所以我至少“模糊地”知道原因:“它很复杂。”

但是,我发现自己完全被这个核心函数 (escapeshellarg) 所困扰,不幸的是,PHP 经常出现这种情况,我发现自己试图创建自己的函数来替换它。这当然是非常有问题和可怕的,因为这个功能的一半是与安全相关的!它应该“确保”任意字符串用作命令行上的参数,而不会冒攻击者可以“突破”它并执行任意命令的风险!

出于这个原因,我很确定只要这样做:

$likely_not_a_safe_argument = '\"' . str_replace('"', '\"', $user_input) . '\"';

... 不安全!如果真的这么简单,那么我敢肯定 PHP 开发人员会在 escapeshellarg 中为 Windows 做到这一点。

基本上,我现在不知道该怎么办。是的,我确实需要在参数中发送双引号。这是必要的真实示例:

pg_dump --format plain --verbose --file "dump.txt" --exclude-table-data="\"Test schema\".\"Test table\"" --host="localhost" --port="5432" --username="postgres" --dbname="testdb"

(不,它不需要单引号或其他任何东西。它必须是标识符周围的双引号。)

我应该如何安全地“改进”escapeshellarg() 以便它不会破坏我的双引号?其他人都做什么?

最佳答案

你可以使用 addslashes();功能。

https://www.php.net/manual/de/function.addslashes.php

关于php - 如何阻止 escapeshellarg() 在 Windows 上将 "s 变成空格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63081623/

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