李> <李> 李> <李> 李> <李> 李> <李> 李> <李> 李> <李> 李> <李> 李> <李> 李> <李> 李> <李> 李> <李> 李> <李> 李> <李> 李> <李> 李> <李> 李> <李> 李> <李> 李> <李> 李> <李> 李> <李> 李> <李> 李>
如果要避免这种风险,可以选择参数化
-
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
为何参数化可以防止注入?
作为MySQL JDBC驱动来说(5.1.31),其实就是对敏感字符做了转义。
观察com.mysql.jdbc。PreparedStatement的setString方法
可以看到有如下的替换过程
-
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李>
<李>
李