当前位置: 首页 > 知识库问答 >
问题:

我是否容易受到SQL注入的攻击?

颜乐
2023-03-14

我有这样一个类,它扩展了一个实现CustomTaskChange的类。由于一些类属性(如列名和类型)是通过XML文件传递给它的,所以我需要进行字符串级联。我确实使用PreparedStatement,但我想知道我是否仍然因为它而容易受到SQL注入的攻击,如果是这样的话,我该如何使它安全呢?XML是一个Liquibase变更集(我将在下面留下一个示例)。

<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">
  <changeSet author="" id="57ba1e10-3e3a-4be1-a7a0-7a9fb9411565">
    <customChange class="com.petapilot.migrations.customChanges.MultipleAdd" columnName="testeRegex" columnType="varchar(250)"
    regex="saft_[0-9]{4}_[0-9]{1,10}_[0-9]{1,10}_nc_transactions" after="CreditAmount" notNull="true" default="sbc"></customChange>
  </changeSet>
</databaseChangeLog>
@Override
    public void execute(Database database) throws CustomChangeException {

        try {
            //check if there are any errors in the changelog file
            checkArgumentsNumber();

            boolean tablesFound = false;
            boolean columnsAdded = false;
            String sqlStatement = "ALTER TABLE NAME ADD COLUMN " +this.getColumnName()+" "+this.getColumnType();

            if(notNull){
                sqlStatement+=" NOT NULL";
            }

            if(defaultValue!=null){
                sqlStatement+=" DEFAULT ?";
            }

            if (this.after != null) {
                sqlStatement += " AFTER " +this.after;
            }

            System.out.println("The statement is: "+sqlStatement);

            //get tables in the database
            JdbcConnection connection = (JdbcConnection) database.getConnection();
            DatabaseMetaData metadata;
            metadata = connection.getMetaData();
            String[] types = {"TABLE"};
            ResultSet rs = metadata.getTables(connection.getCatalog(), null, "%", types);

            //if the user chose to use a regex
            if (this.getRegex() != null) {
                Pattern pattern = Pattern.compile(this.getRegex());

                while (rs.next()) {
                    String tableName = rs.getString(3);
                    Matcher matcher = pattern.matcher(tableName);
                    boolean matches = matcher.matches();
                    if (matches) {
                        tablesFound = true;
                        String addStatement=sqlStatement.replaceAll("NAME",tableName);
                        PreparedStatement s = connection.prepareStatement(addStatement);
                        if (!checkColumnsExists(s, tableName)) {
                            if(this.defaultValue!=null){
                                s.setString(1,this.defaultValue);
                            }
                            System.out.println("REGEX:"+s.toString());
                            s.executeUpdate();
                            columnsAdded = true;
                        }
                    }
                }
            }

            checkInvalidInfo(tablesFound, columnsAdded, "All the matching tables already had that column");
        } catch (InvalidArgumentsNumberException | SQLException | InvalidInfoException | DatabaseException e) {
            throw new CustomChangeException("Error enabling trigger: " + e);
        }
    }

共有1个答案

颛孙喜
2023-03-14

是否是SQL注入漏洞将取决于XML文件的来源。

如果程序员正在创作这样的文件,那么您就不存在SQL注入问题。是的,连接危险的东西是可能的,但这并不比开发人员直接将危险的东西写入代码更危险。

但是,如果XML文件来自最终用户,或者来自其他服务,或者来自允许其他人或服务修改的文件,那么它们应该被认为是潜在的危险,并且您的代码将面临SQL注入攻击的风险。

由于所有串联的值实际上都是标识符(列名和数据类型),而不是值,因此如果您检查它们是否仅由字母数字字符组成,则可能是安全的:

if (!getColumnName().matches("\\p{AlNum}+")) {
    throw new CustomChangeException(
        "Invalid column name: \"" + getColumnName() + "\"");
}
if (!after.matches("\\p{AlNum}+")) {
    throw new CustomChangeException(
        "Invalid 'after' column name: \"" + after + "\"");
}
if (!getColumnType().matches("\\p{AlNum}+")) {
    throw new CustomChangeException(
        "Invalid column type: \"" + getColumnType() + "\"");
}
 类似资料:
  • 问题内容: 我知道在调用时使用插值字符串是不安全的。 例如: 应该改写为: 调用时使用插值字符串是否安全?如果不是,应如何改写以下内容? 问题答案: 是的,ActiveRecord的是鈥涣刻申鈥方法 是 容易受到SQL注入。 不,这 不是 安全打电话时使用插值的字符串。 上述问题的答案已经由亚伦·帕特森(Aaron Patterson) 确认,他将我指向http://rails- sqli.org

  • 考虑以下陈述: 以上内容被认为是安全的,不会受到SQL注入攻击。知道id属于int类型,下面的也安全吗? 如果没有,会出现什么问题?

  • 我的Java应用程序使用kerberos对Windows Active Directory KDC进行身份验证,它使用RC4-HMAC进行krb5配置文件中的、、。 通过将RC4-HMAC替换为es128-cts-hmac-sha1-96,应用程序给出了以下状态代码14的KrbException。 消息:KDC不支持加密类型javax.security.auth.login。FailedLogin

  • 本文向大家介绍什么是SQL注入式攻击?相关面试题,主要包含被问及什么是SQL注入式攻击?时的应答技巧和注意事项,需要的朋友参考一下 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。常见的SQL

  • 问题内容: 这是我的代码: 有人可以告诉我它是否安全或是否容易受到SQL Injection攻击或其他SQL攻击吗? 问题答案: 有人可以告诉我它是否安全或是否容易受到SQL Injection攻击或其他SQL攻击吗? 正如uri2x所说的,请参阅SQL注入。 防止SQL注入的最佳方法是使用准备好的语句。它们将数据(您的参数)与指令(SQL查询字符串)分开,并且不会为数据留下任何空间污染查询的结构

  • 这是我的代码: 有人可以告诉我它是否安全,或者它是否容易受到SQL注入攻击或其他SQL攻击吗?