关于SQL注入的问题

各位朋友,大家好。
有个问题关于SQL注入的,网上搜索出来的答案都不是很满意,所以放到这里来请教下大家了。
到底SQL注入是个什么样的问题导致的,网上所说的SQL拼接会导致注入问题是怎么回事,可以的话,麻烦举个例子,越详细越好,十分感谢!哦,还有如何避免SQL注入问题? :)

先说下怎么避免。关键字:绑定参数。
java api中的例子:
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
SET SALARY = ? WHERE ID = ?");
pstmt.setBigDecimal(1, 153833.00)
pstmt.setInt(2, 110592)

如何注入:
String id="1";
String sql="select * from emp where id='"+id+"'";
这是什么意思?是查询emp表中id为1的字段对吧。
看看这个:
String id="1' or '1'='1";
String sql="select * from emp where id='"+id+"'";
是什么结果?与select * from emp没区别了吧。
如果使用绑定参数,id="1' or '1'='1"会被当成一个字符串处理。
当然,这个一个小例子,所以在我们操作数据库的时候要小心。

简单的说:
[b]如果你的sql语句是拼字符串的话 ,别人就可以进行sql注入。这样就很不安全了。[/b]
举个例子:
假设前台是登陆页面 (有用户名 和密码) 后台的sql 语句是这样写的
[code="sql"]String sql="select * from UserInfo where name='"+name+"'and password='"+password+"'";[/code]
假设有个用户登陆时 这样 输入 [color=red] 用户名:admin ' or 1=1-- 密码:123[/color]那么 你的sql语句就变为: select * from userinfo where name='admin ' or 1=1 --'and password='123'

这样的话别人也可以登陆
是不是很不安全啊 我输入一个错误的用户名和密码 同样可以登录

怎样避免呢 用存储过程:

[code="存储过程"]create proc proc_UserInfo

@name varchar(50),
@password varchar(50)

as

select * from userinfo where name=
@name and password=@password
exec proc_UserInfo 'admin or 1=1-- ','123'[/code]

就可避免被注入