验证码,一个对用户毫无价值,但对网站却是一个自我保护的屏障。
通常,验证码出现在提交表单的情况下,用于网站判断数据提交方是正常用户还是机器人。
比如:
1:在新用户的注册流程。可以用来遏制恶意注册。
2:用户密码取回流程。可以用来防止用户密码被恶意夺取。
3:用户登录。一般出现在多次密码输入错误,可以用来防刷密码。
4:文章评论。可以防止广告等信息的传播。
......
从产品上看,以上流程,对用户体验而言,让用户输入验证码,无疑是在骚扰用户。毕竟,恶意行为在独立用户、独立ip中是少数。这样的产品设计是让99个用户为1个用户的恶意行为买单。
但是从技术上看,以上流程让验证码的存在却是有价值的。尤其是用户行为分析机制尚未建立时,因为我们无法预知对用户的行为。
不要相信任何用户提交的数据。这一准则深深影响着程序员,我们对用户的提交的数据进行各种校验:是否符合产品上在页面规定的内容?是否符合数据库存储字段的属性?数据输入时是否会含有SQL注入的风险?数据输出时是否会影响页面的正常显示?数据中是否含有敏感词让某些人不高兴?
这一切对正常用户而言,均不是问题。但是对于少部分用户,比如好奇心强的技术性用户,甚至想从中得取不正当利益的利益团体。真正有威胁的是后者。而验证码就是双方攻防的重要阵地,所谓刀光剑影尽在于此。
基于以上讨论,我们是迫不得已在我们认为需要阻止恶意行为的地方加入验证码。这主要是一个技术问题,产品上是一个被迫的选择。
但现在,似乎,在有表单提交的地方,验证码就成了标配。从以上的分析中,其实并不是每个地方都有必要出现验证码。只有在那种技术上、产品上难以控制恶意行为的地方才需要。
一个比较典型的是:公司内网的登录为什么需要验证码?输入一次错误密码就是显示验证码的理由?尤其是那种半个小时不操作就要登录的系统,真是恶心的不行。半个小时不操作就让输入密码,本已很恶心,更恶心的是,这么频繁的操作偶尔输错一次密码还让输入验证码,真是恶心之极。
言归正传,我们谈谈其它避免出现验证码的场景。
一个登录后的用户,在进行操作时是否需要显示验证码?一个用户能登录,说明他通过了两个流程:注册、登录。以上我们谈到,这两个流程我们都是有必要用验证码来遏制恶意行为的。用户能正常登录,在很大程度上说明他不是一个恶意行为者。当然,不排除有恶意行为的可能,毕竟道高一尺,魔高一丈。这个时候就有必要考虑,是否为1个用户而为难99个用户了。
我认为是没有必要的。如果一定要考虑,我们可以变通的实现,以缓解用户对验证码的厌恶,毕竟验证码对用户是毫无具体意义的。
我们分场景讨论一下。我们把用户提交的信息分为两类:
1:影响用户自己。
2:影响其他用户。
对于影响用户自己的操作,如修改密码、用户信息。这些信息有的只是用户的一条数据而已,如昵称、生日等;有的是需要网站付出资源的,比如绑定一个由网站方提供的邮箱、需要费劲心思保护的商务信息(某某币等)、用户敏感信息(密码、密保信息)等等。对于前者,用户任意改,其实无所谓,对于后者,就需要我们注意对用户进行保护了,比如用户被恶意侵入怎么办?这个时候验证码是否该出现呢?不应该!这个时候应该让用户输入自己的密码。这样既避免用户对验证码的厌恶感,又提高了安全性,夸大一点说:提高网站的品牌形象,用户一看:哇,这网站在保护我的信息。
对于会影响其他用户的信息,如论坛的主题贴和回帖,博客、新闻的评论。如果这些地方显示验证码,从产品上让用户感觉不易用。但之前所说,道高一尺魔高一丈,如何遏制潜在的恶意行为?对这些产品而言,可使用的产品手段则比较多了。对于新注册的用户,很多网站都会禁言一段时间,但是这样也使正常用户感觉不爽,不利于网站推广。此时我认为可以采取产品手段:用户的注册时间、之前的活动量都是一个是否显示验证码的依据。对于可信赖的用户是无需使用验证码的!比如有些论坛就是积分大于某一值时就可以不显示验证码,当然对于这些用户的恶意行为的惩罚就是另一回事了。
总而言之,验证码是技术人员无奈的选择,产品上能不用就不用,敬而远之!
[2008-12-02 12:52:47] 雷人的网易验证码
与xargs命令最初相识是在发现一个磁盘满了,具体是在/var/spool/clientmqueue,主要原因是系统中有用户开启了crontab,而crontab中执行的程序有输出内容,输出内容会以邮件形式发给cron的用户,而sendmail没有启动所以就产生了这些文件。关于更详细的原理,可以参考我之前的文章:crontab命令的使用介绍及我的体会。
仅仅解决出现多文件的方法比较简单,在命令后加上“> /dev/null 2>&1”即可,表示程序员输出和运行错误都放到黑洞里面去,这样就不会产生文件了。
如果是要解决删除多文件的问题,则进入这个文件夹,执行“ls | xargs rm -f ”即可。xargs可以从管道中循环读取文件,一次一次的把信息输送给后面的“rm -f”。
请注意以上措辞:“一次一次的”,那么这个一次一次,是指“一个一个”还是“一批一批”呢?
很杯具,当时不求甚解,未能深入学习xargs,误解为“一个一个”。
最近在写一个程序时,需要处理一个文件中的行数据。平时都是使用php的fopen再fgets解决问题,但这次懒得套用这一套了,于是想使用管道把数据传送给php脚本。
而php脚本也利用$argv这个数组来获取命令行输入的参数,那么很简单的,获取$argv[1],就可以了。如“php a.php b”,$argv[0]为文件名a.php,$argv[1]就是后面的参数b了。于是想当然的:cat uid.txt | xargs php a.php 。
最终发现,uid.txt中有近4千行的数据,但是只处理了4行。那么,既然出现问题就边解决边学习吧!
使用:cat uid.txt | xargs echo > file.out
发现 file.out文件果然就是四行,但是每行都很长。。。。。
如下,uid.txt内容为:(“......”表示很多行)
| 以下是引用片段: 1234567890 ...... 2234567890 ...... 3234567890 ...... 4234567890 ...... |
那么file.out的结果为:
| 以下是引用片段: 第一行:1234567890 ...... 第二行:2234567890 ...... 第三行:3234567890 ...... 第四行:4234567890 ...... |
所以,程序处理每一行的第一个了,剩下的全部被忽略。而我期望的结果是xargs每次给我一行。
那么寻求man的帮助吧:
|
以下是引用片段: --max-chars=max-chars, -s max-chars --max-args=max-args, -n max-args |
首先看-s参数,它提示说每次的输出不能超过131072 bytes,从结果上看上去它每次都往最大的值释放数据。再看-n参数,提示我们可以使用这个参数指定每次从源文件中取几行数据,那么OK,搞定了!如下:cat uid.txt | xargs -n 1 php a.php。问题解决。
更进一步的:
1:其实每个系统对于参数列表的大小都有限制。比如ARG_MAX一般至少定义为4096 bytes。如果超过了ARG_MAX,将产生shell错误:Argument list too lang,这个问题可以用上面说的xargs命令解决问题。
2:xargs的-s参数,根据实战的结果,貌似会在指定的值和真实数据中取得平衡,不会只依据-s指定的大小活生生的把源数据的一行撕裂成两行。
-
很抱歉暂时没有!
之前做RSS输出的程序时,用"<![CDATA[内容]]>"解决了description节点文章内容的老断点的问题。当时不甚其解,也没花时间弄明白它的原理。
今天继续学习了一下XML的基础格式,豁然开朗。
每种数据格式,如果要被广泛推广,被多种解析器能理解,必需要有其特定的格式,就如语法一般。
虽然XML 和 HTML 为不同的目的而设计:
|
以下是引用片段: XML 被设计为传输和存储数据,其焦点是数据的内容。 |
但在语法上,两者有相似之处,HTML的标签都是放在“<”和“>”之间,XML也是如此。如在 XML 文档中放置了一个类似 "<" 字符,那么这个文档会产生一个错误,这是因为解析器会把它解释为新元素的开始。
而一般文章的内容可能包含意想不到的特殊字符,尤其是技术博客。那么为了避免此类错误,XML要求我们把字符 "<" 替换为实体引用,如:
| 以下是代码片段: <message>if salary < 1000 then</message> |
而不是
| 以下是代码片段: <message>if salary < 1000 then</message> |
那什么是实体引用呢,如下:
| 以下是引用片段: 在 XML 中有 5 个预定义的实体引用: < < 小于 > > 大于 & & 和号 ' ’ 单引号 " " 双引号 |
注释:严格地讲,在 XML 中仅有字符 "<"和"&" 是非法的。省略号、引号和大于号是合法的,但是把它们替换为实体引用是个好的习惯。
所以在文章内容输出的时候,做一次htmlspecialchars处理是很有必要的。
除了使用htmlspecialchars处理以外,XML还为我们提供了一个特殊的标签:CDATA 区段(CDATA section)中的文本会被解析器忽略。所谓被解析器忽略并不是舍弃内容,而是忽略中间的内容,不然中间的内容影响XML的格式。
CDATA 区段开始于 "<![CDATA[",结束于 "]]>":
| 以下是代码片段: <script> <![CDATA[ function matchwo(a,b) { if (a < b && a < 0) { return 1 } else { return 0 } } ]]> </script> |
在上面的例子中,在 CDATA 区段中的所有东西都会被解析器忽略。
特别注意:
1:CDATA 区段不能包含字符串 "]]>",所以,CDATA 区段的嵌套是不被允许的。
2:同时也需要确保在 "]]>" 字符串中没有空格或折行。
请参考:http://www.w3school.com.cn/xml/xml_cdata.asp
-
很抱歉暂时没有!


