mysql的utf8并不是完整的utf8,只能存储最多三个字节的字符,而完整的utf8编码是一个字符最多可以占用4个字节的。这就导致一些4个字节的字符不能存进utf8编码的表里面,比如emoji表情符号。mysql5.5.3版本的时候新增了一个新的字符集,叫做utf8mb4,这个就是真正的utf8编码的,也可以直接存储emoji表情符号。utf8mb4的字符范围是包含utf8的,所以,我们可以直接把当前数据库的编码转换成utf8mb4,不会有任何问题。为了避免以后因为字符范围而导致的问题,我们在新建数据库的时候也应该用utf8mb4代替utf8作为默认的字符编码。校验规则的话utf8mb4_general_ci和utf8mb4_unicode_ci都是可以得,mysql默认是前者,前者校验速度较快,后者则更准确一点。那么如何把当前数据库的编码由utf8转换为utf8mb4呢?我们需要下面几步:首先,我们先备份下原来的数据库,是吧?为了保险起见。然后呢!再核对下msyql的版本号,如果版本低于5.5.3的话就先升级一下吧!第三步,修改数据库,表和列,数量少的话可以直接执行sql语句:#修...
 发布日期: 2015-11-17    分类: MySQL    浏览量: 3625   0条评论  
1、验证码验证码被认为是对抗CSRF攻击最简洁而有效的防御方法CSRF攻击的过程,往往是在用户不知情的情况下构造了网络请求。而验证码,则强制用户必须与应用交互,才能完成最终请求。因此,在通常情况下,验证码能够很好地遏制CSRF攻击。通常我们不可能在所有地方都加上验证码,所有这个也只能作为一种辅助手段。2、Referer Check就是检查请求的来源,这个还可以用来做图片的防盗链。Referer是由浏览器通过HTTP头来发送的。但是,这个头也不是什么时候都有的,很多情况下都是没有的,还可以通过程序来自定义。这个也只能作为一个辅助手段。3、Anti CSRF Token防御CSRF的主要方法是使用一个Token。CSRF的本质原因就是重要操作的所有参数都能被攻击者猜测到。攻击者只有预测出一个URL的所有参数与参数值,才能成功构造出一个伪造的请求,反之,攻击者无法攻击成功。因此我们可以在每个请求上面新家一个token参数,这个token是随机的,不可预测的,并且只有用户和服务器知晓,不能被第三方获取。提交请求时,服务器只需验证请求中的token是否存在及合法就可以了。Token的几个使用原则...
 发布日期: 2015-07-28    分类: 其他    浏览量: 3355   0条评论  
1、HttpOnlyHttpOnly最早由微软提出,并在IE6中实现,至今已经逐渐成为一个标准。浏览器将禁止页面的javascript访问带有HttpOnly属性的Cookie。严格来说,HttpOnly并非为了对抗XSS,HttpOnly解决的是XSS后的Cookie劫持攻击。PHP设置带HttpOnly属性Cookie的方法是使用自带的setcookie函数:setcookie('PHPSESSID', '79ce945e3bfd1917919e63a7ddbfe385', null, null, null, null, true);最后一个参数是设置httponly属性,执行后服务器会发送如下设置cookie的头:Set-Cookie:PHPSESSID=79ce945e3bfd1917919e63a7ddbfe385; path=/; HttpOnly2、输入检查常见的Web漏洞如XSS、SQL注入等,都要求攻击这构造一些特殊字符,这些特殊字符可能是正常用户不会用到的,所有输入检查就有存在的必要了。输入检查,在很多时候也被用于格式检查。例如网站注册使用的用户名,会被要求只能用字...
 发布日期: 2015-07-27    分类: 其他    浏览量: 3285   0条评论  
1、定位执行效率较低的sql语句通常有两种方法。一种是慢查询日志,用--log-slow-queries[=file_name]启动时,mysql会记录所有执行时间超过long_query_time秒的sql语句的日志文件。 long_query_time参数单位时秒,精度可以精确到微秒,默认情况下管理语句和不使用索引进行查询的语句是不会记录的,如果要记录这两类sql语句可以用--log-slow-admin-statements和log_queries_not_using_indexes来控制。还有一种方法就是使用show processlist命令查看当前mysql在进行的线程,包括线程的状态,是否锁表等,实时的查看sql的执行情况,同时对锁表操作进行优化。2、通过explain分析低效sql的执行计划 explain命令可以获取mysql的执行计划。执行如下命令:EXPLAIN SELECT * FROM `user` WHERE `uid`=1会显示:         id: 1   select_type: SIMPLE         table: user        ...
 发布日期: 2015-07-26    分类: MySQL    浏览量: 2530   0条评论  
