Kye*_*ica 5 c# security paypal asp.net-mvc-3
我一直在整理PayPal的文档,因为所有这些都适用于ASP但不适用于MVC(包括其他方便的集成向导).我已经看过Rick Strahl的常用参考指南,但它也适用于ASP,我没有使用Webforms转换成MVC的经验.
我被困在一个部分,并对另一部分有安全担忧.
首先:您如何将请求实际提交给paypal api?该文档告诉您使用包含密码的表单.
<form method=post action=https://api-3t.sandbox.paypal.com/nvp>
<input type=hidden name=USER value=API_username>
<input type=hidden name=PWD value=API_password>
<input type=hidden name=SIGNATURE value=API_signature>
<input type=hidden name=VERSION value=XX.0>
<input type=hidden name=PAYMENTREQUEST_0_PAYMENTACTION
value=Sale>
<input name=PAYMENTREQUEST_0_AMT value=19.95>
<input type=hidden name=RETURNURL
value=https://www.YourReturnURL.com>
<input type=hidden name=CANCELURL
value=https://www.YourCancelURL.com>
<input type=submit name=METHOD value=SetExpressCheckout>
</form>
Run Code Online (Sandbox Code Playgroud)
当然这个表格不会进入视图,任何有意识检查您的来源的人都可以窃取您的登录信息?我认为这需要从控制器完成,但我不知道如何从控制器创建这个.HttpWebRequest和WebClient看起来很有希望,但我不知道如何向它们实际添加表单.
第二:即使我确实从用户无法看到它的控制器内部创建了这个表单和api调用,任何有权访问源代码的人(如Web主机或其他开发人员)都能够看到密码.这似乎不是很好的安全性.这是什么做法?如何确保安全?
编辑 对于那些来看的人来说,这就是我最终提交初始请求的方式(将代码压缩到一个块中以便于阅读)
public static string GetResponse(RequestContext context, decimal price)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://api-3t.sandbox.paypal.com/nvp");
//HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://api-3t.sandbox.paypal.com/nvp");
request.Method = "POST";
UrlHelper url = new UrlHelper(context);
string urlBase = string.Format("{0}://{1}", context.HttpContext.Request.Url.Scheme, context.HttpContext.Request.Url.Authority);
string formContent = "USER=" + System.Configuration.ConfigurationManager.AppSettings["paypalUser"] +
"&PWD=" + System.Configuration.ConfigurationManager.AppSettings["paypalPassword"] +
"&SIGNATURE=" + System.Configuration.ConfigurationManager.AppSettings["paypalSignature"] +
"&VERSION=84.0" +
"&PAYMENTREQUEST_0_PAYMENTACTION=Sale" +
"&PAYMENTREQUEST_0_AMT=" + String.Format("{0:0.00}", price) +
"&RETURNURL=" + urlBase + url.Action("Confirm", "Checkout") +
"&CANCELURL=" + urlBase + url.Action("Canceled", "Checkout") +
"&METHOD=SetExpressCheckout";
byte[] byteArray = Encoding.UTF8.GetBytes(formContent);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = byteArray.Length;
Stream dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
WebResponse response = request.GetResponse();
dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
string responseFromServer = HttpUtility.UrlDecode(reader.ReadToEnd());
reader.Close();
dataStream.Close();
response.Close();
return responseFromServer;
}
Run Code Online (Sandbox Code Playgroud)
AFAIK,Paypal 还提供网络服务...而不仅仅是发布数据。
您可以从控制器发出 POST 请求,从而向用户隐藏敏感数据(所有这些隐藏值)。
在这里您可以看到通过代码发布数据的示例:http://msdn.microsoft.com/en-us/library/debx8sh9.aspx
关于您的第二个问题,您可以将那些敏感参数记录在 web.config 中,这样只有在运行时您才可以读取这些参数。
PayPal 还提供了一个沙箱,供您测试集成...因此此时您无需加密即可拥有此值。将应用程序转移到生产环境后,请将测试参数替换为加密的生产凭据。
归档时间: |
|
查看次数: |
5808 次 |
最近记录: |