我想从SQL注入中保护参数化SQL查询。我已经阅读了一篇文章,描述了使用PreparedStatement避免SQL注入。 link
根据文章,它描述了preparedstament有助于从Cache中选择预编译查询,并且在最后一步将花边括号替换为用户数据,并且不会再次编译查询。因此,如果有人提供sql查询作为用户输入,它将有助于避免SQL注入,因为查询将只编译一次。
但是如果有人给出带有特殊字符的字符串,例如'x'='x',会发生什么。例如,在最终查询中用“x'='x'等用户数据替换占位符时,例如”SELECT * FROM users WHERE username ='blah'AND password ='foo'OR'x'='x'“。 Java PreparedStatement如何处理这些类型的特殊字符?
任何人都可以帮我理解这个
答案 0 :(得分:1)
基本上,数据库引擎使用占位符解析SQL字符串,并记住只执行该部分。
完成此操作后,它将接受数据并将占位符替换为实际数据。
这意味着,如果有人设法将SQL字符串放入您的某个变量中以破坏SQL并使其执行其他操作,则数据库引擎会将其视为不会被执行的文本。
因此,您可能会将完整的SQL语句输入到文本字段中,它只会作为文本插入而不是由数据库引擎解析和执行,因此,您的代码是"安全&#34 ; (总有一些你错过的东西,可能是一个潜在的漏洞)
这也不是JAVA独有的,它也适用于PHP等,它只是告诉数据库以与通常不同的方式处理查询。