Java ALTER语句中的SQL注入
如果这是一个重复的道歉 假设您有一个Java应用程序,它有一个查询,可以为以下用户解锁/重置密码: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查询并没有以这种方
“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名称”。