正在加载......
类别:[扩展学习]  时间: 2010-05-06 23:35:58; 浏览: 314; 评论: 0  
Tags : 验证码

    验证码,一个对用户毫无价值,但对网站却是一个自我保护的屏障。

    通常,验证码出现在提交表单的情况下,用于网站判断数据提交方是正常用户还是机器人。

    比如:

        1:在新用户的注册流程。可以用来遏制恶意注册。
        2:用户密码取回流程。可以用来防止用户密码被恶意夺取。
        3:用户登录。一般出现在多次密码输入错误,可以用来防刷密码。
        4:文章评论。可以防止广告等信息的传播。
        ......

    从产品上看,以上流程,对用户体验而言,让用户输入验证码,无疑是在骚扰用户。毕竟,恶意行为在独立用户、独立ip中是少数。这样的产品设计是让99个用户为1个用户的恶意行为买单。

    但是从技术上看,以上流程让验证码的存在却是有价值的。尤其是用户行为分析机制尚未建立时,因为我们无法预知对用户的行为。

    不要相信任何用户提交的数据。这一准则深深影响着程序员,我们对用户的提交的数据进行各种校验:是否符合产品上在页面规定的内容?是否符合数据库存储字段的属性?数据输入时是否会含有SQL注入的风险?数据输出时是否会影响页面的正常显示?数据中是否含有敏感词让某些人不高兴?

    这一切对正常用户而言,均不是问题。但是对于少部分用户,比如好奇心强的技术性用户,甚至想从中得取不正当利益的利益团体。真正有威胁的是后者。而验证码就是双方攻防的重要阵地,所谓刀光剑影尽在于此。

    基于以上讨论,我们是迫不得已在我们认为需要阻止恶意行为的地方加入验证码。这主要是一个技术问题,产品上是一个被迫的选择。

    但现在,似乎,在有表单提交的地方,验证码就成了标配。从以上的分析中,其实并不是每个地方都有必要出现验证码。只有在那种技术上、产品上难以控制恶意行为的地方才需要。

    一个比较典型的是:公司内网的登录为什么需要验证码?输入一次错误密码就是显示验证码的理由?尤其是那种半个小时不操作就要登录的系统,真是恶心的不行。半个小时不操作就让输入密码,本已很恶心,更恶心的是,这么频繁的操作偶尔输错一次密码还让输入验证码,真是恶心之极。

    言归正传,我们谈谈其它避免出现验证码的场景。

    一个登录后的用户,在进行操作时是否需要显示验证码?一个用户能登录,说明他通过了两个流程:注册、登录。以上我们谈到,这两个流程我们都是有必要用验证码来遏制恶意行为的。用户能正常登录,在很大程度上说明他不是一个恶意行为者。当然,不排除有恶意行为的可能,毕竟道高一尺,魔高一丈。这个时候就有必要考虑,是否为1个用户而为难99个用户了。

    我认为是没有必要的。如果一定要考虑,我们可以变通的实现,以缓解用户对验证码的厌恶,毕竟验证码对用户是毫无具体意义的。

    我们分场景讨论一下。我们把用户提交的信息分为两类:

        1:影响用户自己。
        2:影响其他用户。

    对于影响用户自己的操作,如修改密码、用户信息。这些信息有的只是用户的一条数据而已,如昵称、生日等;有的是需要网站付出资源的,比如绑定一个由网站方提供的邮箱、需要费劲心思保护的商务信息(某某币等)、用户敏感信息(密码、密保信息)等等。对于前者,用户任意改,其实无所谓,对于后者,就需要我们注意对用户进行保护了,比如用户被恶意侵入怎么办?这个时候验证码是否该出现呢?不应该!这个时候应该让用户输入自己的密码。这样既避免用户对验证码的厌恶感,又提高了安全性,夸大一点说:提高网站的品牌形象,用户一看:哇,这网站在保护我的信息。

    对于会影响其他用户的信息,如论坛的主题贴和回帖,博客、新闻的评论。如果这些地方显示验证码,从产品上让用户感觉不易用。但之前所说,道高一尺魔高一丈,如何遏制潜在的恶意行为?对这些产品而言,可使用的产品手段则比较多了。对于新注册的用户,很多网站都会禁言一段时间,但是这样也使正常用户感觉不爽,不利于网站推广。此时我认为可以采取产品手段:用户的注册时间、之前的活动量都是一个是否显示验证码的依据。对于可信赖的用户是无需使用验证码的!比如有些论坛就是积分大于某一值时就可以不显示验证码,当然对于这些用户的恶意行为的惩罚就是另一回事了。

    总而言之,验证码是技术人员无奈的选择,产品上能不用就不用,敬而远之!

也许您对下面的文章感兴趣:
  1. [2008-12-02 12:52:47] 雷人的网易验证码
