免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: senir
打印 上一主题 下一主题

验证码采用cookie保存 [复制链接]

PHPQuest 该用户已被删除
11 [报告]
发表于 2009-04-15 23:42 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
12 [报告]
发表于 2009-08-10 03:27 |只看该作者
只要放在客户端就没有安全性可言,不管你是怎么加密的。
看下验证流程:
$seccode = $_POST['seccode']; //用户提交的
$seccode_cookie = $_COOKIE['seccode_cookie']; //cookie里加密后的,也是用户"提交"

if(加密运算($seccode) == $seccode_cookie) {
    //验证成功
} else {
    //验证失败
}
setcookie('seccode_cookie','',-3600); //清除客户端seccode_cookie

上面是一般的验证流程,其实这个流程就是在判断用户提交的两个参数是否相等,假设我得到了验证码1234,加密后的cookie值是aslkdj291udad912dlksa09
这两个值都是你服务器发送到我浏览器的。
现在好了,我用fsockopen开始模拟浏览器提交,验证码就是1234,cookie是aslkdj291udad912dlksa09,这这样你会一直判断我的提交是正确的,因为我fsockopen的时候不接受set-cookie,而你验证的只是我提交的两个值经过你的算法运算后是否相等。
这样,你的验证码就形同虚设了,所以,要想验证码起到作用,必须将信息放在服务器,放在客户端是没有任何安全性可言的,不管你怎么绞尽脑汁去想怎么加密。

论坛徽章:
0
13 [报告]
发表于 2009-08-10 09:55 |只看该作者
放在COOKIES里也是可以的,
安全问题也可以避免~~~ 但是比较麻烦就是了。

有好的加密方法可以验证。一般情况下都OK。。。可以对付下菜鸟。。

对于高手就难了。。
不安全的是,我只要访问你网站一次,拿到了Cookies,然后,我直接使用这段COOKIES,
也就是说,我怎么提交,验证码都不会变。 因为我直接使用这段COOKIES了,不再去你网站生成新的。

所以。。。。。

[ 本帖最后由 Kagilo 于 2009-8-10 10:01 编辑 ]

论坛徽章:
0
14 [报告]
发表于 2009-08-10 11:01 |只看该作者
@12楼


$priv_key='#&^^&*&((';           //密钥
$seccode = $_POST['seccode']; //用户提交的
$seccode_cookie = $_COOKIE['seccode_cookie']; //cookie里加密后的,也是用户"提交"的

if(md5($seccode.$priv_key) == $seccode_cookie) {
    //验证成功
} else {
    //验证失败
}
setcookie('seccode_cookie','',-3600); //清除客户端seccode_cookie


防止cookie重复提交复用,可在cookie加上时间戳,并一同加密,以判断验证码有效时间。

[ 本帖最后由 bs 于 2009-8-10 17:50 编辑 ]

论坛徽章:
0
15 [报告]
发表于 2009-08-10 19:02 |只看该作者

回复 #14 bs 的帖子

不管你怎么加密,我提交的是你加密后的数据,就算你判断时间,那也总有个有效时间吧,在你的有效时间内,我一样可以大量重复提交。

论坛徽章:
0
16 [报告]
发表于 2009-08-28 15:35 |只看该作者
原帖由 axpwx 于 2009-8-10 03:27 发表
只要放在客户端就没有安全性可言,不管你是怎么加密的。
看下验证流程:
$seccode = $_POST['seccode']; //用户提交的
$seccode_cookie = $_COOKIE['seccode_cookie']; //cookie里加密后的,也是用户"提交"的 ...

多谢! 这个我明白了,呵呵,看来放COOKIE确实不行啊,只要是判断两个参数是否相等的,我都可以用浏览器来访问以下服务器,将这个cookie值记下来,然后不停的发这两个参数。
楼上的说加时间戳的,也是个办法,但是这个时间定起来不好掌握,定太短了,用户可能填写完信息后就提示验证码过期了,影响用户体验,定义长了这个时间段内依然可以攻击。
看来最理想的方式就是放在服务器端。
谢谢各位了。

