secguide
secguide copied to clipboard
#java# 规范 1.1.1 条修订建议
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>
太强了
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 执行就会非预期。
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层面进行逻辑判断。
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层面进行逻辑判断。
👍 看了你好多的修订意见挺不错的。