探讨PHP SQL注入的解决思路

Jeelen 2006-11-13 07:22:02
今天研究了一下PHP SQL注入,发现很多网上防范方法很多有漏洞或比较繁琐.
我自己整理了一个思路,请大家探讨一下有没有漏洞.

思路:SQL里尽可能的采用两个引号闭合变量;对变量中的引号转义;对不能采用2个引号闭合的变量,先预先判断变量类型;

方案:
1 所有非数值运算(如字符,简单数值型等等)的SQL变量都加引号;
2 所有非数值运算的SQL变量的值都采用magic_quotes_gpc或者addslashes转义;
3 对需要数值运算的变量和其他不能加引号的SQL(如IN语句),预先判断变量类型.
4 关闭php.ini的disply_error.(可选,如不能关闭,需自己手动让SQL语句不能执行报错)
...全文
3692 78 打赏 收藏 转发到动态 举报
写回复
用AI写文章
78 条回复
切换为时间正序
请发表友善的回复…
发表回复
kyzy_yy_pm 2010-06-01
  • 打赏
  • 举报
回复
1、3条没必要
强制转换类型即可,至于addslashes,如果配置文件中配置了就不要加了,那个不是随便用就用的
Abin-2008 2010-06-01
  • 打赏
  • 举报
回复
真是強大....
yuanjun_xf 2010-06-01
  • 打赏
  • 举报
回复
是啊75楼的说的对 我在想PHP中转译后的字符串插入数据库会不会有错误了。。既然已经发现非法字符,怎么不直接给出提示跳转了,
michael_ls 2007-02-18
  • 打赏
  • 举报
回复
mysql5中好像也有了类似java中preparedStatement用法!
不知道这防sql注入的效果如何~~
King_of_WOW 2007-02-18
  • 打赏
  • 举报
回复
mark
ai_ni 2007-02-13
  • 打赏
  • 举报
回复
顶>>
idealabc 2007-02-12
  • 打赏
  • 举报
回复
SkyLu51 2007-02-12
  • 打赏
  • 举报
回复
所有的SQL语句中用到的PHP变量尽量都进行校验。
活靶子哥哥 2007-02-11
  • 打赏
  • 举报
回复
谢谢~
tinymay 2006-11-26
  • 打赏
  • 举报
回复
mark
wys444 2006-11-26
  • 打赏
  • 举报
回复
大多数情况下addslashes就足够了,记得数字也要加上单引号,即使加上引号也会被自动转换为数字,当然楼主说的in的使用要特殊处理下
ice_berg16 2006-11-23
  • 打赏
  • 举报
回复


"mysql5已默认关闭自动类型转换,即向数值型字段写入串时(比如'100')将产生语法错误"

--------------------------------------------
这个设定在哪里? 没找着.
我的mysql5似乎没问题.

参见
http://dev.mysql.com/doc/refman/5.1/zh/database-administration.html#server-sql-mode
NiuniuASP 2006-11-23
  • 打赏
  • 举报
回复
做个记号
装13 2006-11-23
  • 打赏
  • 举报
回复
站外提交有办法解决吗
hymxtang 2006-11-22
  • 打赏
  • 举报
回复
进来学习~~
Jeelen 2006-11-21
  • 打赏
  • 举报
回复
感谢楼上所有朋友的关注,
搜得一sql接收字段的安全转换(防sql注入)类,SafeSQL by Monte Ohrt,
有兴趣的朋友可以试试或动手编写一个适合自己的,
http://www.phpinsider.com/php/code/SafeSQL/

gozone 2006-11-17
  • 打赏
  • 举报
回复
值得交流 关注
poiu_poiu 2006-11-17
  • 打赏
  • 举报
回复
mark
Jeelen 2006-11-16
  • 打赏
  • 举报
回复
To yueliangdao0608(Crazy about Php and Mysql)

正确!如果确认你的服务器mysql支持存储过程,可以阻止mysql.
同时,检验字段输入值是比较好的习惯,适用于所有代码.

To minwent()
>写个函数把所有有危险的字符过滤掉。
>在每次参数传递都调用过滤一次就行。

网上有类试的方案,可以在csdn blog上搜,但是有漏洞.
比如 select * users where id=$id
$id中可注入 1 and 1>2 union select * from admin

数值型和一些特殊结构的sql(比如IN($a,$b,$c)) 可能是很多程序员容易忽视的检验.


Jeelen 2006-11-16
  • 打赏
  • 举报
回复
To PleaseDoTellMeWhy(沉默坚持) (

如果你已达到了你说的,我想你完全可以不用关心SQL注入.
加载更多回复(58)

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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