Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ALTER语句中的SQL注入_Java_Sql Injection_Oracle12c_Owasp_Secure Coding - Fatal编程技术网

Java ALTER语句中的SQL注入

Java ALTER语句中的SQL注入,java,sql-injection,oracle12c,owasp,secure-coding,Java,Sql Injection,Oracle12c,Owasp,Secure Coding,如果这是一个重复的道歉 假设您有一个Java应用程序,它有一个查询,可以为以下用户解锁/重置密码: “ALTER USER”+iD\u Of_USER.toUpperCase()+”由“+password\u Of_USER+”ACCOUNT UNLOCK”标识 其中用户的iD\u和用户的password\u肯定直接来自HTTP请求 尝试使用PreparedStatement对象参数化动态值时出错。。。我猜PreparedStatement的参数只能用于数据值?这里的ALTER查询并没有以这种方

如果这是一个重复的道歉

假设您有一个Java应用程序,它有一个查询,可以为以下用户解锁/重置密码:

“ALTER USER”+iD\u Of_USER.toUpperCase()+”由“+password\u Of_USER+”ACCOUNT UNLOCK”标识

其中用户的
iD\u
和用户的
password\u
肯定直接来自HTTP请求

尝试使用PreparedStatement对象参数化动态值时出错。。。我猜PreparedStatement的参数只能用于数据值?这里的ALTER查询并没有以这种方式使用这些值

我认为这里甚至不可能进行输入验证——可能是在'iD_Of_User'值上,但几乎肯定不是在'password_Of_User'值上(有时用作密码重置——因此唯一的限制是Oracle 12c密码标准)


任何帮助都将不胜感激。我回顾了这个,但它没有给我一个好的解决方案。我希望有人知道一种在Oracle中进行密码重置/帐户解锁的好方法,它不会打开应用程序进行SQL注入。

使用动态PL/SQL允许绑定变量,并使用
DBMS\u ASSERT
防止SQL注入。我相信你联系到的这个问题已经很接近有效了

为了进行测试,我将PL/SQL块放在另一个PL/SQL块中。但是在Java程序中,您只需要内部块

begin
    execute immediate
    q'[
        declare
            v_username varchar2(128);
            v_password varchar2(4000);
            v_sql      varchar2(32767);
        begin
            --You may want to catch and handle the exceptions to be more user-friendly.
            v_username := dbms_assert.schema_name(upper(trim(:username)));
            v_password := dbms_assert.enquote_name(:password);

            v_sql := 'alter user '||v_username||' identified by '||v_password;
            --Only include this line in debug version, for testing.
            dbms_output.put_line(v_sql);
            execute immediate v_sql;
        end;
    ]'
    --Use bind variables for these values:
    using 'test_user', 'passw0rd###1234''';
end;
/

您可以在本页阅读关于java PreparedStatement的文档,谢谢@LongNguyen。我注意到文档中提到了execute()和executeQuery()选项——我的应用程序目前使用的是executeUpdate(),它规定它只能用于插入、更新或删除。。。奥尔特不是其中之一。但是,我的团队告诉我,使用execute()和executeQuery()会产生相同的错误。。。所以我猜要么我们做错了什么,要么这些方法也不允许使用altersql查询。感谢您的回复。String sql=“alter table foo add column bar varchar(256)”;连接con=新连接(“…”);语句stmt=con.createStatement(sql);stmt.execute();此语句只能用于不可变查询,因为它可以用于SQL注入。出于任何其他目的,您应该使用PreparedStatement Oracle密码不能包含双引号字符作为“”,但密码值作为{“password”}将被解释为{password},这可能是不知道此功能的用户的问题,对吗?请参阅:@Marek-A-我不确定我是否理解。如果输入的值是
{“password”}
双引号不会自动删除,PL/SQL块将失败,并出现错误“ORA-44003:无效的SQL名称”。