在Business One中转义SQL字符串

时间:2015-07-22 09:17:31

标签: sql-server sapb1

如何在BusinessOne中转义来自用户的字符串?我已经看到了一些似乎对SQL注入感兴趣的例子(在官方样本中!):

gbak -b -service remote_fb_ip:service_mgr absolute_path_to_db_file absolute_path_to_backupfile -user SYSDBA -pass masterkey

有没有办法通过简单的SQL查询(没有存储过程)来避免SQL注入?

1 个答案:

答案 0 :(得分:0)

不幸的是,DI-API不提供预备语句,因此您需要手动保护输入。研究如何做到这一点包含在How to escape value in MSSQL server问题中:

  

在阅读New SQL Truncation Attacks And How To Avoid Them后,似乎 足以使用[使用]转义标识符(并将'的每次出现加倍)和值'(再次将public static String identifier(final CharSequence identifier) { final int length = identifier.length(); StringBuilder sb = new StringBuilder(2 + length * 2); sb.append('['); for (int i = 0; i < length; ++i) { char c = identifier.charAt(i); if (']' == c) { sb.append(']'); } sb.append(c); } sb.append(']'); return sb.toString(); } )的每次出现加倍。尽管如此,对一个关注正确逃避MSSQL的库的提示仍然不错。

我正在使用以下Java代码来转义标识符和值(移植到不同的语言应该是微不足道的):

引用标识符

public static String value(final CharSequence value) {
    final int length = value.length();
    StringBuilder sb = new StringBuilder(2 + length * 2);

    sb.append('\'');

    for (int i = 0; i < length; ++i) {
        char c = value.charAt(i);

        if ('\'' == c) {
            sb.append('\'');
        }
        sb.append(c);
    }
    sb.append('\'');

    return sb.toString();
}

引用值

<div id="wrap">
<ul>
  <li><a href="#">Link 1</a></li>
  <li><a href="#">Link 2</a></li>
  <li><a href="#">Link 3</a></li>
  <li><a href="#">Link 4</a></li>
  <li><a href="#">Link 5</a></li>
  <li><a href="#">Link 6</a></li>
  <li><a href="#">Link 7</a></li>
  <li><a href="#">Link 8</a></li>
  <li><a href="#">Link 9</a></li>
</ul>
</div>