我写了一个网络性能测试,之前工作正常。开发人员现在已经添加了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;
答案 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 {} 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测试中,这些值也应该清楚地看作简单的变量和字符串。