在网上看了些关于防止sql注入的文件和提问,比如使用预处理、过滤敏感字符。我一直想不明白的是,解决ssql注入问题非常非常简单啊,只要对用户输入的内容转义一下就可以了,就是讲用户输入的',"转义成\',\"就可以了,搞不懂为什么搞的那么复杂了?还是说我这种方法不能杜绝所有的sql注入
在网上看了些关于防止sql注入的文件和提问,比如使用预处理、过滤敏感字符。我一直想不明白的是,解决ssql注入问题非常非常简单啊,只要对用户输入的内容转义一下就可以了,就是讲用户输入的',"转义成\',\"就可以了,搞不懂为什么搞的那么复杂了?还是说我这种方法不能杜绝所有的sql注入
用htmlspecialchars/HTMLPurifier防御XSS注入,用预处理参数化查询防御SQL注入.
调用HTMLPurifier过滤XSS后输出HTML:
1 2 3 4 |
|
MySQLi绑定参数查询:
1 2 3 4 5 6 |
|
WireShark里用tcp.port==3306过滤分析PHP和MySQL通信
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
在 Request Prepare Statement 里可以看到 SELECT username
FROM pb_users
WHERE id
=?
在 Request Execute Statement 里可以看到 Parameter 内容为:
Type: FIELD_TYPE_LONGLONG (8)
Unsigned: 0
Value: 1
可见PHP将SQL模板和变量分两次发送给MySQL,由MySQL完成变量的转义处理.
既然SQL模板和变量是分两次发送的,那么就不存在SQL注入的问题了.
在MySQL的general_log里可以看到:
Prepare SELECT username
FROM pb_users
WHERE id
=?
Execute SELECT username
FROM pb_users
WHERE id
=1
如果ID绑定为string,则Execute时id赋值是这样的: id
='1'
如果PDO没有关闭模拟预处理,则可以看到:
Query SELECT username
FROM pb_users
WHERE id
=1
解决注入,还是PDO来的比较彻底,最不济也得mysqli,上bind,加类型.
只要对用户输入的内容转义一下就可以了,就是讲用户输入的',"转义成\',\"就可以了,搞不懂为什么搞的那么复杂了?还是说我这种方法不能杜绝所有的sql注入
你一定不知道有一种注入叫做宽字符注入,int型注入,orderBy注入,
其次注入其实非常容易防御,主要麻烦的是xss