我的php代码中登陆界面加一个验证码,如何实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的php代码中登陆界面加一个验证码,如何实现相关的知识,希望对你有一定的参考价值。

表单
<div id="login">
<form action="login.php" method="post">
账户 <input type="text" name="username" size="20" /><br />
密码 <input type="password" name="password" size="20"/><br />

<input name="yanzhengma" type="yzm" value="验证码"/>
<input type="image" src="image/login_btn.jpg"/>
<input name="input3" type="reset" value="重新输入"/>
<a href="test.php" title="注册" id="zhuce">一键注册</a>
</form>
</div>
登陆的页面
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题</title>
</head>
<body>
</body>
<?php
session_start();
$nickname=$_POST['username'];
$password=$_POST['password'];
if(empty($nickname) || empty($password))
exit;

$link=mysql_connect('localhost','root','');
mysql_select_db('shop',$link);
mysql_query('set names utf8',$link);
$sql="SELECT id,`password` FROM `user`
WHERE nickname='$nickname'";
$result=mysql_query($sql,$link);
if(mysql_num_rows($result)==1)
$row=mysql_fetch_array($result,MYSQL_ASSOC);
if($password==$row['password'])
echo "<script type='text/javascript'>
if(confirm('用户登陆成功,是否跳转到商城首页?'))
window.location.href='index1.php';</script>";
$_SESSION['id']=$row['id'];
$_SESSION['nickname']=$nickname;

else
echo '密码错误!';


else
echo '用户名错误!';

mysql_close($link);
?>
</html>

  php登陆页面+验证码的实现,参考如下:

  1、首先新建一个php站点;

  2、先新建一个命名为yzm.php文件,双击编辑,清空Dreamweaver自动生成的HTML代码,如下;

  <?php

  session_start();

  header("Content-Type:image/png");  //设置页面的头信息输出为png图片$im=imagecreate(60,20);   //创建一个画布

  $im_color=imagecolorallocate($im,100,100,100);  //填充验证码背景为灰色

  for($i=0;$i<4;$i++)

  

  $line_color=imagecolorallocate($im,rand(0,255),rand(0,255),rand(0,255));

  imageline($im,rand(0,60),rand(0,20),rand(0,60),rand(0,20),$line_color);

  

  //实用循环画四条随机颜色的干扰线

  $n=rand(1000,9999);

  $_SESSION["y"]=$n;

  $p=0;


  for($i=0;$i<4;$i++)

  

  $p=$p+10;

  $num=substr($n,$i,1);  //把验证码数字一个一个的取出来

  $num_color=imagecolorallocate($im,rand(0,255),rand(0,255),rand(0,255));

  imagettftext($im,rand(10,15),rand(-10,10),$p,rand(10,15),$num_color,"font1.ttf",$num);


  

  //设置每个验证码数字不同的颜色,数字角度偏差和字体。

  imagepng($im);  //输出验证码

  imagedestroy($im); //释放内存

  ?>

  3、新建login.php文件;

  用户名文本框昵称为name;

  密码文本框为psw;

  验证码为yzm;

  表单的提交方式为post,提交到check.php。

参考技术A

  php登陆页面+验证码的实现,参考如下:
  1、首先新建一个php站点;
  2、先新建一个命名为yzm.php文件,双击编辑,清空Dreamweaver自动生成的HTML代码,如下;
  <?php
  session_start();
  header("Content-Type:image/png");
 //设置页面的头信息输出为png图片$im=imagecreate(60,20);
 
//创建一个画布
  $im_color=imagecolorallocate($im,100,100,100);
 //填充验证码背景为灰色
  for($i=0;$i<4;$i++)
  
  $line_color=imagecolorallocate($im,rand(0,255),rand(0,255),rand(0,255));
  imageline($im,rand(0,60),rand(0,20),rand(0,60),rand(0,20),$line_color);
  
  //实用循环画四条随机颜色的干扰线
  $n=rand(1000,9999);
  $_SESSION["y"]=$n;
  $p=0;
  for($i=0;$i<4;$i++)
  
  $p=$p+10;
  $num=substr($n,$i,1);
 //把验证码数字一个一个的取出来
  $num_color=imagecolorallocate($im,rand(0,255),rand(0,255),rand(0,255));
  imagettftext($im,rand(10,15),rand(-10,10),$p,rand(10,15),$num_color,"font1.ttf",$num);
  
  //设置每个验证码数字不同的颜色,数字角度偏差和字体。
  imagepng($im);
 //输出验证码
  imagedestroy($im);
//释放内存
  ?>
  3、新建login.php文件;
  用户名文本框昵称为name;
  密码文本框为psw;
  验证码为yzm;
  表单的提交方式为post,提交到check.php。

参考技术B 例如验证码是4位数字,就随机一个rand(1000,9999),然后存到session里或者存到数据库里,用户提交表单的时候验证下就行。追问

我做的这个随机数是把这个放在我的login页面下,就可以了,再在表单那个界面做验证

 <input type="hidden" name="authnum" value="<?php echo $authnum; ?>"/> 

                <?php echo $authnum; ?>

可是我的为什么不行,能帮我改下吗?

追答

没明白什么意思。。。。你是想把你生成的随机参数赋值给一个隐藏的input里面然后和用户写入的input的验证码值比较他输入的是否正确吗?

