1)
SQL注入是一種數據庫攻擊手段。攻擊者通過向應用程序提交惡意代碼來改變原SQL語句的含義,進而執行任意SQL命令,達到入侵數據庫乃至操作系統的目的。在Mybatis Mapper Xml中,#
變量名稱創建參數化查詢SQL語句,不會導致SQL注入。而$
變量名稱直接使用SQL指令,而$
變量名稱直接使用SQL指令,將會存在一定風險,當SQL指令所需的數據來源于不可信賴的數據源時,可能會導致SQL注入。
例如:以下代碼片段采用$
變量名稱動態地構造并執行了SQL查詢。
<!--select user information by name-->
<select id="queryByUserName" resultMap="userResultMap" parameterType="String">select * from db_user where user_name=${username}
</select>
如果攻擊者能夠替代username中的任意字符串,它們可以使用下面的關于username的字符串進行SQL注入。validuser' OR '1'='1
當其注入到命令時,命令就會變成:select * from db_user where user_name ='validuser' OR '1'='1'
。即使所輸入字符串不是來源于不可信賴的數據源,程序仍然存在著一定風險。
<!--select user information by name-->
<select id="queryByUserName" resultMap="userResultMap" parameterType="String"> select * from db_user where user_name=#{username} </select>
?
2)
程序間接引用了可能為null的變量,從而引發空指針異常。
例如:下面代碼片段中,在使用變量data之前沒有判斷它是否為null。
...
Data data = null
...
data.setId(id);
...
3)
AccessibleObject類是Field、Method和Constructor對象的基類,能夠允許反射對象修改訪問權限修飾符,繞過由Java訪問修飾符提供的訪問控制檢查。它讓程序員能夠更改私有字段或調用私有方法,這在通常情況下是不允許的。
例如:以下代碼片段中,將Field將accessible
標記設置為true。
Class clazz = User.class;
Field field = clazz.getField("name");
field.setAccessible(true);
...
4)?
在序列化類中,調用一些危險方法,例如反射相關的方法,同時如果應用對用戶輸入,即不可信數據,沒有進行校驗就進行反序列化處理,那么攻擊者可以通過構造惡意輸入,讓反序列化產生非預期的對象,非預期的對象在產生過程中就有可能帶來任意代碼執行。
例如引起2015年java反序列漏洞的組件Apache Commons Collections中的org.apache.commons.collections.functors.InvokerTransformer
類。
5)
程序中采用DNS名稱進行安全認證,但DNS名稱是容易被攻擊者進行欺騙的。
例如:下面代碼片段中,如果發生DNS欺騙,程序執行將會繞過安全驗證。
String ip = request.getRemoteAddr();
InetAddress inetAddress = InetAddress.getByName(ip);
if (inetAddress.getCanonicalHostName().endsWith("demo.com")) {//Verification passed
}
?6)
Java API中提供了java.util.Random
類實現PRNG()
,該PRNG是可移植和可重復的,如果兩個java.util.Random
類的實例使用相同的種子,會在所有Java實現中生成相同的數值序列。
例如:下面代碼片段中,使用了java.util.Random
類,該類對每一個指定的種子值生成同一個序列。
import java.util.Random;
// ...
public static void main (String args[]) {// ...for (int i = 0; i < 10; i++) {Random random = new Random(123456);int number = random.nextInt(21);...}
}
?