如何使用新选项卡/新窗口打开btnSMS.PostBackUrl?或者无论如何转到该URL然后自动转到另一个页面?
更多信息:该URL是使用服务提供商(Clickatell)发送SMS的方法。但除了说明消息发送是否成功之外,URL只有其他内容。我不希望使用我的ASP.NET的用户卡在那里。我想让他们在发送邮件后回到我的网站。
protected void btnSMS_Click1(object sender, EventArgs e)
{
String HP = txtHP.Text;
String URL = "http://api.clickatell.com/http/sendmsg?user=myuser&password=mypassword&api_id=myapi_id&to=";
String Text = "&text=" + txtSMS.Text;
btnSMS.PostBackUrl = URL + HP + Text;
string username;
//Sql Connection to access the database
SqlConnection conn6 = new SqlConnection("MY CONNECTION");
//Opening the Connnection
conn6.Open();
string mySQL;
username = HttpContext.Current.User.Identity.Name;
//Insert the information into the database table Login
mySQL = "INSERT INTO Table_Message(Username, Message, Title, SendTo) VALUES('" + username + "','" + txtSMS.Text.Trim() + "','" + txtTitle.Text.Trim() + "','" + txtHP.Text.Trim() + "')";
SqlCommand cmdAdd = new SqlCommand(mySQL, conn6);
//Execute the sql command
cmdAdd.ExecuteNonQuery();
//Close the Connection
}
答案 0 :(得分:1)
我认为更好的实现方法是将表单发布到您站点中的URL,您可以对其做出反应,然后将帖子发送到您在服务器上使用的服务,并将用户重定向到适当的网址。
<强>更新强>
我假设您在这里使用网络表单。
问题是您可以发布到所需的网址,但您的用户在网页上看不到任何更改。另一个问题是,您将邮件的密码和API_ID放在回发网址中,任何能够导航到您的网页并点击F12密钥的人都可以看到该密码。将API_ID提供给公众是一个很大的错误。它应该只是你和远程服务应该知道的东西。
这是我的解决方案。
首次加载页面时,您将显示一个空表单,并允许用户输入所需的数据。
然后在点击事件处理程序中,您可以获得所需的数据并手动发布到服务。 HTTP帖子包含要发送到服务的键值对列表。您必须手动构建发布请求,并从远程服务获取响应。
所以这就是你的点击处理程序应该是这样的。
protected void btnSMS_Click1(object sender, EventArgs e)
{
Dictionary<string,string> postValues = new Dictionary<string,string>();
// gather the key value pairs ou want from your controls and add them to the dictionary.
// and call postSynchronous method (which I'll explain below)
string result = postSynchronous(URLtoPOST,postValues);
if (result= yourSuccessValue){
// redirect to a page that says.. 'Yay!! you successfully posted to the service ?'
Server.Transfer("successPage.aspx");
}else
{
// what to do if it fails ?
}
}
现在postSynchronous
方法(或者你想要调用的方法)是你必须手动编写的东西,这将需要一个RUL发布到一个键值对的列表,以便与帖子一起发送,然后构建实际的帖子请求。
请查看此链接以获取有关如何执行此操作的教程。 http://petewarden.typepad.com/searchbrowser/2008/09/how-to-post-an.html
我试图嵌入方法和任何相关方法的代码,但它太长了。
因此,以这种方式做事情的好处是,您永远不会将API密钥或密码发送到用户的浏览器,因此他们永远不会知道它。 (否则他们可以使用密钥来访问服务,因为这是一个安全漏洞)
这有什么不好,比较你的解决方案是你在服务器上发布,这会将CPU和网络负载带到你的服务器。但我认为这对你获得的安全性好处是很好的折衷。
希望这会有所帮助。并随时提出任何问题。答案 1 :(得分:1)
您的按钮应如下所示:
<asp:Button runat="server" ID="btnSMS" UseSubmitBehavior="false" OnClick="btnSMS_Click1" Text="Send/>
然后在代码隐藏构建中使用回发URL,然后在submition之后添加以下内容:
protected void btnSMS_Click1(object sender, EventArgs e)
{
String HP = txtHP.Text;
String URL = "http://api.clickatell.com/http/sendmsg?user=myuser&password=mypassword&api_id=myapi_id&to=";
String Text = "&text=" + txtSMS.Text;
string UrlFinal = URL + HP + Text;
string username;
//Sql Connection to access the database
SqlConnection conn6 = new SqlConnection("Data Source=19-17\\sqlexpress;" + "Initial Catalog = Suite2; Integrated Security =SSPI");
//Opening the Connnection
conn6.Open();
string mySQL;
username = HttpContext.Current.User.Identity.Name;
//Insert the information into the database table Login
mySQL = "INSERT INTO Table_Message(Username, Message, Title, Startdate, Enddate, SendTo) VALUES('" + username + "','" + txtSMS.Text.Trim() + "','" + txtTitle.Text.Trim() + "','" + txtHP.Text.Trim() + "')";
SqlCommand cmdAdd = new SqlCommand(mySQL, conn6);
//Execute the sql command
cmdAdd.ExecuteNonQuery();
//Close the Connection
this.ClientScript.RegisterStartupScript(this.GetType(),
"navigate",
"window.open('" + UrlFinal + "');",
true);
}
这应该在新窗口中打开。或者,也可以使用window.navigate,它将在同一浏览器中打开另一个页面。
答案 2 :(得分:0)
是否可以将属性target="_blank"
添加到btnSMS项目中?
如果它是一个链接元素,它将如下所示:
id="btnSMS" href="" target="_blank"
答案 3 :(得分:0)
一个重要的切线---你会让自己对SQL注入攻击持开放态度。
您永远不应该永远不会将用户的文本输入与SQL查询连接起来。
在SQL查询字符串中使用@Parameter
值,然后使用SqlCommand
参数替换这些值。
string mySQL = "INSERT INTO Table_Message(Username, Message, Title, SendTo) VALUES(@Username, @Message, @Title, @SendTo)";
SqlCommand cmdAdd = new SqlCommand(mySQL, conn6);
cmdAdd.Parameters.AddWithValue("@Username", username);
cmdAdd.Parameters.AddWithValue("@Message", txtSMS.Text.Trim());
cmdAdd.Parameters.AddWithValue("@Title", txtTitle.Text.Trim());
cmdAdd.Parameters.AddWithValue("@SendTo", txtHP.Text.Trim());
cmdAdd.ExecuteNonQuery();
明确指定类型会更好:
cmdAdd.Parameters.Add("@Username", SqlDbType.NVarChar, 100).Value = username;
请参阅Troy Hunt的精彩系列 - http://www.troyhunt.com/2010/05/owasp-top-10-for-net-developers-part-1.html