如何在Web性能测试中提取X-XSRF_TOKEN

时间:2016-09-07 13:45:56

标签: c# visual-studio performance-testing load-testing web-performance

我写了一个网络性能测试,之前工作正常。开发人员现在已经添加了CSRF令牌验证(以防止对网站的CSRF攻击)。在此之后,测试开始失败(错误,错误请求)。我挖了它,发现服务器在登录请求时生成一个XSRF-TOKEN,必须在之后的每个请求中传递。 现在要提取令牌,我们需要解析对登录请求的响应。我们怎么做呢?

我的编码测试如下:

connect = new SqlConnection(@"Data Source=LP12;Initial Catalog=SmmsData;Integrated Security=True");
connect.Open();

SqlCommand cmd = new SqlCommand();
cmd.Connection = connect;
cmd.CommandText = "SELECT DrukSensor, FlowSensor, TempSensor, KwaliteitSensor, Toerental, OlieVerbruik"
+ " FROM SysteemSensorInfo"
+ " WHERE DrukSensor=@DrukSensor"
+ " AND FlowSensor=@FlowSensor"
+ " AND TempSensor=@TempSensor"
+ " AND KwaliteitSensor=@KwaliteitSensor"
+ " AND Toerental=@Toerental"
+ " AND Olieverbruik=@OlieVerbruik"
;

cmd.Parameters.Add("@DrukSensor", SqlDbType.Bit);
cmd.Parameters.Add("@FlowSensor", SqlDbType.Bit);
cmd.Parameters.Add("@TempSensor", SqlDbType.Bit);
cmd.Parameters.Add("@KwaliteitSensor", SqlDbType.Bit);
cmd.Parameters.Add("@Toerental", SqlDbType.Bit);
cmd.Parameters.Add("@OlieVerbruik", SqlDbType.Bit);

cmd.Parameters["@DrukSensor"].Value = CheckBoxDruk.Checked;
cmd.Parameters["@FlowSensor"].Value = CheckBoxFlow.Checked;
cmd.Parameters["@TempSensor"].Value = CheckBoxTemp.Checked;
cmd.Parameters["@KwaliteitSensor"].Value = CheckKwaliteit.Checked;
cmd.Parameters["@Toerental"].Value = CheckBoxToerenTal.Checked;
cmd.Parameters["@OlieVerbruik"].Value = CheckBoxOlieVerbruik.Checked;

DataSet ds = new DataSet();
new SqlDataAdapter(cmd).Fill(ds);
GridView1.DataSource = ds.Tables[0];
GridView1.DataBind();
GridView1.AutoGenerateColumns = true;

1 个答案:

答案 0 :(得分:3)

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

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

更详细的步骤是:

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

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

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 {Properties panels for extraction rule and plugins} 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属性中指定的上下文参数中。

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

{{0}}