参考技术C 表单加入一行,引入生成验证码的图片,找个生成的下载下来,引上去就哦了

基于selenium实现12306模拟登陆

这里介绍一款强大验证码识别平台:超级鹰

- 超级鹰:http://www.chaojiying.com/about.html
  - 注册:普通用户
  - 登录:普通用户
  - 题分查询:充值
  - 创建一个软件(id)
  - 下载示例代码

技术图片

1. 打开url

技术图片

一打开是扫码登陆的页面,这显然不是我们想要的,因此我们应该先打开账号登陆的界面。

 

2. 打开账号登陆界面

技术图片

3.利用超级鹰对当前验证码进行识别

4.思路:模拟登录的思路是很简单的,难点在于验证码的识别与正确选项的定位,如何让浏览器自行选择正确的验证码是我们需要解决的最大问题。

 

from selenium import webdriver
import time
from PIL import Image
from selenium.webdriver import ActionChains
import requests
from hashlib import md5

from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions

class Chaojiying_Client(object):
    """超级鹰源代码"""

    def __init__(self, username, password, soft_id):
        self.username = username
        password = password.encode(utf8)
        self.password = md5(password).hexdigest()
        self.soft_id = soft_id
        self.base_params = {
            user: self.username,
            pass2: self.password,
            softid: self.soft_id,
        }
        self.headers = {
            Connection: Keep-Alive,
            User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0),
        }

    def PostPic(self, im, codetype):
        """
        im: 图片字节
        codetype: 题目类型 参考 http://www.chaojiying.com/price.html
        """
        params = {
            codetype: codetype,
        }
        params.update(self.base_params)
        files = {userfile: (ccc.jpg, im)}
        r = requests.post(http://upload.chaojiying.net/Upload/Processing.php, data=params, files=files,
                          headers=self.headers)
        return r.json()

    def ReportError(self, im_id):
        """
        im_id:报错题目的图片ID
        """
        params = {
            id: im_id,
        }
        params.update(self.base_params)
        r = requests.post(http://upload.chaojiying.net/Upload/ReportError.php, data=params, headers=self.headers)
        return r.json()

# 检测规避
option = ChromeOptions()
option.add_experimental_option(excludeSwitches, [enable-automation])
driver = Chrome(options=option)

bro = webdriver.Chrome(executable_path=./chromedriver.exe)
# 最大化屏幕
bro.maximize_window()

# 发送请求
bro.get(https://kyfw.12306.cn/otn/resources/login.html)

# 找到账号的登陆的标签
btn = bro.find_elements_by_xpath(/html/body/div[2]/div[2]/ul/li[2]/a)[0]
btn.click()
time.sleep(2)

# 将当前页面截屏生成图片
bro.save_screenshot(12306.png)

# 定位到要截取的图片
pic = bro.find_element_by_xpath(/html/body/div[2]/div[2]/div[1]/div[2]/div[3]/div/div[4]/img)
# 得到当前图片的左上角坐标
location = pic.location
# 得到图片的长和宽
size = pic.size
# 得到图片左上角和右下角的坐标 截图准确度与电脑缩放布局有关 当前为125%
rangle = (location[x] * 1.25, location[y] * 1.25, (location[x] + size[width]) * 1.25,
          (location[y] + size[height]) * 1.25)


# 保存生成的验证码图片
i = Image.open(./12306.png)
code_img_name = code.png  # 裁剪文件的文件名称
frame = i.crop(rangle)  # 根据指定区域进行裁剪
frame.save(code_img_name)

# 利用超级鹰识别验证码
chaojiying = Chaojiying_Client(用户名, ‘密码,     905993)
im = open(./code.png, rb).read()
result = chaojiying.PostPic(im, 9004)[pic_str]
all_list = []

if | in result:
    # 多个结果
    print(result)
    ret_list = result.split(|)  # 148,102|236,203
    for ret in ret_list:
        # 将一组坐标放入列表
        x_y = []
        x = ret.split(,)[0]
        y = ret.split(,)[0]
        x_y.append(x)
        x_y.append(y)
        all_list.append(x_y)
else:
    x_y = []
    x = result.split(,)[0]
    y = result.split(,)[0]
    x_y.append(x)
    x_y.append(y)
    all_list.append(x_y)

for ret in all_list:
    x = int(ret[0])
    y = int(ret[1])
    ActionChains(bro).move_to_element_with_offset(pic, x, y).click().perform()
    # 以图片对象为参考系 将鼠标移动到相对图片x,y处 点击图片
    time.sleep(0.5)

bro.find_element_by_id(J-userName).send_keys(xxxx)
bro.find_element_by_id(J-password).send_keys(ssss)
bro.find_element_by_id(J-login).click()
time.sleep(3)
bro.quit()

 

以上是关于我的php代码中登陆界面加一个验证码,如何实现的主要内容,如果未能解决你的问题,请参考以下文章

注册/登陆界面验证码的作用及代码实现

php登陆界面刷新验证码 javascript 的写法

使用php如何生成验证码

我如何使我的PHP应用程序从不要求提供Gmail API验证码?

PHP如何将一个验证码图片内容读取出来,都是数字.

基于PHP实现用户注册登录功能