14,974
edits
| (3 intermediate revisions by the same user not shown) | |||
| Line 5: | Line 5: | ||
{{Tips}} 如何除錯 cUrl 命令:(1) 啟用 [https://ec.haxx.se/usingcurl/verbose 詳細模式] 例如:「... 使用 {{kbd | key=<nowiki>-v</nowiki>}} / {{kbd | key=<nowiki>--verbose</nowiki>}} 選項執行命令以獲取更多資訊。」或 (2) 啟用 [https://ec.haxx.se/usingcurl/verbose/trace 追蹤選項] 例如:{{kbd | key=<nowiki>--trace-ascii [檔案名]</nowiki>}} 注意:如果同時啟用詳細模式和追蹤選項,詳細模式將覆蓋追蹤選項。 | {{Tips}} 如何除錯 cUrl 命令:(1) 啟用 [https://ec.haxx.se/usingcurl/verbose 詳細模式] 例如:「... 使用 {{kbd | key=<nowiki>-v</nowiki>}} / {{kbd | key=<nowiki>--verbose</nowiki>}} 選項執行命令以獲取更多資訊。」或 (2) 啟用 [https://ec.haxx.se/usingcurl/verbose/trace 追蹤選項] 例如:{{kbd | key=<nowiki>--trace-ascii [檔案名]</nowiki>}} 注意:如果同時啟用詳細模式和追蹤選項,詳細模式將覆蓋追蹤選項。 | ||
== 如何解決命令執行問題:在 DOS/終端機中可以運作,但在 PHP 中不運作 == | == Curl 問題清單 == | ||
=== 如何解決命令執行問題:在 DOS/終端機中可以運作,但在 PHP 中不運作 === | |||
手動在 DOS 或 Windows 終端機(如 [https://conemu.github.io/ ConEmu]) 中執行命令時可以運作,但透過 PHP 執行時可能不會產生預期的結果。常見的問題是命令沒有生成預期的檔案。 | 手動在 DOS 或 Windows 終端機(如 [https://conemu.github.io/ ConEmu]) 中執行命令時可以運作,但透過 PHP 執行時可能不會產生預期的結果。常見的問題是命令沒有生成預期的檔案。 | ||
| Line 26: | Line 27: | ||
== 如何解決 cUrl error (3) bad range in URL position xx == | === 如何解決 cUrl error (3) bad range in URL position xx === | ||
'''問題''' | '''問題''' | ||
| Line 57: | Line 58: | ||
如果你不確定是否需要編碼,可以使用線上 URL 編碼工具進行轉換,例如:[https://www.urlencoder.org/ URL 線上編碼和解碼工具]。 | 如果你不確定是否需要編碼,可以使用線上 URL 編碼工具進行轉換,例如:[https://www.urlencoder.org/ URL 線上編碼和解碼工具]。 | ||
== 如何解決 cUrl 錯誤 (#5): 不支援的代理語法 (Unsupported proxy syntax) == | === 如何解決 cUrl 錯誤 (#5): 不支援的代理語法 (Unsupported proxy syntax) === | ||
問題狀況:[https://en.wikipedia.org/wiki/SOCKS socks5] 代理的使用者名稱包含 @ 符號,例如 {{kbd | key=<nowiki>[email protected]</nowiki>}} | 問題狀況:[https://en.wikipedia.org/wiki/SOCKS socks5] 代理的使用者名稱包含 @ 符號,例如 {{kbd | key=<nowiki>[email protected]</nowiki>}} | ||
| Line 76: | Line 77: | ||
可以使用 [https://www.urlencoder.org/ URL Encode and Decode - Online] 或 [https://www.php.net/manual/en/function.urlencode.php urlencode] 函數,跳脫 (Escape) 特殊符號<ref>[https://superuser.com/questions/937124/log-in-to-ftp-using-windows-explorer-with-in-the-username Log in to FTP using Windows Explorer with @ in the username - Super User]</ref>。 | 可以使用 [https://www.urlencoder.org/ URL Encode and Decode - Online] 或 [https://www.php.net/manual/en/function.urlencode.php urlencode] 函數,跳脫 (Escape) 特殊符號<ref>[https://superuser.com/questions/937124/log-in-to-ftp-using-windows-explorer-with-in-the-username Log in to FTP using Windows Explorer with @ in the username - Super User]</ref>。 | ||
== 如何解決 cUrl 錯誤 (#56):OpenSSL SSL_read: No error. == | === 如何解決 cUrl 錯誤 (#56):OpenSSL SSL_read: No error. === | ||
錯誤條件:Windows 上的 curl 版本 7.67.0 遇到問題。[curl_version](https://www.php.net/manual/en/function.curl-version.php) 返回的結果: | 錯誤條件:Windows 上的 curl 版本 7.67.0 遇到問題。[curl_version](https://www.php.net/manual/en/function.curl-version.php) 返回的結果: | ||
<pre> | <pre> | ||
| Line 98: | Line 99: | ||
== 如何解決錯誤:error code: 1010 == | === 如何解決錯誤:error code: 1010 === | ||
識別問題 | 識別問題 | ||
| Line 112: | Line 113: | ||
* 建議改成使用 JavaScript 基礎的爬蟲 (JavaScript-bases browser) 來代替 cURL 命令的方案 <ref>[https://www.zenrows.com/blog/cloudflare-error-1010#how-to-avoid Cloudflare Error 1010: What Is It and How to Avoid - ZenRows]</ref>。 | * 建議改成使用 JavaScript 基礎的爬蟲 (JavaScript-bases browser) 來代替 cURL 命令的方案 <ref>[https://www.zenrows.com/blog/cloudflare-error-1010#how-to-avoid Cloudflare Error 1010: What Is It and How to Avoid - ZenRows]</ref>。 | ||
== 如何解決 400 Bad Request 錯誤:UTF-8 字元編碼問題 == | === 如何解決 400 Bad Request 錯誤:UTF-8 字元編碼問題 === | ||
'''問題分析:''' | '''問題分析:''' | ||
| Line 145: | Line 146: | ||
</pre> | </pre> | ||
== 如何解決錯誤 405 Method Not Allowed == | === 如何解決錯誤 405 Method Not Allowed === | ||
當我嘗試爬取網路資源但遇到錯誤訊息:"錯誤 405 方法不允許" | 當我嘗試爬取網路資源但遇到錯誤訊息:"錯誤 405 方法不允許" | ||
| Line 152: | Line 153: | ||
* 確保使用正確的 HTTP 請求方法 e.g. {{kbd | key=GET}} 或 {{kbd | key=POST}} 來存取網路資源。 | * 確保使用正確的 HTTP 請求方法 e.g. {{kbd | key=GET}} 或 {{kbd | key=POST}} 來存取網路資源。 | ||
== 如何解決錯誤 415 Unsupported Media Type == | === 如何解決錯誤 415 Unsupported Media Type === | ||
當我嘗試 POST JSON(作為有效負載)但遇到錯誤訊息:"錯誤 415 不支援的媒體類型" | 當我嘗試 POST JSON(作為有效負載)但遇到錯誤訊息:"錯誤 415 不支援的媒體類型" | ||
| Line 161: | Line 162: | ||
</pre> | </pre> | ||
== 如何解決 cURL 返回二進位資料,而非 html 或 json == | === 如何解決 cURL 返回二進位資料,而非 html 或 json === | ||
* [https://stackoverflow.com/questions/28283822/curl-returns-binary-data-instead-of-html php - cURL returns binary data instead of html - Stack Overflow] | * [https://stackoverflow.com/questions/28283822/curl-returns-binary-data-instead-of-html php - cURL returns binary data instead of html - Stack Overflow] | ||
* [https://errerrors.blogspot.com/2020/06/resolve-curl-returns-binary-data-instead-of-html-or-json.html 解決 cUrl 下載的網頁或 JSON 看起來像是亂碼的問題] | * [https://errerrors.blogspot.com/2020/06/resolve-curl-returns-binary-data-instead-of-html-or-json.html 解決 cUrl 下載的網頁或 JSON 看起來像是亂碼的問題] | ||
== 如何解決下載的檔案是空的 == | === 如何解決下載的檔案是空的 === | ||
錯誤條件 | 錯誤條件 | ||
* 當我執行了 Curl 命令 {{kbd | key=<nowiki>curl -O https://path/to/plain_text.txt</nowiki>}},但下載的檔案是空的。 | * 當我執行了 Curl 命令 {{kbd | key=<nowiki>curl -O https://path/to/plain_text.txt</nowiki>}},但下載的檔案是空的。 | ||
| Line 189: | Line 190: | ||
</pre> | </pre> | ||
== 如何解決錯誤:no matches found == | === 如何解決錯誤:no matches found === | ||
錯誤條件 | 錯誤條件 | ||
* 當我執行了 Curl 命令 {{kbd | key=<nowiki>curl http://website.test/http_status.php?case=500</nowiki>}},但我遇到了錯誤訊息:"zsh: 未找到匹配:<nowiki>http://website.test/http_status.php?case=500</nowiki>" | * 當我執行了 Curl 命令 {{kbd | key=<nowiki>curl http://website.test/http_status.php?case=500</nowiki>}},但我遇到了錯誤訊息:"zsh: 未找到匹配:<nowiki>http://website.test/http_status.php?case=500</nowiki>" | ||
| Line 200: | Line 201: | ||
* Double quote the {{kbd | key=<nowiki>URL</nowiki>}} e.g. {{kbd | key=<nowiki>curl "http://website.test/http_status.php?case=500"</nowiki>}} | * Double quote the {{kbd | key=<nowiki>URL</nowiki>}} e.g. {{kbd | key=<nowiki>curl "http://website.test/http_status.php?case=500"</nowiki>}} | ||
== 如何解決錯誤:Remote file name has no length == | === 如何解決錯誤:Remote file name has no length === | ||
錯誤訊息 | 錯誤訊息 | ||
| Line 218: | Line 219: | ||
== | === 如何解決 zsh: parse error near `&' 錯誤 === | ||
錯誤狀況 | 錯誤狀況 | ||
<pre> | <pre> | ||
| Line 236: | Line 237: | ||
</pre> | </pre> | ||
== 如何隱藏進度條 == | === 如何解決 zsh Event Not Found 錯誤 === | ||
在 zsh shell 中執行包含 JSON 資料的 cURL 命令時,你可能會遇到以下錯誤訊息: | |||
<pre> | |||
> zsh: event not found: \ | |||
</pre> | |||
這是因為 zsh 將驚嘆號 (!) 解釋為歷史展開字元,即使它出現在雙引號內也是如此。 | |||
要解決此錯誤,可以使用以下任一方法: | |||
'''方法 1:對 JSON 資料使用單引號''' | |||
{{kbd | key=<nowiki>-d '{"message": "Hello '\''world'\'' & welcome!", "price": "$19.99"}'</nowiki>}} | |||
'''方法 2:跳脫驚嘆號''' | |||
{{kbd | key=<nowiki>-d "{\"message\": \"Hello 'world' & welcome\!\", \"price\": \"\$19.99\"}"</nowiki>}} | |||
'''方法 3:使用 heredoc 搭配 stdin''' | |||
{{kbd | key=<nowiki>-d @- << 'EOF'</nowiki>}} | |||
'''方法 4:將 JSON 儲存到檔案並引用''' | |||
{{kbd | key=<nowiki>-d @payload.json</nowiki>}} | |||
'''方法 5:暫時停用歷史展開功能'''<ref>[https://www.reddit.com/r/bash/comments/cl54to/not_sure_why_mac_is_saying_bash_event_not_found/?show=original not sure why mac is saying `-bash: !": event not found` when I try to simply echo a string containing a "!" : r/bash]</ref> | |||
{{kbd | key=<nowiki>set +H</nowiki>}} (在命令之前執行) | |||
修正語法的範例: | |||
使用單引號: | |||
<pre> | |||
curl -X POST \ | |||
-H "Content-Type: application/json" \ | |||
-d '{"message": "Hello '\''world'\'' & welcome!", "price": "$19.99"}' \ | |||
-v \ | |||
https://example.com/api/ | |||
</pre> | |||
使用 heredoc(建議用於複雜的 JSON): | |||
<pre> | |||
curl -X POST \ | |||
-H "Content-Type: application/json" \ | |||
-d @- \ | |||
-v \ | |||
https://example.com/api/ << 'EOF' | |||
{ | |||
"message": "Hello 'world' & welcome!", | |||
"price": "$19.99", | |||
"special_chars": "!@#$%^&*()_+{}|:<>?[]\\;'\",./" | |||
} | |||
EOF | |||
</pre> | |||
使用外部 JSON 檔案: | |||
<pre> | |||
curl -X POST \ | |||
-H "Content-Type: application/json" \ | |||
-d @payload.json \ | |||
-v \ | |||
https://example.com/api/ | |||
</pre> | |||
注意:建議使用 heredoc 方法來處理複雜的 JSON,因為它可以避免所有 shell 解釋問題並保持可讀的格式。 | |||
=== 如何隱藏進度條 === | |||
執行 curl 命令時,通常會輸出詳細的下載和上傳進度資訊,如下所示: | 執行 curl 命令時,通常會輸出詳細的下載和上傳進度資訊,如下所示: | ||
| Line 255: | Line 319: | ||
``` | ``` | ||
== 如何解決 cURL 非法檔名字元錯誤 == | === 如何解決 cURL 非法檔名字元錯誤 === | ||
執行包含非法字元的輸出檔名的 cURL 指令時,可能會遇到以下錯誤訊息: | 執行包含非法字元的輸出檔名的 cURL 指令時,可能會遇到以下錯誤訊息: | ||
| Line 272: | Line 336: | ||
* 如有需要請先建立目錄:{{kbd | key=<nowiki>mkdir -p directory</nowiki>}} | * 如有需要請先建立目錄:{{kbd | key=<nowiki>mkdir -p directory</nowiki>}} | ||
== Windows 與 Mac/Linux 系統的 cURL JSON 傳遞問題 == | === Windows 與 Mac/Linux 系統的 cURL JSON 傳遞問題 === | ||
'''1. 問題''' | '''1. 問題''' | ||
| Line 306: | Line 370: | ||
* Mac/Linux:可以使用單引號包住完整的 JSON 字串 | * Mac/Linux:可以使用單引號包住完整的 JSON 字串 | ||
* 當使用不當的引號格式時,JSON payload 會被錯誤解析,導致 API 回傳格式錯誤的訊息 | * 當使用不當的引號格式時,JSON payload 會被錯誤解析,導致 API 回傳格式錯誤的訊息 | ||
== 相關資安議題 == | |||
* [https://owasp.org/www-community/attacks/Command_Injection Command Injection] 「指令注入 (Command Injection) 是一種攻擊手法,攻擊者會利用應用程式中的漏洞,注入並執行惡意的作業系統指令,通常是透過未經驗證的使用者輸入,例如表單、Cookie 或 HTTP 標頭等方式傳入。」 | |||
== 延伸閱讀 == | == 延伸閱讀 == | ||