服务器端:package main import (     "bufio"     "bytes"     "fmt"     "net"     "os"     "strconv"     "time" ) var User map[string]*net.TCPConn func main() {     var tcpAddr *net.TCPAddr     var tcpListen *net.TCPListener     var tcpConn *net.TCPConn     var err error     User = make(map[string]*net.TCPConn)     //监听端口     tcpAddr, err = net.ResolveTCPAddr("tcp4", ":5000")     if err != nil {         fmt.Println(err)         os.Exit(1)     }     //监听     tcpListen, err = net.ListenTCP("tcp4", t...
 发布日期: 2015-06-30    分类: Go    浏览量: 2690   0条评论  
这是一份写HTML的样板,每写一个新的HTML页面都可以用它来初始化。<!-- HTML5. Use tags like <article>, <section>, etc. See: http://www.sitepoint.com/web-foundations/doctypes/ --> <!doctype html> <html>   <head>     <meta charset="utf-8">     <!--     Ask IE to behave like a modern browser     See: https://www.modern.ie/en-us/performance/how-to-use-x-ua-compatible     -->     <meta http-equiv="x-ua-compatible" content="ie=edge">     <title>My Site</title>   ...
 发布日期: 2015-06-24    分类: HTML/CSS    浏览量: 2462   0条评论  
pjax=ajax + pushState。像github上面点击一个链接都会有个load的动画,github用的就是pjax加载的这些链接内容。这里用jQuery的pjax库:jquery-pjax.js,github地址:https://github.com/defunkt/jquery-pjax最基础的用法:$(document).pjax('a', '#pjax-container')会在本页面的所有a链接上面启用pjax,内容替换的容器是id为pjax-container的元素,也可以是一个class的元素。上面这句话会使页面上所有的a链接都启用pjax,但是如果我只想部分链接启用呢?我们可以给a元素加上data-pjax属性,然后选择器写上a[data-pjax],这样就只有类似<a data-pjax href=""></a>的链接才会启用pjax。pjax函数的原型:$(document).pjax(selector, [container], options)第一个参数selector是一个字符串,代表一个可以被点击的元素。第二个参数是选择器字...
 发布日期: 2015-06-24    分类: Javascript    浏览量: 3283   0条评论  
yii2的程序功能测试yii2集成了Codeception测试框架,所以是官方支持程序的单元测试,功能测试和验收测试。yii2的基本应用模板和高级应用模板都支持这三种测试。测试文件是在tests目录,很明显。这里主要是介绍怎么来用框架提供的这个测试功能。第一步安装Codeception:composer global require "codeception/codeception=2.0.*" composer global require "codeception/specify=*" composer global require "codeception/verify=*"第二步是添加全局命令执行命令composer global status,命令的输出应该会有一个目录,类似如下输出:Changed current directory to <directory>把<directory>/vendor/bin添加到系统环境变量path里面,这样做的目的是可以全局执行codecept命令。第三部是安装依赖包在项目根目录,就是有composer.json文...
 发布日期: 2015-06-02    分类: PHP    浏览量: 5096   0条评论  
文章是翻译自Go官方博客的文章:http://blog.golang.org/errors-are-values随便翻译的一下,给自己参考,有需要的同学也可以参考参考,翻译的不好的地方或者难以理解的地方请参考原文。本人英语本身也不怎么样!所有有可能会有理解错误,用词不当,语言组织不当的地方,请见谅!该怎么样去处理错误(errors),是go程序员特别是刚学go的人之间的一个共同讨论点。讨论经常会随着下面这段程序出现的次数越来越多而变成抱怨。if err != nil {     return err }我们最近扫描了所有我们能够找到的开源项目,发现重复出现这段代码的次数是每页或者每两页只出现了一次,是不是比你想象中的要少很多。然而,如果你还是感觉必须到处写if err != nil,那一定是哪里出了问题,并且会认为问题很明显是出在go自己身上。很不幸,这是错误的,而且这很容易去纠正。假如一个新手go程序员去提问这发生了什么,“怎么会只有一个错误处理?”,其实你应该学习这种模式,并且保持它。在其他编程语言里面,一种可能方式是使用try-catch块或者其他类似原理的方式去处理错误(err...
 发布日期: 2015-05-24    分类: Go    浏览量: 2972   0条评论  
go有一个官方包来操作json格式的数据,包位于encoding/json。JSON编码func Marshal(v interface{}) ([]byte, error)返回用JSON编码v之后的值。类型转换规则:boolean值会编码成JSON的boolean;float,integer会编码成JSON的number;string值会编码成UTF-8JSON字符串,无效的字节用Unicode替换,"<"和">"编码成"\u003c" and "\u003e","&"编码成"\u0026";array和slice会编码成JSON array,[]byte编码成base64字符串,空的slice编码成null;struct会编码成JSON object。空值是指false,0,空指针或者空interface,任何长度为0的array,slice,map或者string。json对象默认的key字符串是strut的字段名,也可以自己指定名字,方法是在每个字段最后用“json”标签指定名字:比如:type Personal struct {     Name stri...
 发布日期: 2015-05-20    分类: Go    浏览量: 8399   0条评论