gpt4 book ai didi

java - ALTER 语句中的 SQL 注入(inject)

转载 作者:行者123 更新时间:2023-11-30 05:24:34 28 4
gpt4 key购买 nike

如果这是重复的,我们深表歉意。

假设您有一个 Java 应用程序,其中有一个查询可以解锁/重置用户的密码,例如:

“更改用户”+ iD_Of_User.toUpperCase() +“识别者”+password_Of_User +“帐户解锁”

其中 iD_Of_Userpassword_Of_User 肯定直接来自 HTTP 请求。

当我尝试使用PreparedStatement对象来参数化动态值时出现错误...我猜PreparedStatement的参数只能用于数据值?并且此处的 ALTER 查询并未以这种方式使用值。

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

任何帮助我们将不胜感激。我评论了这个post ,但并没有给我一个好的解决方案。我希望有人知道在 Oracle 中进行密码重置/帐户解锁的好方法,该方法不会打开应用程序进行 SQL 注入(inject)。

最佳答案

使用动态 PL/SQL 来允许绑定(bind)变量,并使用 DBMS_ASSERT 来防止 SQL 注入(inject)。我相信您链接到的问题非常接近工作。

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

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 - ALTER 语句中的 SQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58919140/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com