再看ibatis Order By注入問題
接上文
http://blog.itpub.net/29254281/viewspace-1318239/
領導讓開發同學鼓搗一個可配置化的後臺.
又回到了原來的問題
如果要靈活,很多引數要從前端頁面傳過來,有SQL隱碼攻擊的風險.
如果引數化SQL,又很難做到靈活..
先看一個注入的例子:
如果要避免這種風險,可以選擇引數化
為何引數化可以防止注入?
作為MySQL JDBC驅動來說(5.1.31),其實就是對敏感字元做了轉義.
觀察 com.mysql.jdbc.PreparedStatement 的 setString方法
可以看到有如下的替換過程
是不是可以使用 iBatis 的 $ 方式 增加靈活性,而在引數進入iBatis之前,手工進行一下敏感字元替換,而防止SQL隱碼攻擊呢?
http://blog.itpub.net/29254281/viewspace-1318239/
領導讓開發同學鼓搗一個可配置化的後臺.
又回到了原來的問題
如果要靈活,很多引數要從前端頁面傳過來,有SQL隱碼攻擊的風險.
如果引數化SQL,又很難做到靈活..
先看一個注入的例子:
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Statement;
- public class Test {
- public static void main(String[] args) throws SQLException {
- String para="/index.html' union all select * from probe -- ";
- Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mvbox", "xx", "xx");
- Statement ps=conn.createStatement();
- ResultSet rs = ps.executeQuery("select * from probe where path='"+para+"'");
- while (rs.next()) {
- System.out.println(rs.getString("host")+":"+rs.getString("path"));
- }
- rs.close();
- ps.close();
- conn.close();
- }
- }
如果要避免這種風險,可以選擇引數化
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- public class Test {
- public static void main(String[] args) throws SQLException {
- String para="/index.html' union all select * from probe -- ";
- Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mvbox", "xx", "xx");
- PreparedStatement ps=conn.prepareStatement("select * from probe where path=?");
- ps.setString(1, para);
- ResultSet rs=ps.executeQuery();
- while (rs.next()) {
- System.out.println(rs.getString("host")+":"+rs.getString("path"));
- }
- rs.close();
- ps.close();
- conn.close();
- }
- }
為何引數化可以防止注入?
作為MySQL JDBC驅動來說(5.1.31),其實就是對敏感字元做了轉義.
觀察 com.mysql.jdbc.PreparedStatement 的 setString方法
可以看到有如下的替換過程
- String parameterAsString = x;
- boolean needsQuoted = true;
- if (this.isLoadDataQuery || isEscapeNeededForString(x, stringLength)) {
- needsQuoted = false; // saves an allocation later
- StringBuffer buf = new StringBuffer((int) (x.length() * 1.1));
- buf.append('\'');
- //
- // Note: buf.append(char) is _faster_ than
- // appending in blocks, because the block
- // append requires a System.arraycopy()....
- // go figure...
- //
- for (int i = 0; i < stringLength; ++i) {
- char c = x.charAt(i);
- switch (c) {
- case 0: /* Must be escaped for 'mysql' */
- buf.append('\\');
- buf.append('0');
- break;
- case '\n': /* Must be escaped for logs */
- buf.append('\\');
- buf.append('n');
- break;
- case '\r':
- buf.append('\\');
- buf.append('r');
- break;
- case '\\':
- buf.append('\\');
- buf.append('\\');
- break;
- case '\'':
- buf.append('\\');
- buf.append('\'');
- break;
- case '"': /* Better safe than sorry */
- if (this.usingAnsiMode) {
- buf.append('\\');
- }
- buf.append('"');
- break;
- case '\032': /* This gives problems on Win32 */
- buf.append('\\');
- buf.append('Z');
- break;
- case '\u00a5':
- case '\u20a9':
- // escape characters interpreted as backslash by mysql
- if(charsetEncoder != null) {
- CharBuffer cbuf = CharBuffer.allocate(1);
- ByteBuffer bbuf = ByteBuffer.allocate(1);
- cbuf.put(c);
- cbuf.position(0);
- charsetEncoder.encode(cbuf, bbuf, true);
- if(bbuf.get(0) == '\\') {
- buf.append('\\');
- }
- }
- // fall through
- default:
- buf.append(c);
- }
- }
- buf.append('\'');
- parameterAsString = buf.toString();
- }
是不是可以使用 iBatis 的 $ 方式 增加靈活性,而在引數進入iBatis之前,手工進行一下敏感字元替換,而防止SQL隱碼攻擊呢?
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-2135866/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ibatis Order By注入問題BAT
- ibatis分頁問題BAT
- MyBatis order by失效問題MyBatis
- Ibatis相容性問題BAT
- ibatis sqlmaping的問題BATSQLAPI
- 抓狂的ibatis中文問題BAT
- iBatis問題,救命啊!!!急急急!!!BAT
- 請教關於ibatis的問題BAT
- mysql order by 和 group by 順序問題MySql
- Ibatis的疑問BAT
- MySql5.7及以上 ORDER BY 報錯問題MySql
- 關於maven import org.apache.ibatis.io.Resources中ibatis包不存在問題MavenImportApacheBAT
- SpringJdbcDaoSupport的注入問題JdbcTempleSpringJDBC
- Ibatis 中文條件查詢不到資料問題BAT
- MySQL order by limit 分頁資料重複問題MySqlMIT
- 【SQL 學習】排序問題之order by與索引排序SQL排序索引
- 關於Ibatis 轉換 oracle date型別的問題BATOracle型別
- sqli-Labs————less-46(order by 之後的注入)SQL
- 〖使用iBatis做select後不提交也不回滾問題〗BAT
- SQL中rownum和order by的執行順序的問題SQL
- 【MySQL】order by 結果不準確的問題及解決MySql
- 再看SnapKitAPK
- 如何解決sql注入安全漏洞問題SQL
- 遠端執行緒注入引出的問題執行緒
- 【演算法】2 由股票收益問題再看分治演算法和遞迴式演算法遞迴
- Action注入屬性值、字尾以及常量問題
- 在學習Mybatis時遇見的問題 org.apache.ibatis.exceptions.PersistenceException:MyBatisApacheException
- Java ibatis配置問題導致Myeclipse啟動web專案失敗JavaBATEclipseWeb
- ibatisBAT
- 對於Spring中注入物件失敗的問題Spring物件
- 監聽器中spring注入相關的問題Spring
- php注入專題PHP
- Mybatis中org.apache.ibatis.binding.BindingException錯誤問題總結MyBatisApacheException
- [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains 的問題 MySQLExpressAIMySql
- 再看MongoDB副本集MongoDB
- 再看阿里雲阿里
- 解決Spring中singleton中注入prototype Bean的問題SpringBean
- ibatis 使用文件BAT