如何防止 SQL 注入特殊字符
How to prevent SQL injection from special characters
我想从 SQL 注入中保护参数化 SQL 查询。我看过一篇文章,其中描述了如何使用 PreparedStatement 避免 SQL 注入。 link
根据这篇文章,它描述了 preparedstament 有助于从缓存中选择预编译查询,并且在最后一步将 laceholders 替换为用户数据,并且不会再次编译查询。因此,如果有人提供 sql 查询作为用户输入,这将有助于避免 SQL 注入,因为查询只会被编译一次。
但是如果有人给出带有特殊字符的字符串,例如 'x'='x',会发生什么情况?例如,当占位符在最终查询 "SELECT * FROM users WHERE username = 'blah' AND password = 'foo' OR 'x'='x'" 中被用户数据替换为 'x'='x' 时。 Java PreparedStatement 如何处理这些类型的特殊字符?
谁能帮我理解一下
基本上,数据库引擎解析带有占位符的 SQL 字符串,并记住只执行该部分。
完成此操作后,它将接受数据并用实际数据替换占位符。
这意味着如果有人以某种方式设法将 SQL 字符串放入您的变量之一以破坏 SQL 并使其执行其他操作,数据库引擎会将 is 视为文本不会被执行。
因此,您可能会在文本字段中输入完整的 SQL 语句,它只会作为文本插入,而不是由数据库引擎解析和执行,因此,您的代码是 "safe"(总有一些你遗漏的地方可能是一个潜在的漏洞)
这也不是 JAVA 独有的,它也适用于 PHP 等,它只是告诉数据库以不同于通常的方式处理查询。
我想从 SQL 注入中保护参数化 SQL 查询。我看过一篇文章,其中描述了如何使用 PreparedStatement 避免 SQL 注入。 link
根据这篇文章,它描述了 preparedstament 有助于从缓存中选择预编译查询,并且在最后一步将 laceholders 替换为用户数据,并且不会再次编译查询。因此,如果有人提供 sql 查询作为用户输入,这将有助于避免 SQL 注入,因为查询只会被编译一次。
但是如果有人给出带有特殊字符的字符串,例如 'x'='x',会发生什么情况?例如,当占位符在最终查询 "SELECT * FROM users WHERE username = 'blah' AND password = 'foo' OR 'x'='x'" 中被用户数据替换为 'x'='x' 时。 Java PreparedStatement 如何处理这些类型的特殊字符?
谁能帮我理解一下
基本上,数据库引擎解析带有占位符的 SQL 字符串,并记住只执行该部分。
完成此操作后,它将接受数据并用实际数据替换占位符。
这意味着如果有人以某种方式设法将 SQL 字符串放入您的变量之一以破坏 SQL 并使其执行其他操作,数据库引擎会将 is 视为文本不会被执行。
因此,您可能会在文本字段中输入完整的 SQL 语句,它只会作为文本插入,而不是由数据库引擎解析和执行,因此,您的代码是 "safe"(总有一些你遗漏的地方可能是一个潜在的漏洞)
这也不是 JAVA 独有的,它也适用于 PHP 等,它只是告诉数据库以不同于通常的方式处理查询。