,statement和preparedStatement的优缺点各是什么?

用户投稿 108 0

关于“php_preparestatement”的问题,小编就整理了【4】个相关介绍“php_preparestatement”的解答:

statement和preparedStatement的优缺点各是什么?

PreparedStatement可重复使用,提高效率;另外还可防止注入攻击,例如用户登录的时候查询SQL拼装语句为:

String sql = "select * from tb_user where name = '" + username + "' and passwd = '" + password + "'";

假如程序中没有进行必要的输入合法性检测,别有用心的人在用户名栏输入:abc' or '1'='1,在密码栏输入:123,则拼装后的SQL语句为:select * from tb_user where name = 'abc' or '1'='1' and passwd = '123',则此语句永远都能正确执行,从而实现注入方式攻击。如果使用PreparedStatement,则会将输入的内容全部解析为字符串,而不会出现此漏洞。

String sql = "select * from tb_user where name = ? and passwd = ?";

为什么PrepareStatement可以防止sql注入?

其实是预编译功能,用preparedstatement就会把sql的结构给数据库预编译。

SQL注入 攻 击 是利用是指利用 设计 上的漏洞,在目 标 服 务 器上运行 Sql语 句以及 进 行其他方式的 攻 击 ,

动态 生成 Sql语 句 时 没有 对 用 户输 入的数据 进 行 验证 是 Sql注入 攻 击 得逞的主要原因。

对 于 JDBC而言, SQL注入 攻 击 只 对 Statement有效, 对 PreparedStatement 是无效的, 这 是因 为 PreparedStatement 不允 许 在不同的插入 时间 改 变查询 的 逻辑结 构。

如 验证 用 户 是否存在的 SQL语 句 为 :

select count(*) from usertable where name='用 户 名 ' and pswd='密 码 '

如果在 用 户 名字段 中 输 入 ' or '1'='1' or '1'='1

或是在 密 码 字段 中 输 入 1' or '1'='1

将 绕过验证 ,但 这种 手段只 对 只 对 Statement有效, 对 PreparedStatement 无效。

为什么PreparedStatement.isClosed报错?

获取是否已关闭了此 Statement 对象。

如果已经对它调用了 close 方法,或者它自动关闭,则 Statement 已关闭。这是api中的解释,PreparedStatement继承自Statement。

prepareStatement.setInt()中的参数值是什么?

  jdbc连接preparestatement里的方法setInt或者setString是根据SQL语句里设置的,如果和SQL语句里的类型没对应执行时,会报错。

  1、可以通过调用 Connection 对象的 preparedStatement() 方法获取 PreparedStatement 对象;

  2、PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句;

  2、PreparedStatement 对象所代表的 SQL 语句中的参数用问号(?)来表示,

  调用 PreparedStatement 对象的 setXXX() 方法来设置这些参数. setXXX() 方法有两个参数;

  第一个参数是要设置的 SQL 语句中的参数的索引(从 1 开始),第二个是设置的 SQL 语句中的参数的值。

  

到此,以上就是小编对于“php_preparestatement”的问题就介绍到这了,希望介绍关于“php_preparestatement”的【4】点解答对大家有用。

抱歉,评论功能暂时关闭!