奇怪的Captcha。这个怎么运作?

时间:2012-09-30 02:06:58

标签: php asp.net cookies captcha

我想从https://agent.lionair.co.id/lionairagentsportal/CaptchaGenerator.aspx获取图片验证码。

我无法得到它。

但是,如果我在打开https://agent.lionair.co.id/lionairagentsportal/default.aspx之前打开包含网址https://agent.lionair.co.id/lionairagentsportal/CaptchaGenerator.aspx的新标签页,则会显示该图片。

我对https://agent.lionair.co.id/lionairagentsportal/CaptchaGenerator.aspx感到好奇。如果我已经打开https://agent.lionair.co.id/lionairagentsportal/default.aspx,为什么我无法打开它。

我试过这段代码,但不幸的是我失败了。图像仍未显示。

<?php

//The curl_init() will initialize a new session and return a CURL handle.
//curl_exec($ch) This function should be called after you initialize a CURL session and     all the options for the session are set. Its purpose is simply to execute the predefined CURL session (given by the ch). 
//curl_setopt( $ch, option, value) Set an option for a CURL session identified by the ch parameter. option specifies which option to set, and value specifies the value for the option given.

$url = "https://agent.lionair.co.id/LionAirAgentsPortal/default.aspx"; // From URL to get webpage contents.
$cookie_file_path = "/opt/lampp/htdocs/curl-examples/cookieFolder/cook";

$ch = curl_init();  // Initialize a CURL session.
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);  // Return Page contents.
curl_setopt($ch, CURLOPT_URL, $url);  // Pass URL as parameter.
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path); // Tempat menaruh cookies.
$html = curl_exec($ch);  // grab URL and pass it to the variable.

$ch = curl_init();  // Initialize a CURL session.
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);  // Return Page contents.
curl_setopt($ch, CURLOPT_BINARYTRANSFER, TRUE);  // Karena keluarannya gambar, maka di-    set binary = true.
curl_setopt($ch, CURLOPT_URL, "https://agent.lionair.co.id/LionAirAgentsPortal/CaptchaGenerator.aspx");  // Pass URL as parameter.
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path); // Tempat cookies di mana cookies mana yang mau digunakan.

$gambar = curl_exec($ch);  // grab URL and pass it to the variable.
curl_close($ch);  // close curl resource, and free up system resources.

?>
<html>
<head>

</head>
<body>
    <form action="https://agent.lionair.co.id/LionAirAgentsPortal/default.aspx" name="form1" method="post">
        <label for="txtLoginName">Username: </label>
        <input type="text" name="txtLoginName" />
        <br/>
        <label for="txtPassword">Password: </label>
        <input type="password" name="txtPassword" />
        <br/>
        <img src="data:image/jpeg;base64,<?php echo $gambar; ?>" />
        <br/>
        <label for="CodeNumberTextBox">Captcha: </label>
        <input type="text" name="CodeNumberTextBox" />
        <br/>
        <input type="submit" value="otentikasi" />
    </form>
</body>

4 个答案:

答案 0 :(得分:2)

CAPTCHA生成器在会话中定义CAPTCHA,该会话仅由实际页面定义。这是一种非常标准的做法,只提供一种生成CAPTCHA的方法。

如果图像生成器负责生成CAPTCHA,那么您将遇到竞争条件,其中看到的内容不一定是提交页面之前的真实CAPTCHA值。此外,一些开发人员工具(如Firebug和Chrome的开发人员工具)可能会在内部加载图像,这会在用户不知情的情况下更新CAPTCHA。如果图像生成器也创建了CAPTCHA值,它只会导致更多的混淆。

答案 1 :(得分:1)

您可以在页面上使用包含default.aspx页面的透明iframe。这样服务器就会认为他需要为default.aspx页面提供服务,并在客户端上设置会话cookie。稍后,当您尝试访问CaptchaGenerator.aspx页面时,您将收到响应,因为会话cookie将存在于客户端cookie存储中。

<iframe src ="https://agent.lionair.co.id/LionAirAgentsPortal/default.aspx" style="widht:0px;height:0px"/>

您可能希望等待iframe加载,并且在尝试包含图像之前完成cookie创建过程,这可以使用Java Script在客户端完成。

希望我能提供帮助。

答案 2 :(得分:1)

很容易...... 添加以下代码:

  

$ ImageCaptcha = BASE64_ENCODE($。图片);

在“$ gambar = curl_exec($ ch);”

之后

然后更改您的代码:echo $ gambar;

  

echo $ ImageCaptcha;

答案 3 :(得分:0)

变化: curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path);

这一个: $cookie="ASP.NET_SessionId="."$cookieValue";($ch, CURLOPT_COOKIE,$cookie);

更改

它适用于我,但你需要努力在$ url之前获得cookievalue 希望这有用..