用PreparedStatement是否就可以防止SQL注入了啊?

sunboard 2008-12-10 09:19:22
在看些教程,说输入 3' OR 1='1 这个的时候 SQL语句就可以选择全部的东西通过一般的 验证了,这个亲自动手实验过了。后来我用了PreparedStatement发现输入那些也进不了,是否就可以防止注入了呢?
...全文
1073 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
fxw780106978 2010-07-04
  • 打赏
  • 举报
回复
十分感谢
julor 2010-05-15
  • 打赏
  • 举报
回复
学习了
老紫竹 2008-12-10
  • 打赏
  • 举报
回复
你猜对了。恭喜你。
注入,只针对手工拼装sql的情形。所以你的Preapred的那个SQL是否安全,才是关键,因为你无需关心参数了。
xinem 2008-12-10
  • 打赏
  • 举报
回复
是的,它完全防止注入。
xinem 2008-12-10
  • 打赏
  • 举报
回复
sunboard 2008-12-10
  • 打赏
  • 举报
回复
o o 意思是只要使用PreparedStatement 就随便怎么写了吧?
xinem 2008-12-10
  • 打赏
  • 举报
回复
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 相 对 Statement有以下 优 点:

1.防注入 攻 击

2.多次运行速度快

3.防止 数据 库缓 冲区溢出

4.代 码 的可 读 性可 维护 性好



这 四点使得 PreparedStatement 成 为访问 数据 库 的 语 句 对 象的首 选 ,缺点是灵活性不 够 好,有些 场 合 还 是必 须 使用 Statement。

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