java - JAVA 字符串的 SQL 注入(inject)模拟

标签 java python escaping sql-injection

我通过中间件将一个字符串从 Java 传递到 Python,并评估该字符串以在 python 中执行该方法。

假设我从 JAVA 发送以下字符串

'test_method("Value1", "Value2", **{"k1:":"v1", "k2":"v2"}'

这将在 python 中进行评估,并调用带有参数的 test_method。 在任何值中存在单引号或双引号之前,这种方法都可以正常工作。例如,如果 v1 或 v2 有单引号或双引号,我在 python 中求值时会收到语法错误

我通过在从 python 发送时转义所有字符来处理这个问题。

我不确定这里是否可以存在任何 SQL 注入(inject)类似物。有人能告诉我转义引号和反斜杠是否安全吗?如果没有,推荐的做法是什么。

最佳答案

您有一个 Python 服务器和一个 Java 客户端。问题是:服务器信任客户端吗?风险是“代码注入(inject)”(请参阅​​OWASP page以获取有用信息)。

在客户端(Java)端转义引号和反斜杠不会对安全性产生任何影响,它只会防止服务器在参数包含引号时无法评估函数...

如果您控制 Java 客户端(您是编写要eval'd 的字符串的人),您可以感到安全,但存在一些问题:

  • 其他客户端是否可以将自己伪装成 Java 客户端并欺骗服务器?如果是,则需要保证对服务端的访问是controller(客户端必须经过授权)。
  • 即使检查了客户端授权,该客户端也可能被攻击者控制。无论您是否有Zero trust或(纵深防御)[https://en.wikipedia.org/wiki/Defense_in_depth_(computing)]安全模型中,服务器不应信任从客户端接收的数据。

也就是说,您有两个主要选项,都在服务器端:

  • 接受任何输入,并尝试清理您收到的内容(检查引号是否平衡、是否没有 delete_all_files 命令等)。在这种情况下,Java 客户端应该转义引号、反斜杠……这是非常危险的,因为攻击者(和普通用户)的想象力是无限的并且您可能会收到一个命令字符串,该字符串会使您的服务器崩溃。
  • 定义客户端和服务器之间的协议(protocol),例如:客户端发送一个包含函数名称和参数的json字符串,服务器检查是否允许并执行它。这要好得多,因为服务器可以轻松控制函数和参数是否有效。 (如果需要,您可以创建自己的二进制协议(protocol),但 Json 或 XML 是不错的选择。)使用这样的协议(protocol),您可以避免在服务器上使用 eval/exec侧面。

总而言之,我建议您:

  1. 如果可以:使用Json字符串将客户端的命令传递到服务器,并将服务器的结果返回给客户端。
  2. 在所有情况下:控制客户端是否有权执行命令。

关于java - JAVA 字符串的 SQL 注入(inject)模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60526879/

相关文章:

java - 在Java中制作对数螺旋

java - 在 Java 中使用可选值获取第一个非空值的最佳方法

java - 如何将字符串更改为 ascii 值并返回字符串?

python - 类型提示 lambda 函数作为函数参数

escaping - 如何在vi中转义斜线字符?

delphi - 在 Delphi 7 中,如何转义 Format 函数中的百分号 (%)?

Mysqldump -x 转义 XML 字符的选项

java - 从目录中读取文件并在java中的嵌套for循环中比较文件

python - 进行变量导入时避免使用环境变量

python - 将尚未存在于另一个数据框中的列添加到数据框中