secguide icon indicating copy to clipboard operation
secguide copied to clipboard

#java# 规范 1.1.1 条修订建议

Open k4n5ha0 opened this issue 3 years ago • 4 comments

1、问题描述 java 代码安全规范的【1.1.1 条】 SQL语句默认使用预编译并绑定变量 需补充

2、解决建议 应补充下列编码规范:

  • 在 Mybatis 中除了极为特殊的情况,应禁止使用 $ 拼接sql。
  • 所有 Mybatis 的实体bean对象字段都应使用包装类,防止 null 的二义性问题。
// 数据搜索时,编码注意要点
// 1)校验搜索数据的业务逻辑:例如搜索用户手机号,应限制输入数据只能输入数字,防止出现搜索英文或中文的无效搜索
// 2)mybatis预编译不会转义 % 符号,应阻止用户输入 % 符号以防止全表扫描
// 3)输入数据长度和搜索频率应进行限制,防止恶意搜索导致的数据库拒绝服务
<select id="getArticles" resultType="Article">
    SELECT * FROM article WHERE 1
    <if test="searchKeywordType == 'title'">
        AND title LIKE CONCAT('%', #{searchKeyword}, '%')
    </if>
        ORDER BY id DESC
</select>
// 编写 order by 时应使用内置指令,防止$拼接导致sql注入
<select id="findAllList" resultType="Article" >
    SELECT * FROM article ORDER BY
    <choose>
        <when test="page !=null and page != ''">
            page asc
        </when>
        <otherwise>
            time desc
        </otherwise>
    </choose>
</select>

k4n5ha0 avatar May 24 '21 13:05 k4n5ha0

太强了

Pa55w0rd avatar May 25 '21 03:05 Pa55w0rd

1、问题描述 java 代码安全规范的【1.1.1 条】 SQL语句默认使用预编译并绑定变量 需补充

2、解决建议 应补充下列编码规范:

  • 在 Mybatis 中除了极为特殊的情况,应禁止使用 $ 拼接sql。
  • 所有 Mybatis 的实体bean对象字段都应使用包装类,防止 null 的二义性问题。
// 数据搜索时,编码注意要点
// 1)校验搜索数据的业务逻辑:例如搜索用户手机号,应限制输入数据只能输入数字,防止出现搜索英文或中文的无效搜索
// 2)mybatis预编译不会转义 % 符号,应阻止用户输入 % 符号以防止全表扫描
// 3)输入数据长度和搜索频率应进行限制,防止恶意搜索导致的数据库拒绝服务
<select id="getArticles" resultType="Article">
    SELECT * FROM article WHERE 1
    <if test="searchKeywordType == 'title'">
        AND title LIKE CONCAT('%', #{searchKeyword}, '%')
    </if>
        ORDER BY id DESC
</select>
// 编写 order by 时应使用内置指令,防止$拼接导致sql注入
<select id="findAllList" resultType="Article" >
    SELECT * FROM article ORDER BY
    <choose>
        <when test="page !=null and page != ''">
            #{page} asc
        </when>
        <otherwise>
            time desc
        </otherwise>
    </choose>
</select>

关于“编写 order by 时应使用内置指令,防止$拼接导致sql注入”下面的代码, 这个虽然能防止sql 注入,但是会导致程序会无法正确按传入的指定列进行排序了,也就是会把传入的列当成字符串,sql 执行就会非预期。

ivybao0628 avatar Jun 28 '21 06:06 ivybao0628

1、问题描述 java 代码安全规范的【1.1.1 条】 SQL语句默认使用预编译并绑定变量 需补充 2、解决建议 应补充下列编码规范:

  • 在 Mybatis 中除了极为特殊的情况,应禁止使用 $ 拼接sql。
  • 所有 Mybatis 的实体bean对象字段都应使用包装类,防止 null 的二义性问题。
// 数据搜索时,编码注意要点
// 1)校验搜索数据的业务逻辑:例如搜索用户手机号,应限制输入数据只能输入数字,防止出现搜索英文或中文的无效搜索
// 2)mybatis预编译不会转义 % 符号,应阻止用户输入 % 符号以防止全表扫描
// 3)输入数据长度和搜索频率应进行限制,防止恶意搜索导致的数据库拒绝服务
<select id="getArticles" resultType="Article">
    SELECT * FROM article WHERE 1
    <if test="searchKeywordType == 'title'">
        AND title LIKE CONCAT('%', #{searchKeyword}, '%')
    </if>
        ORDER BY id DESC
</select>
// 编写 order by 时应使用内置指令,防止$拼接导致sql注入
<select id="findAllList" resultType="Article" >
    SELECT * FROM article ORDER BY
    <choose>
        <when test="page !=null and page != ''">
            #{page} asc
        </when>
        <otherwise>
            time desc
        </otherwise>
    </choose>
</select>

关于“编写 order by 时应使用内置指令,防止$拼接导致sql注入”下面的代码, 这个虽然能防止sql 注入,但是会导致程序会无法正确按传入的指定列进行排序了,也就是会把传入的列当成字符串,sql 执行就会非预期。

哦我写错了,在原文里改好了,我在github上和作者讨论过,作者认为要么用choose标签要么用java层面进行逻辑判断。

k4n5ha0 avatar Jun 28 '21 08:06 k4n5ha0

1、问题描述 java 代码安全规范的【1.1.1 条】 SQL语句默认使用预编译并绑定变量 需补充 2、解决建议 应补充下列编码规范:

  • 在 Mybatis 中除了极为特殊的情况,应禁止使用 $ 拼接sql。
  • 所有 Mybatis 的实体bean对象字段都应使用包装类,防止 null 的二义性问题。
// 数据搜索时,编码注意要点
// 1)校验搜索数据的业务逻辑:例如搜索用户手机号,应限制输入数据只能输入数字,防止出现搜索英文或中文的无效搜索
// 2)mybatis预编译不会转义 % 符号,应阻止用户输入 % 符号以防止全表扫描
// 3)输入数据长度和搜索频率应进行限制,防止恶意搜索导致的数据库拒绝服务
<select id="getArticles" resultType="Article">
    SELECT * FROM article WHERE 1
    <if test="searchKeywordType == 'title'">
        AND title LIKE CONCAT('%', #{searchKeyword}, '%')
    </if>
        ORDER BY id DESC
</select>
// 编写 order by 时应使用内置指令,防止$拼接导致sql注入
<select id="findAllList" resultType="Article" >
    SELECT * FROM article ORDER BY
    <choose>
        <when test="page !=null and page != ''">
            #{page} asc
        </when>
        <otherwise>
            time desc
        </otherwise>
    </choose>
</select>

关于“编写 order by 时应使用内置指令,防止$拼接导致sql注入”下面的代码, 这个虽然能防止sql 注入,但是会导致程序会无法正确按传入的指定列进行排序了,也就是会把传入的列当成字符串,sql 执行就会非预期。

哦我写错了,在原文里改好了,我在github上和作者讨论过,作者认为要么用choose标签要么用java层面进行逻辑判断。

👍 看了你好多的修订意见挺不错的。

ivybao0628 avatar Jun 28 '21 09:06 ivybao0628