论坛徽章:
0
17 [报告]
发表于 2009-08-28 15:52 |只看该作者
另外再问大家一个问题,关于客户端IP地址的,我写过一个投票程序,判断一个IP地址一天只能投5票,
但是还是有刷票的,我从网上下载过一个刷票器,是用C#写的,.NET 2.0环境,可以不断变换IP来投。
我就奇怪了,我用的$_SERVER里的一些变量来得到IP的,我查了一下IP不是从header头传到服务器的,
刷票器肯定是不停的发送http请求,但是这个IP是怎么变的呢?
我还想问一下PHP(或者说APACHE)是怎么得到客户端IP的,难道是封装在TCP包里面的?

论坛徽章:
0
18 [报告]
发表于 2009-08-29 11:03 |只看该作者

回复 #17 senir 的帖子

用代理不就可以变IP么

论坛徽章:
0
19 [报告]
发表于 2009-08-31 13:39 |只看该作者
原帖由 aaaaa5aa 于 2009-8-29 11:03 发表
用代理不就可以变IP么

具体如何来做,如果我想用fsockopen来模拟浏览器的话

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
20 [报告]
发表于 2009-09-14 15:43 |只看该作者
http://cn2.php.net/function.fsockopen

If you have to use a proxy to make requests outside of your local network, you may use this class:

<?php
/*
*
* No Proxy Authentification Implemented; PHP 5
*
*/

class RemoteFopenViaProxy {

    private $result;
    private $proxy_name;
    private $proxy_port;
    private $request_url;

    public function get_proxy_name() {
        return $this->proxy_name;
    }

    public function set_proxy_name($n) {
        $this->proxy_name = $n;
    }

    public function get_proxy_port() {
        return $this->proxy_port;
    }

    public function set_proxy_port($p) {
        $this->proxy_port = $p;
    }

    public function get_request_url() {
        return $this->request_url;
    }

    public function set_request_url($u) {
        $this->request_url = $u;
    }

    public function get_result() {
        return $this->result;
    }

    public function set_result($r) {
        $this->result = $r;
    }

    private function get_url_via_proxy() {

        $proxy_fp = fsockopen($this->get_proxy_name(), $this->get_proxy_port());

        if (!$proxy_fp) {
            return false;
        }
        fputs($proxy_fp, "GET " . $this->get_request_url() . " HTTP/1.0\r\nHost: " . $this->get_proxy_name() . "\r\n\r\n");
        while (!feof($proxy_fp)) {
            $proxy_cont .= fread($proxy_fp, 4096);
        }
        fclose($proxy_fp);
        $proxy_cont = substr($proxy_cont, strpos($proxy_cont, "\r\n\r\n") + 4);
        return $proxy_cont;

    }

    private function get_url($url) {
        $fd = @ file($url);
        if ($fd) {
            return $fd;
        } else {
            return false;
        }
    }

    private function logger($line, $file) {
        $fd = fopen($file . ".log", "a+");
        fwrite($fd, date("Ymd G:i:s") . " - " . $file . " - " . $line . "\n");
        fclose($fd);
    }

    function __construct($url, $proxy_name = "", $proxy_port = "") {

        $this->set_request_url($url);
        $this->set_proxy_name($proxy_name);
        $this->set_proxy_port($proxy_port);

    }

    public function request_via_proxy() {

        $this->set_result($this->get_url_via_proxy());
        if (!$this->get_result()) {
            $this->logger("FAILED: get_url_via_proxy(" . $this->get_proxy_name() . "," . $this->get_proxy_port() . "," . $this->get_request_url() . ")", "RemoteFopenViaProxyClass.log");
        }
    }

    public function request_without_proxy() {

        $this->set_result($this->get_url($this->get_request_url()));
        if (!$this->get_result()) {
            $this->logger("FAILED: get_url(" . $url . ")", "RemoteFopenViaProxyClass.log");
        }
    }
}
?>

Use it this way:

<?php
// call constructor
$obj = new RemoteFopenViaProxy($insert_request_url, $insert_proxy_name, $insert_proxy_port);
// change settings after object generation
$obj->set_proxy_name($insert_proxy_name);
$obj->set_proxy_port($insert_proxy_port);
$obj->set_request_url($insert_request_url);
$obj->request_via_proxy();
echo $obj->get_result();
?>

If there are errors during execution, the script tries to write some useful information into a log file.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP