validateRequest

本文介绍了ASP.NET中客户端提交的潜在危险值导致的请求验证异常,并提供了.NET Framework 2.0中的解决方法,即禁用请求验证或显式检查所有输入。

ASP.NET 默认会自动验证客户端提交的值,这是为了安全,但一方面也带来了麻烦,比如我们在客户端界面输入:<foo>,就会产生异常,这显然妨碍了我们的程序工作,参照 .NET Framework 2.0 原话进行解决:

从客户端(tb="<foo>")中检测到有潜在危险的 Request.Form 值。
说明: 请求验证过程检测到有潜在危险的客户端输入值,对请求的处理已经中止。该值可能指示危及应用程序安全的尝试,如跨站点的脚本攻击。通过在 Page 指令或 配置节中设置 validateRequest=false 可以禁用请求验证。但是,在这种情况下,强烈建议应用程序显式检查所有输入。

异常详细信息: System.Web.HttpRequestValidationException: 从客户端(tb="<foo>")中检测到有潜在危险的 Request.Form 值。
/** * 基础云和 Vms之间的http传输的http client代理 * * @author WangYongJian * @version 1.0 * @since 2023/2/3 16:47 */ @Slf4j @Component public class HttpClientProxy { /** * 云对外设备接口client,注入CloudSDK */ private ApiHttpClient apiHttpClient; /** * 云对外APP接口client,注入CloudSDK */ private AppHttpClient appHttpClient; /** * 云端控制器信息存储服务,在本地存储控制器信息,构建了数据库 */ private CloudInfoRepository cloudInfoRepository; private static final String KEY_TRUST_STORE_PATH = "javax.net.ssl.trustStore"; private static final String KEY_TRUST_STORE_PASS = "javax.net.ssl.trustStorePassword"; /** * 构造器,同时构造ApiHttpClient和AppHttpClient http客户端代理 * * @param cloudInfoRepository 云设备信息响应服务 * */ @Autowired private HttpClientProxy(CloudInfoRepository cloudInfoRepository, CloudOwnerCache cloudOwnerCache, VmsInternalApiService settingsService) { String vmsHome = AppHomeUtils.getConfPath(); String keyStorePath = vmsHome + "tplinknbu.jks"; System.setProperty(CLOUDACCESS_SEF_ENTRY,CLOUDACCESS_SEF_ENTRY_URL); System.setProperty(CLOUDACCESS_DEVICE_ENTRY,CLOUDACCESS_DEVICE_ENTRY_URL); System.setProperty(CLOUDACCESS_WAP_ENTRY,CLOUDACCESS_WAP_ENTRY_URL); System.setProperty(CLOUDACCESS_API_ENTRY,CLOUDACCESS_API_ENTRY_URL); System.setProperty(KEY_TRUST_STORE_PATH, keyStorePath); System.setProperty(KEY_TRUST_STORE_PASS, "nettyNbu"); IDeviceMgmt deviceMgmt = new VmsDevice(cloudInfoRepository, cloudOwnerCache, settingsService); this.cloudInfoRepository = cloudInfoRepository; /* * 'validate' request to API server must use returned validateHost's value of 'applySoftwareDeviceId' request * before first binding account successfully, then 'validate' request can use default host once bound * successfully . */ if (this.cloudInfoRepository.checkDeviceIdIsRaw()) { // rawId is true, current deviceId has never bound to a user account // 从本地数据库中 获取 validateHost String validateHost = this.cloudInfoRepository.getValidateHostBeforeBind(); if (Objects.isNull(validateHost)) { apiHttpClient = new ApiHttpClient(deviceMgmt); } else { // 使用 validateHost 初始化创建一个 apiHttpClient apiHttpClient = new ApiHttpClient(validateHost, deviceMgmt); } } else { apiHttpClient = new ApiHttpClient(deviceMgmt); } appHttpClient = new AppHttpClient(deviceMgmt); } /** * Send post request to API cloud server. <br> It uses default connection timeout(15s) and read timeout(15s) for per * request. If current deviceToken is expired, validate request will be sent automatically to get new deviceToken; * * @param leafPath points out the method name of URL. * @param request API request. * @return response from API server. */ @SneakyThrows public JSONObject sendPostRequest(String leafPath, JSONObject request) { return apiHttpClient.sendPostRequest(leafPath, request); } /** * Send post request to API cloud server. <br> It uses default connection timeout(15s) and read timeout(15s). * * @param leafPath points out the method name of URL. * @param deviceToken device token from validateHost. * @param request API request. * @return response from API server. */ @SneakyThrows public JSONObject sendPostRequest(String leafPath, String deviceToken, JSONObject request) { return apiHttpClient.sendPostRequest(leafPath, deviceToken, request); } /** * Send post request to API cloud server. <br> * * @param leafPath points out the method name of URL. * @param deviceToken device token from validateHost. * @param request API request. * @param connTimeout connection timeout. Valid range is 1-30. * @param readTimeout read timeout. Valid range is 1-30. * @return response from API server. */ @SneakyThrows public JSONObject sendPostRequest(String leafPath, String deviceToken, JSONObject request, int connTimeout, int readTimeout) { return apiHttpClient.sendPostRequest(leafPath, deviceToken, request, connTimeout, readTimeout); } /** * Restores host to validate device legality for 'validate' request to the default value. <br> * 将主机还原为默认值,以验证“validate”请求的设备合法性。 */ public void restoreValidateHost() { apiHttpClient.restoreValidateHost(); } /** * 向基础云申请VMS Local的软件ID * <p> * Apply device id to APP cloud server and updates member 'validateHost' of member 'apiHttpClient', this method can * only be called by software EAP Controller.<br> * 将设备ID申请到APP云服务器,并更新成员变量'apiHttpClient'的成员变量'validateHost',该方法只能由软件EAP控制器调用。 This function can login automatically * to get user token. * <B>Note:</B> 'validate' request to API server must use returned validateHost's value of this request before * first binding account successfully, then 'validate' request can use default host once bound successfully.<br> * * @param urlParams parameters included in URL; the key stores the parameter name, the value stores the * parameter value. * @param cloudUserName cloud account that applies device id. * @param cloudPassword password of cloud account. * @return response from APP cloud server. */ @SneakyThrows public JSONObject applySoftwareDeviceId(Map<String, String> urlParams, String cloudUserName, String cloudPassword) { if (CollectionUtil.isEmpty(urlParams) || StringUtil.isBlank(cloudUserName) || StringUtil.isBlank( cloudPassword)) { log.error("[applySoftwareDeviceId] param invalid cloudUsername {}", CustomPIIMaskUtil.hash(cloudUserName)); return null; } JSONObject response = GrpcRetryUtil.executeWithRetry(()->appHttpClient.applySoftwareDeviceId(urlParams, cloudUserName,cloudPassword)); /* * parse validateHost and update API validateHost. * 解析 * */ if ((response != null) && CloudUtils.hasKey(response, AppHttpClient.KEY_ERROR_CODE) && response.getInt (AppHttpClient.KEY_ERROR_CODE) == 0) { if (CloudUtils.hasKey(response, AppHttpClient.KEY_RESULT)) { JSONObject result = response.getJSONObject(AppHttpClient.KEY_RESULT); // 从result中获取新的 DeviceId // 从result中获取新的 validateHost String newDeviceId = result.getString(CloudConstant.DEVICE_ID); String validateHost = result.getString(AppHttpClient.KEY_VALIDATE_HOST); if (!Objects.isNull(validateHost)) { // 给cloud sdk 设置 validateHost apiHttpClient.setValidateHost(validateHost); // 给 本地数据库 设置 validateHost cloudInfoRepository.setValidateHostBeforeBind(validateHost); } else { log.error("Value of {} is not valid.", AppHttpClient.KEY_VALIDATE_HOST); } cloudInfoRepository.saveDeviceId(newDeviceId); } } return response; } }
最新发布
09-17
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值