类别:[Linux/Unix]  时间: 2010-04-29 11:20:25; 浏览: 545; 评论: 0  
Tags : xargs

    与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
              Use at most max-chars characters per command line, including the command and initial-arguments and  the
              terminating nulls at the ends of the argument strings.  The default is 131072 characters, not including
              the size of the environment variables (which are provided for separately so that it doesn’t  matter  if
              your  environment variables take up more than 131072 bytes).  The operating system places limits on the
              values that you can usefully specify, and if you exceed these a warning  message  is  printed  and  the
              value actually used is set to the appropriate upper or lower limit. 

       --max-args=max-args, -n max-args
              Use  at  most  max-args  arguments per command line.  Fewer than max-args arguments will be used if the
              size (see the -s option) is exceeded, unless the -x option is given, in which case xargs will exit.

    首先看-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指定的大小活生生的把源数据的一行撕裂成两行。

也许您对下面的文章感兴趣:
    很抱歉暂时没有!
类别:[扩展学习]  时间: 2010-04-16 16:58:49; 浏览: 424; 评论: 0  
Tags : CDATA rss xml

    之前做RSS输出的程序时,用"<![CDATA[内容]]>"解决了description节点文章内容的老断点的问题。当时不甚其解,也没花时间弄明白它的原理。

    今天继续学习了一下XML的基础格式,豁然开朗。

    每种数据格式,如果要被广泛推广,被多种解析器能理解,必需要有其特定的格式,就如语法一般。

    虽然XML 和 HTML 为不同的目的而设计:

以下是引用片段:

XML 被设计为传输和存储数据,其焦点是数据的内容。
HTML 被设计用来显示数据,其焦点是数据的外观。
HTML 旨在显示信息,而 XML 旨在传输信息。

    但在语法上,两者有相似之处,HTML的标签都是放在“<”和“>”之间,XML也是如此。如在 XML 文档中放置了一个类似 "<" 字符,那么这个文档会产生一个错误,这是因为解析器会把它解释为新元素的开始。

    而一般文章的内容可能包含意想不到的特殊字符,尤其是技术博客。那么为了避免此类错误,XML要求我们把字符 "<" 替换为实体引用,如:

以下是代码片段:
<message>if salary &lt; 1000 then</message>


    而不是

以下是代码片段:
<message>if salary < 1000 then</message>

    那什么是实体引用呢,如下:

以下是引用片段:
在 XML 中有 5 个预定义的实体引用:
&lt; < 小于
&gt; > 大于
&amp; & 和号
&apos; ’ 单引号
&quot; " 双引号

    注释:严格地讲,在 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

也许您对下面的文章感兴趣:
    很抱歉暂时没有!
类别:[PHP心得]  时间: 2010-04-14 18:19:20; 浏览: 400; 评论: 0  
类别:[Linux/Unix]  时间: 2010-04-13 17:13:13; 浏览: 366; 评论: 0  
Tags : find ls 速度
类别:[PHP心得]  时间: 2009-07-02 20:13:07; 浏览: 2505; 评论: 0  
Tags : 溢出
类别:[Linux/Unix]  时间: 2009-06-12 23:49:28; 浏览: 3168; 评论: 0  
Tags : find sed
类别:[随便说说]  时间: 2009-05-19 23:43:09; 浏览: 1551; 评论: 0  
Tags : 奋斗
类别:[Linux/Unix]  时间: 2009-04-28 22:52:31; 浏览: 1598; 评论: 0  
Tags : cut sort uniq
类别:[随便说说]  时间: 2009-03-31 14:41:52; 浏览: 2033; 评论: 0  
[180][1/18][1][2][3][4][5][6][7][8][9][10][>|] | 回页首
赞助商链接


芽雨关注
您是否也关注这些?
  Yahoo Boomerang
    Yahoo续YSlow推出的前端性能分析工具。
  Guru - Multiplexing
    php多线程
  Learning Advanced JavaScript
    这个Javascript的页面强烈推荐。
  2010烂砖奖第一季_网易房产
    网易新闻从业公民,值得尊重!
  Internet Explorer Does Not Send Referer Header in Unsecured Situations
    the Referer header will not be sent when the link is from an HTTPS page to a non-HTTPS page. The Referer header also will not be sent when the link is from a non-HTTP(S) protocol
  质疑清华诡异而怪诞的自主招生
    她表示说:“清华不是某一个人的清华。”
  四十篇被认为写得最好的中文色情小说
    深刻领悟组织的良苦用心
  linux服务器每秒并发处理数的计算方法
    1、利用网络处理量计算。2、利用服务器日志计算
  如何查看系统启动时间
    提供了5个方法
© 2004 - 2008 芽雨快跑 - 本页面所有内容,未经芽雨许可,欢迎转载,请注明出处
京ICP备09017802号
我要报警