小编kal*_*ech的帖子

如何使用Java在PostgreSQL中安全地转义SQL的任意字符串

我有一个特殊情况,要求我从用户提供的输入值生成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. …

java sql postgresql

16
推荐指数
2
解决办法
1万
查看次数

如何使.Net web-API能够接受g-ziped帖子

我有一个相当重要的标准.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)

c# asp.net-web-api

14
推荐指数
3
解决办法
1万
查看次数

HttpHeaders.TryAddWithoutValidation的目的是什么?

在System.Net.Http.Headers命名空间中,HttpHeaders.TryAddWithoutValidationHttpHeaders.Add之间有什么区别?

具体来说,调用Add方法时会进行哪些验证?Add()的文档只是说明:

"标题值将被解析和验证."

.net c#

8
推荐指数
1
解决办法
5422
查看次数

如何使用C++(非控制台应用程序)在Eclipse中构建Windows GUI应用程序

我似乎无法弄清楚如何使用C++在Eclipse中构建一个Windows GUI应用程序.我只能建立一个控制台.当我创建一个新项目时,它没有为我提供Windows应用程序的选项.我正在使用Eclipse IDE进行C/C++.我下载错误的Eclipse风味吗?我究竟做错了什么?

c++ windows eclipse-cdt

7
推荐指数
2
解决办法
3万
查看次数

Ninject中"范围","上下文"等有什么区别?

范围,上下文,命名绑定(和激活块?)的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中澄清这些概念.

.net ninject ninject-extensions

6
推荐指数
1
解决办法
1336
查看次数

如何使全局共享对象可用于 Spring Boot 2 中的 freemarker 模板

使用 Spring Boot 2.x 时,在不丢失 Spring Boot 的 FreeMarker 自动配置的情况下,使全局共享对象可供 freemarker 模板使用的最佳方法是什么?

执行此操作的底层机制是 Spring Boot 的FreeMakerConfigurer.setFreemarkerVariables,它又调用 FreeMarker 的Configuration.setAllSharedVariables

但是,(对我来说)没有明显的方法来修改由FreeMarkerServletWebConfigurationSpring Boot 支持的预定义 freemarker 属性设置的 FreeMarkerConfigurer。(在这里搜索“freemarker” )。

一种常见的方法是创建自定义FreemarkerConfigurerbean,但我相信这样会丢失 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)

freemarker spring-boot

5
推荐指数
1
解决办法
538
查看次数