我有一个特殊情况,要求我从用户提供的输入值生成SQL WHERE子句的一部分.我想防止任何类型的SQL注入漏洞.我想出了以下代码:
private String encodeSafeSqlStrForPostgresSQL(String str) {
//Replace all apostrophes with double apostrophes
String safeStr = str.replace("'", "''");
//Replace all backslashes with double backslashes
safeStr = safeStr.replace("\\", "\\\\");
//Replace all non-alphanumeric and punctuation characters (per ASCII only)
safeStr = safeStr.replaceAll("[^\\p{Alnum}\\p{Punct}]", "");
//Use PostgreSQL's special escape string modifier
safeStr = "E'" + safeStr + "'";
return safeStr;
}
Run Code Online (Sandbox Code Playgroud)
问题:
笔记:
这是关于SO和其他地方的常见问题,但我看到的唯一答案是始终使用PreparedStatements.Fwiw,我正在使用JasperReports.我想将查询保留在JasperReports中.用于查询参数处理的内置Jasper参数函数(包括X {}函数)不足以满足我的参数化需求.我可以尝试创建一个自定义的Jasper QueryExecutor,它允许我注入我自己的X {}函数,但这比使用Jasper的$ P!{}语法生成动态SQL where子句更复杂.
我查看了OWASP库.他们还没有PostgresSQL编解码器.我查看了OracleCodec,它的转移似乎过于简单.我不确定这对防止SQL注入攻击有多大帮助.
在我的代码中,我添加了E,以便不依赖于PostgreSQL的standard_conforming_strings设置.理想情况下,我不必添加它,然后该函数不必是PostgreSQL特定的.更多信息:http://www.postgresql.org/docs/9.0/static/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-ESCAPE. …
我有一个相当重要的标准.net MVC 4 Web API应用程序.
public class LogsController : ApiController
{
public HttpResponseMessage PostLog(List<LogDto> logs)
{
if (logs != null && logs.Any())
{
var goodLogs = new List<Log>();
var badLogs = new List<LogBad>();
foreach (var logDto in logs)
{
if (logDto.IsValid())
{
goodLogs.Add(logDto.ToLog());
}
else
{
badLogs.Add(logDto.ToLogBad());
}
}
if (goodLogs.Any())
{
_logsRepo.Save(goodLogs);
}
if(badLogs.Any())
{
_logsBadRepo.Save(badLogs);
}
}
return new HttpResponseMessage(HttpStatusCode.OK);
}
}
Run Code Online (Sandbox Code Playgroud)
这一切都很好,我有能够发送他们的日志的设备,它运作良好.但是现在我们开始担心要传输的数据的大小,我们想看一下接受使用GZIP压缩的帖子?
我该怎么做呢?是在IIS中设置还是我可以使用Action Filters?
编辑1
跟着菲利普的回答,我的想法是我需要在它到达我的控制器之前拦截请求的处理.如果我可以在Web api框架尝试将请求的主体解析到我的业务对象之前捕获请求,该请求失败,因为请求的主体仍然被压缩.然后我可以解压缩请求的主体,然后将请求传递回处理链,希望Web Api框架能够将(解压缩的)主体解析为我的业务对象.
它看起来像使用DelagatingHandler是要走的路.它允许我在处理期间,但在我的控制器之前访问请求.所以我尝试了下面这个?
public class gZipHandler : DelegatingHandler
{
protected override …
Run Code Online (Sandbox Code Playgroud) 在System.Net.Http.Headers命名空间中,HttpHeaders.TryAddWithoutValidation和HttpHeaders.Add之间有什么区别?
具体来说,调用Add方法时会进行哪些验证?Add()的文档只是说明:
"标题值将被解析和验证."
我似乎无法弄清楚如何使用C++在Eclipse中构建一个Windows GUI应用程序.我只能建立一个控制台.当我创建一个新项目时,它没有为我提供Windows应用程序的选项.我正在使用Eclipse IDE进行C/C++.我下载错误的Eclipse风味吗?我究竟做错了什么?
范围,上下文,命名绑定(和激活块?)的Ninject概念能够在概念层面上分离和解释清楚吗?
例如,我有一个服务从数据库加载数据记录,对于每个记录,它通过Ninject工厂扩展构建一个"worker".服务和个体工作者都使用Entity Framework的对象上下文与数据库进行交互.ObjectContext通过构造函数注入到两者(以及其他共享依赖项).目前,它是单线程的,但最终的工人需要在并行自己的线程中运行,因此他们将需要自己的ObjectContext实例和明确的开始/配置的生命周期.ObjectContext实例需要在worker的"工作单元"的持续时间内共享(因此它不是瞬态的,因为它被注入到工作者使用的多个存储库中).我很难尝试获得此功能.
Bind<MyDbContext>().ToSelf();
Bind<MyService>().ToSelf();
Bind<IWorkerFactory>().ToFactory().InThreadScope(); // scope prob not necessary
Bind<MyWorker().ToSelf().DefinesNamedScope("workerScopeName");
Bind<MyDbContext>().ToSelf().InNamedScope("workerScopeName");
Run Code Online (Sandbox Code Playgroud)
显然(至少对Ninject用户来说很明显)会因MyDbContext导致"多个匹配绑定..."错误.在阅读了更多内容之后,我现在认为我应该为worker 使用命名绑定,它是ObjectContext.我想我仍然还需要范围的,这样我可以明确地处理当工作完成(并有它从ninject范围处理Dispose方法)的ObjectContext的.
在任何情况下,我仍然主要猜测,我发布这个问题,希望有人可以在Ninject中澄清这些概念.
使用 Spring Boot 2.x 时,在不丢失 Spring Boot 的 FreeMarker 自动配置的情况下,使全局共享对象可供 freemarker 模板使用的最佳方法是什么?
执行此操作的底层机制是 Spring Boot 的FreeMakerConfigurer.setFreemarkerVariables
,它又调用 FreeMarker 的Configuration.setAllSharedVariables
但是,(对我来说)没有明显的方法来修改由FreeMarkerServletWebConfiguration
Spring Boot 支持的预定义 freemarker 属性设置的 FreeMarkerConfigurer。(在这里搜索“freemarker” )。
一种常见的方法是创建自定义FreemarkerConfigurer
bean,但我相信这样会丢失 spring boot 提供的一些自动配置,特别是在处理各种外部属性方面。
似乎可行的一种选择是使用 BeanPostProcessor,如下所示:
public class CustomFreeMarkerConfig implements BeanPostProcessor {
Object sharedWithAllFreeMarkerTemplatesObj = new Object();
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
if (bean instanceof FreeMarkerConfigurer) {
FreeMarkerConfigurer configurer = (FreeMarkerConfigurer) bean;
Map<String, Object> sharedVariables = new HashMap<>();
sharedVariables.put("obj", sharedWithAllFreeMarkerTemplatesObj);
configurer.setFreemarkerVariables(sharedVariables); …
Run Code Online (Sandbox Code Playgroud) .net ×2
c# ×2
c++ ×1
eclipse-cdt ×1
freemarker ×1
java ×1
ninject ×1
postgresql ×1
spring-boot ×1
sql ×1
windows ×1