You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Invoke-WebRequest执行POST请求后无法终止问题求助

问题与解决方案

问题背景

执行以下PowerShell POST请求时,服务器已成功接收请求并写入SQL数据库,但PowerShell命令始终无法终止。尝试使用-TimeoutSec 1参数,但延迟过长,想确认是否支持毫秒级超时设置:

$postParams = @{key='testing'}
Invoke-WebRequest -Uri http://url.com/page.php -Method POST -Body $postParams

对应的PHP代码如下:

<html>
<?php
require 'connect.php';
if ($_POST){
    # need to find way of getting victimID
    $sql = "INSERT INTO keysTable VALUES(NULL,'".$_POST['key']."', '1','2022-08-22 08:56:39')";
    $result = $conn->query($sql);

    $conn->close();
}
echo 'helo world';
var_dump($_POST);
?>
</html>

解决方案

1. PowerShell实现毫秒级超时

Invoke-WebRequest的-TimeoutSec参数仅支持整数秒级配置,无法直接设置毫秒。要实现毫秒级超时,可改用.NET原生的HttpClient类,它支持精确到毫秒的超时设置:

$httpClient = New-Object System.Net.Http.HttpClient
$httpClient.Timeout = [System.TimeSpan]::FromMilliseconds(500) # 设置500毫秒超时

$postParams = @{key='testing'}
$content = New-Object System.Net.Http.FormUrlEncodedContent($postParams)

try {
    $response = $httpClient.PostAsync("http://url.com/page.php", $content).Result
    # 可选:读取响应内容
    $responseContent = $response.Content.ReadAsStringAsync().Result
    Write-Host $responseContent
}
catch [System.AggregateException] {
    Write-Host "请求超时或执行失败"
}
finally {
    $httpClient.Dispose()
}

2. 排查PHP端响应阻塞问题

命令无法终止的核心原因大概率是PHP未正常发送响应,导致PowerShell持续等待。可通过以下方式优化:

  • 强制刷新输出缓冲:在echo和var_dump之后添加flush(); ob_flush();,确保响应内容立即发送给客户端
  • 执行完逻辑后直接终止脚本:在PHP代码末尾添加exit();,避免后续潜在的阻塞操作
  • 检查connect.php是否存在阻塞逻辑:比如未正确关闭的连接、耗时的IO操作
  • 修复SQL注入风险:当前PHP代码直接拼接用户输入到SQL语句,存在严重安全漏洞,改用预处理语句:
$sql = "INSERT INTO keysTable VALUES(NULL, ?, '1','2022-08-22 08:56:39')";
$stmt = $conn->prepare($sql);
$stmt->bind_param("s", $_POST['key']);
$stmt->execute();
$stmt->close();

内容的提问来源于stack exchange,提问作者Rhys Broughton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:06:28