0

我有以下网址:http://localhost:52416/Controls/Support_Survey.aspx?GUID=4aa4caca-f5cb-11e2-b582-635fb56c00b9

我需要从 URL 中获取 GUID 作为变量并将其传递到以下存储过程中:

 database.InsertUpdate(String.Format("CALL spSurveyAnswer_Insert('{0}', '{1}','{2}');", selectValue1, txtFeedBack.Text, PassGUID_HERE));

请问有什么想法吗??

提前致谢

4

5 回答 5

6

以下是我建议您这样做的方法:

var requestGuid = Request.Params["GUID"];

if (string.IsNullOrEmpty(requestGuid))
{
    throw new InvalidOperationException("The request GUID is missing from the URL");
}

Guid guid;

if (!Guid.TryParse(requestGuid, out guid))
{
    throw new InvalidOperationException("The request GUID in the URL is not correctly formatted");
}

using(var connection = new SqlConnection("connection_string"))
{
    using(var command = new SqlCommand("spSurveyAnswer_Insert", connection))
    {
        command.CommandType = CommandType.StoredProcedure;        
        command.Parameters.AddWithValue("firstParamName", selectValue1);
        command.Parameters.AddWithValue("feedbackParamName", txtFeedBack.Text);
        command.Parameters.AddWithValue("guidParamName", guid);

        command.Connection.Open();
        command.ExecuteNonQuery();
    }
}

您不能保证 GUID 会在 URL 中或者是有效的 GUID,所以要防御并检查两者!然后使用参数化查询来帮助防止 SQL 注入 - 由于您正在调用存储过程,如果您在 proc 中滥用参数值,您仍然可以进行 sql 注入,因此您也需要仔细编写。最后,还要妥善处理一次性资源。

于 2013-07-29T15:27:04.383 回答
3

您应该使用Request'sParamsQueryString(请参阅他们的文档以了解差异)来获取 GUID,并且出于安全原因,您应该在所有 SQL 命令和查询中使用参数,而不是字符串连接/格式。我正在使用CommandType.StoredProcedure. 参数名称("firstParamName"等)应与存储过程中声明的实际参数名称匹配。

Guid myGuid = new Guid(Request.Params["GUID"]);

using (SqlConnection conn = // get connection)
using (SqlCommand command = new SqlCommand("spSurveyAnswer_Insert", conn))
{
    conn.Open();
    command.CommandType = CommandType.StoredProcedure;

    command.Parameters.AddWithValue("firstParamName", selectValue1);
    command.Parameters.AddWithValue("feedbackParamName", txtFeedBack.Text);
    command.Parameters.AddWithValue("guidParamName", myGuid);

    command.ExecuteNonQuery();
}
于 2013-07-29T15:20:54.407 回答
0

这应该这样做:

Guid myGuid = new Guid(Request.Params["GUID"])

将其转换为实际的 Guid 也可以防止 SQL 注入攻击

于 2013-07-29T15:06:05.417 回答
0
string url = "http://localhost:52416/Controls/Support_Survey.aspx?GUID=4aa4caca-f5cb-11e2-b582-635fb56c00b9";
string lastPart = url.Split('?').Last().Replace("GUID=",string.Empty);

您的代码是对 SQL 注入的探测,因此请使用SqlCommand.Parameters 属性

 SqlCommand command = // your sql command;
    database.InsertUpdate(String.Format("CALL spSurveyAnswer_Insert('{0}', '{1}','{2}');", @selectValue1, @txtFeedBack, @PassGUID_HERE));

    command.Parameters.AddWithValue("@selectValue1", selectValue1);
    command.Parameters.AddWithValue("@txtFeedBack", txtFeedBack.Text);
    command.Parameters.AddWithValue("@PassGUID_HERE", lastPart );
于 2013-07-29T15:06:27.153 回答
-1
Uri url = new Uri("http://localhost:52416/Controls/Support_Survey.aspx?GUID=4aa4caca-f5cb-11e2-b582-635fb56c00b9");

string query = url.Query //query is now "GUID=4aa4caca-f5cb-11e2-b582-635fb56c00b9"

string guidStr = query.Replace("GUID=", "");
Guid guid = new Guid(guidStr);
于 2013-07-29T15:06:24.400 回答