• 预编译种类及例子


    1、java中的预编译:

    (1)sql语句中变量的位置用?进行填补,后期再set进去:

        java.sql.PreparedStatement stmt = connection.prepareStatement(
                "SELECT * FROM users WHERE USERNAME = ? AND ROOM = ?");
        stmt.setString(1, username);
        stmt.setInt(2, roomNumber);
        stmt.executeQuery();

    (2)使用特定的new MapSqlParameterSource()类,

    将需要查询的变量整合成类似于php预编译中参数绑定的格式:

        String sql = "select * from user where userid=:userid";
        MapSqlParameterSource named_param = new MapSqlParameterSource();
        Timestamp tt = new Timestamp(System.currentTimeMillis());
        named_param.addValue("userid", "1");
        List list = this.jdbcTemplate.query(sql, named_param, new FirstGuideRowMapper());

    (3)据朋友说java中在构造sql语句时也可以 采用事务的预编译来预编译sql:

        个人认为,事务的预编译是不能够彻底对sql注入进行防范的,因为只有当sql语句出错时,事务才会回滚,

    而如果攻击者拼接成正确的sql语句,那么事务会正常执行并返回的。

        try {  
            PreparedStatement pset_f = conn.prepareStatement(sql);  
            pset_f.setString(1,inds[j]);  
            pset_f.setString(2,id);  
            pset_f.executeUpdate(sql_update);  
        }catch(Exception e){  
            //e.printStackTrace();  
             logger.error(e.message());  
        } finally{

           return;

        }

    2、php中的预编译:

    (1)sql语句中变量的位置用?进行填补:
        $stmt = $dbh->prepare("SELECT * FROM users WHERE USERNAME = ? AND PASSWORD = ?");
        $stmt->execute(array($username, $pass));

    (2)采用参数绑定的方法对sql进行预编译:
        $stmt = $dbh->prepare("SELECT * FROM users WHERE USERNAME=:username AND PASSWORD=:pass");
        $stmt->execute(array('username' => $username, 'pass' => $pass));

    3、perl中的预编译:

        my $stmt = $dbh->prepare('SELECT * FROM users WHERE USERNAME = ? AND PASSWORD = ?');
        $stmt->execute($username, $password);

    4、C#中的预编译:

        using (SqlCommand command = connection.CreateCommand())
        {
            command.CommandText = "SELECT * FROM users WHERE USERNAME = @username AND ROOM = @room";

            command.Parameters.AddWithValue("@username", username);
            command.Parameters.AddWithValue("@room", room);

            using (SqlDataReader dataReader = command.ExecuteReader())
            {
                // ...
            }
        }

    5、python中的预编译:

        import sqlite3
        conn = sqlite3.connect(':memory:')
        c = conn.cursor()

        _users = [('mother', 'red'),
                      ('father', 'green'),
                      ('me', 'blue')]
        c.executemany('INSERT INTO users VALUES (?,?)', _users)

        params = ('sister', 'yellow')
        c.execute('SELECT * FROM users WHERE username=? AND room=?', params)
        c.fetchone()

    6、Magic Direct SQL

        Virtual username Alpha 20 init: 'sister'

        Virtual password Alpha 20 init: 'yellow'

        SQL Command: SELECT * FROM users WHERE USERNAME=:1 AND PASSWORD=:2

        Input Arguments: 1: username 2: password

    参考文章:https://en.wikipedia.org/wiki/Prepared_statement

     
  • 相关阅读:
    nodejs安装配置
    微信小程序访问豆瓣api报403错误解决方法
    WEB前端开发规范
    Java编程思想总结笔记Chapter 5
    Java编程思想总结笔记Chapter 3
    Java编程思想总结笔记Chapter 2
    详解Android Activity生命周期
    Java编程思想总结笔记The first chapter
    详解Android Activity启动模式
    Android与H5互调(通过实例来了解Hybrid App)
  • 原文地址:https://www.cnblogs.com/ermei/p/5710532.html
Copyright © 2020-2023  润新知