V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
liuhaotian
V2EX  ›  问与答

php 防范 SQL 注入这样够不够

  •  
  •   liuhaotian · 2015-02-07 08:54:46 +08:00 · 4177 次点击
    这是一个创建于 3608 天前的主题,其中的信息可能已经有所发展或是发生改变。
    看了一些资料,自己这样子做还有啥问题。
    1. 非富文本编辑,对于要用MySQL查询的语句得到的GET POST变量使用mysql_escape_string(),然后转义掉%和_。
    2. 富文本编辑,mysql_escape_string()之后base64_encode存储。

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

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

    正确的姿势是使用 Prepared Statement。
    kslr
        12
    kslr  
       2015-02-07 10:25:30 +08:00
    PDO
    Jaylee
        13
    Jaylee  
       2015-02-07 10:25:47 +08:00
    @aveline Prepared Statment也只能防SQL注入,对于前端的xss还是要过滤,去找找相关的库吧
    Moker
        14
    Moker  
       2015-02-07 10:35:29 +08:00
    最近也在找SQL注入的相关资料,我发现前几天写的站,安全性基本处于0的情况,查询基本就是拼接,前端输入进行了限制
    watsy0007
        15
    watsy0007  
       2015-02-07 10:42:46 +08:00
    需求这么大,必然有处理好的第三方库。
    另外,一般上了框架以后,用框架的绑定参数增删改查。
    Moker
        16
    Moker  
       2015-02-07 11:01:27 +08:00
    @lincanbin 用这种代码方式就可以防止SQL注入?
    lincanbin
        17
    lincanbin  
       2015-02-07 11:10:59 +08:00 via Android   ❤️ 1
    @Moker 是,这个叫参数绑定,引入GitHub上那个类后别再用参数拼接了
    Moker
        18
    Moker  
       2015-02-07 11:18:44 +08:00
    @lincanbin SQLSTATE[HY000] [1045] Access denied for user 'xxxxx'@'localhost' (using password: YES)
    出现这样的问题,网上查过好像是说权限问题,我是本地测试的,检查过用户配置,发现权限没问题
    kslr
        19
    kslr  
       2015-02-07 11:25:14 +08:00
    @Moker 权限没问题为什么会提示没权限? 仔细检查吧,估计就在那个旮旯
    kslr
        20
    kslr  
       2015-02-07 11:25:50 +08:00
    @Moker 你是远程连接么
    belin520
        21
    belin520  
       2015-02-07 11:29:44 +08:00 via Android
    大把第三方的数据库轮子,用一个,他们考虑的多了很多
    liuhaotian
        22
    liuhaotian  
    OP
       2015-02-07 11:52:20 +08:00   ❤️ 4
    @belin520 虽然不想重新造轮子,但是感觉这种东西如果自己懂了还是听有好处的。
    @lincanbin 这个参数绑定只支持PDO还是同时支持MySQLi?
    我在这里http://segmentfault.com/q/1010000000688197看到有人说参数绑定不如过滤?能否解释下 不是很懂。
    @lincanbin MySQLi是不是PDO和MySQL之间的过渡,所以还是用PDO比较好?
    Moker
        23
    Moker  
       2015-02-07 11:55:19 +08:00
    @kslr 不是远程 是 wamp本地搭建的测试环境
    tabris17
        24
    tabris17  
       2015-02-07 12:11:04 +08:00
    不要手工拼接SQL语句,啥问题都解决了
    lbp0200
        25
    lbp0200  
       2015-02-07 12:11:38 +08:00
    绑定参数
    lincanbin
        26
    lincanbin  
       2015-02-07 12:28:39 +08:00
    @liuhaotian 只支持PDO,然后参数绑定是防御SQL注入的有效手段,用过滤引号之类的来防SQL注入再蠢不过了,不要信。
    PDO主要是以后换数据库迁移会方便一些,例如以后不用MySQL了,换Oracle会方便些,另外PDO支持Dict型的参数绑定,比纯数组的要好用一些,在一些情境下。
    liuhaotian
        27
    liuhaotian  
    OP
       2015-02-07 12:51:12 +08:00   ❤️ 4
    @lincanbin $result = $DB -> query("SELECT * FROM `pcc_node` WHERE `show`=?",array('2'));
    这样为啥直接卡死了。。。
    taogogo
        28
    taogogo  
       2015-02-07 17:16:52 +08:00
    放着我来,专业web安全工程师手把手教你。。。

    反注入:参数绑定、mysql_escape单字段过滤(需统一字符集,最好全都是utf8)
    反xss:字符白名单、dom解析过滤、css白名单
    taogogo
        29
    taogogo  
       2015-02-07 17:17:16 +08:00
    需要web安全测试或者培训的话可以联系我
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5553 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 01:30 · PVG 09:30 · LAX 17:30 · JFK 20:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.