php 防范 SQL 注入这样够不够

2015-02-07 08:54:46 +08:00
 liuhaotian
看了一些资料,自己这样子做还有啥问题。
1. 非富文本编辑,对于要用MySQL查询的语句得到的GET POST变量使用mysql_escape_string(),然后转义掉%和_。
2. 富文本编辑,mysql_escape_string()之后base64_encode存储。

这样子做还会有什么问题?还望各位指教。
4079 次点击
所在节点    问与答
29 条回复
oott123
2015-02-07 08:56:46 +08:00
base64_encode 的意义在哪里?
liuhaotian
2015-02-07 08:57:39 +08:00
@oott123 html代码不能简单过滤,但是我不知道怎么处理... 于是就base64了,这样没用的话,应该怎么防范,请指教0 0
iloveyou
2015-02-07 08:58:59 +08:00
防注入pdo参数绑定不就行了
oott123
2015-02-07 09:06:29 +08:00
@liuhaotian HTML 代码过滤的最终目的是在展示的时候防止 xss 等安全问题,而不是防止在入库的时候被注入。
所以你要么用 htmlspecialchars 即根本不用富文本,要么用一些现成的 xss 过滤的库。
RIcter
2015-02-07 09:13:24 +08:00
我审计过许多全局转义$_GET和$_POST的CMS,仍然能挖到注入(不要问我怎么挖的
mcfog
2015-02-07 09:26:15 +08:00
mysql_escape_string名义上防注入,实际上换个角度看反而是注入的主要原因(拼接sql),在业务里用这个函数约等于存在/未来存在注入

**靠小心翼翼是防止不了漏洞的**
lxrmido
2015-02-07 09:36:32 +08:00
如楼上所说的,base64解决不了富文本编辑的问题……还加大了检索难度
mysql_escape_string要连接mysql使用,还不如addslashes,而且mysql_系列函数已经废弃了
对于现在流行的注入方式,这两个措施其实都没啥用……
还是统一处理一下输入输出或者PDO吧……
loveyu
2015-02-07 09:37:41 +08:00
pdo绑定参数就可以解决了,只是HTML的xss过滤没那么容易
lincanbin
2015-02-07 09:41:01 +08:00
别看那些十几年前出来的旧书了
Mysql是php中已经废弃的特性了,现在只用mysqli和Pdo了,既然用这两个,当然得用参数绑定来防止注入,这是我的一个支持where in 参数绑定的Pdo类。
https://github.com/lincanbin/PHP-PDO-MySQL-Class
lincanbin
2015-02-07 09:45:50 +08:00
拼接字符串那种方法就算用函数过滤输入还是有局限性的,例如一些输入确实就有有用的引号,所以还是得用参数绑定,堵不如疏。
https://github.com/lincanbin/PHP-PDO-MySQL-Class/blob/master/README.md

Preventing SQL Injection Attacks

Safety: Use parameter binding method

Safety Example:

<?php
$DB->query("SELECT * FROM fruit WHERE name=?", array($_GET['name']));
?>
Unsafety: Split joint SQL string

Unsafety Example:

<?php
$DB->query("SELECT * FROM fruit WHERE name=".$_GET['name']);
?>
aveline
2015-02-07 10:18:31 +08:00
拼接 SQL 是一个不好的习惯。

正确的姿势是使用 Prepared Statement。
kslr
2015-02-07 10:25:30 +08:00
PDO
Jaylee
2015-02-07 10:25:47 +08:00
@aveline Prepared Statment也只能防SQL注入,对于前端的xss还是要过滤,去找找相关的库吧
Moker
2015-02-07 10:35:29 +08:00
最近也在找SQL注入的相关资料,我发现前几天写的站,安全性基本处于0的情况,查询基本就是拼接,前端输入进行了限制
watsy0007
2015-02-07 10:42:46 +08:00
需求这么大,必然有处理好的第三方库。
另外,一般上了框架以后,用框架的绑定参数增删改查。
Moker
2015-02-07 11:01:27 +08:00
@lincanbin 用这种代码方式就可以防止SQL注入?
lincanbin
2015-02-07 11:10:59 +08:00
@Moker 是,这个叫参数绑定,引入GitHub上那个类后别再用参数拼接了
Moker
2015-02-07 11:18:44 +08:00
@lincanbin SQLSTATE[HY000] [1045] Access denied for user 'xxxxx'@'localhost' (using password: YES)
出现这样的问题,网上查过好像是说权限问题,我是本地测试的,检查过用户配置,发现权限没问题
kslr
2015-02-07 11:25:14 +08:00
@Moker 权限没问题为什么会提示没权限? 仔细检查吧,估计就在那个旮旯
kslr
2015-02-07 11:25:50 +08:00
@Moker 你是远程连接么

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/168955

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX