2

我已经编写了一个 Web 性能测试,它之前运行良好。开发人员现在添加了 CSRF 令牌验证(以防止对网站的 CSRF 攻击)。在此之后,测试开始失败(错误,错误请求)。我对其进行了深入研究,发现服务器在登录请求中生成了一个 XSRF-TOKEN,之后必须在每个请求中传递该 XSRF-TOKEN。现在要提取令牌,我们需要解析对登录请求的响应。我们该怎么做?

我的编码测试如下所示:

WebTestRequest request4 = new WebTestRequest("https://servertest:8080/WebConsole/Account/Login");
request4.Method = "POST";
request4.Headers.Add(new WebTestRequestHeader("Accept", "application/json, text/plain, */*"));
request4.Headers.Add(new WebTestRequestHeader("Referer", "https://servertest:8080/WebConsole/index.html#/"));
StringHttpBody request4Body = new StringHttpBody();
request4Body.ContentType = "application/json;charset=utf-8";
request4Body.InsertByteOrderMark = false;
request4Body.BodyString = "{\"UserName\":\"pkdomain\\\\administrator\",\"Password\":\"sqa@123\"}";
request4.Body = request4Body;
yield return request4;
request4 = null;

WebTestRequest request5 = new WebTestRequest("https://servertest:8080/WebConsole/scripts/home/Pages/home-view.html");
request5.ThinkTime = 4;
request5.Headers.Add(new WebTestRequestHeader("Accept", "text/html"));
request5.Headers.Add(new WebTestRequestHeader("Referer", "https://servertest:8080/WebConsole/index.html#/"));
yield return request5;
request5 = null;
4

1 回答 1

4

我相信它XSRF-TOKEN是在 cookie 中返回的。假设在您的情况下这是真的,那么Set-Cookie标头字段包含该值,并且必须从中提取所需的 cookie 并将其保存到上下文参数中。随后,可以在任何需要的地方使用该上下文参数。

我建议您创建一个沙盒.webtest文件,执行以下步骤,然后将其转换为编码测试并将有用的行复制到实际测试中。

更详细的步骤是:

Extract HTTP Header将头部字段的提取规则添加Set-Cookie到返回XSRF-TOKEN值的请求中。将提取的值保存到您选择的上下文参数中,在提取规则的属性之一中给出其名称;见下图。

在具有上述提取规则的请求之后的第一个请求中添加对以下插件的调用。它从 cookie 标头字段中提取所需的字段。下图显示了设置调用的属性。(您可以将插件更改为 aPostRequest并将其添加到与具有提取规则的请求相同的请求中。)

public class ExtractCookieField : WebTestRequestPlugin
{
    public string AllCookiesCP { get; set; }

    public string FieldWantedCP { get; set; }

    public string SavedFieldCP { get; set; }

    // Expected to be called with AllCookiesCP containing text similar to:
    //     SomeHeader=639025785406236250; path=/; XSRF-TOKEN=somestring; secure; HttpOnly

    public override void PreRequestDataBinding(object sender, PreRequestDataBindingEventArgs e)
    {
        string AllCookiesText = e.WebTest.Context[AllCookiesCP].ToString();

        foreach (string nameValuePair in AllCookiesText.Split(';'))
        {
            string[] nameAndValue = nameValuePair.Split(new char[] { '=' }, 2);

            if (nameAndValue[0].Trim() == FieldWantedCP)
            {
                string sessionTokenId = nameAndValue[1].Trim();
                e.WebTest.Context[SavedFieldCP] = sessionTokenId;
                e.WebTest.AddCommentToResult(string.Format("Setting {{{0}}} to '{1}'", SavedFieldCP, sessionTokenId));
                return;
            }
        }

        // Dropping out of the loop means that the field was not found.
        throw new WebTestException(string.Format("Cannot extract cookie field '{0}' from '{1}'", FieldWantedCP, AllCookiesText));
    }
}

的值XSRF-TOKEN现在应该在SavedFieldCP插件调用的属性中指定的上下文参数中。

此图显示了添加提取规则对话框并设置保存提取的标头字段的上下文参数,即 into CookieValues。它还显示了添加插件和设置三个属性。插件运行后,假设成功,令牌值应该保存到上下文参数XsrfToken中。.webtest可以通过提取规则和插件的属性面板在文件中修改参数值。在编码的 webb 测试中,这些值也应该清楚地被视为简单的变量和字符串。

提取规则和插件的属性面板

于 2016-09-08T08:43:10.097 回答