MySQL SQL Column Truncation

一、什么是sql_mode

        The MySQL server can operate in different SQL modes, and can apply these modes differently for different clients, depending on the value of the sql_mode system variable. DBAs can set the global SQL mode to match site server operating requirements, and each application can set its session SQL mode to its own requirements.Modes affect the SQL syntax MySQL supports and the data validation checks it performs. This makes it easier to use MySQL in different environments and to use MySQL together with other database servers.

        MySQL服务器可以在不同的sql_node下工作,通过设置sql_mode这个系统变量的值,对于不同的客户端可以以不同的方式应用相应的模式。

        DBAs可以设置global sql_mode来满足的网站服务器的操作要求,同时每个应用程序也可以对自己的环境设置sesson  sql_mode。

        sql_mode 的设置影响Mysql对于SQL语法的支持,和数据的校验。

      

二、设置sql_mode

        在MySQL 5.6.6及以后的版本中,默认的sql_mode为 NO_ENGINE_SUBSTITUTION。在 MySQL 5.6.5及更早的版本,sql_mode为空。

        在命令行可以通过 select @@sql_mode获取当前的sql_mode值。

       

        在命令行设置 sql_mode的值。

       

        需要注意的是前面提到过sql_mode有golbal和sesson两种。上面的修改的 sql_mode 只是sessoon级别的,只影响当前会话,退出终端后失效。

        set global sql_mode ='STRICT_TRANS_TABLES‘;即为global sql_mode。


        sql_mode也可以在在配置文件my.cnf或my.ini中进行设置。


         The most important sql_mode values are probably these:

  • ANSI

    更改语法和行为,使其更符合标准SQL。

  • STRICT_TRANS_TABLES

    如果不能将给定的值插入到事务表中,则放弃该语句。对于非事务表,如果值出现在单行语句或多行语句的第1行,则放弃该语句。

  • TRADITIONAL

    Make MySQL的行为象“传统”SQL数据库系统。该模式的简单描述是当在列中插入不正确的值时“给出错误而不是警告”。注释:一旦发现错误立即放弃INSERT/UPDATE。如果你使用非事务存储引擎,这种方式不是你想要的,因为出现错误前进行的数据更改不会“滚动”,结果是更新“只进行了一部分”。

         NOTE!

         如果把sql_mode的值设置成后面的两个值(也就是我们说的严格模式),那么当在列中插入或更新不正确的值时,mysql将会给出错误,并且放弃insert/update操作。在我们的一般应用中建议使用这两种模式,而不是使用默认的空或ANSI模式。但是需要注意的问题是,如果数据库运行在严格模式下,并且你的存储引擎不支持事务,那么有数据不一致的风险存在,比如一组sql中有两个dml语句,如果后面的一个出现了问题,但是前面的已经操作成功,那么mysql并不能回滚前面的操作。因此说设置sql_mode需要应用人员权衡各种得失,从而得到一个合适的选择。

         更详细的关于sql_mode的信息,http://dev.mysql.com/doc/refman/5.6/en/sql-mode.html

        

三、SQL Column Truncation

        当sql_mode没有开启STRICT_TRANS_TABLES模式时,如果用户插入超长的值,只会提示warnning,不会error(error则插入失败),可能导致插入数据“截断”。

        表users的结构:

       

        开启STRICT_TRANS_TABLES时插入超出长度限制的值。

       

        显示error,未插入成功。

        关闭STRICT_TRANS_TABLES时插入超出长度限制的值。

       

        只提示warning,插入成功,值被截断。

       

        利用该漏洞,可能造成越权访问。

        比如创建一个username为"admin (20个空格)x",password为"123456"的用户,当后面身份授权只通过比对用户名时,将造成越权。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值