pythonweb认证源码_python web源码

hacker|
82

文章目录:

请教一个python调用webservice时进行soapheader认证的问题

本文仅提供通过设置SoapHeader来控制非法用户对WebService的调用,如果是WebService建议使用WSE3.0来保护Web服务,如果使用的是ViaualStudio2008可以使用WCF,WCF里面提供了的服务认证方法。以下提供一种基于SoapHeader的自定义验证方式。1.首先要自定义SoapHeader,须继承System.Web.Services.Protocols.SoapHeader。usingSystem;usingSystem.Collections.Generic;usingSystem.Web;//////自定义的SoapHeader///publicclassMySoapHeader:System.Web.Services.Protocols.SoapHeader{privatestringuserName=string.Empty;privatestringpassWord=string.Empty;//////构造函数///publicMySoapHeader(){}//////构造函数//////用户名///密码publicMySoapHeader(stringuserName,stringpassWord){this.userName=userName;this.passWord=passWord;}//////获取或设置用户用户名///publicstringUserName{get{returnuserName;}set{userName=value;}}//////获取或设置用户密码///publicstringPassWord{get{returnpassWord;}set{passWord=value;}}}2.添加WebService,并编写相应代码。usingSystem;usingSystem.Collections.Generic;usingSystem.Web;usingSystem.Web.Services;//////WebService的摘要说明///[WebService(Namespace="")][WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]publicclassWebService:System.Web.Services.WebService{//声明Soap头实例publicMySoapHeadermyHeader=newMySoapHeader();[System.Web.Services.Protocols.SoapHeader("myHeader")][WebMethod]publicstringHelloWord(){//可以通过存储在数据库中的用户与密码来验证if(myHeader.UserName.Equals("houlei")myHeader.PassWord.Equals("houlei")){return"调用服务成功!";}else{return"对不起,您没有权限调用此服务!";}}}3.客户端调用,分别使用不设置SoapHeader与设置SoapHeader。usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceApp{classProgram{staticvoidMain(string[]args){localhost.WebServiceservice=newlocalhost.WebService();//没有设置SoapHeader的服务调用Console.WriteLine("没有设置SoapHeader:"+service.HelloWord());Console.WriteLine();//将用户名与密码存入SoapHeader;localhost.MySoapHeaderheader=newlocalhost.MySoapHeader();header.UserName="houlei";header.PassWord="houlei";service.MySoapHeaderValue=header;//设置SoapHeader的服务调用Console.WriteLine("设置SoapHeader:"+service.HelloWord());Console.Read();}}}4.运行应用程序,查看运行结果。再看一下直接通过浏览器的调用结果。点击HelloWord调用Web服务,结果如下:点击“调用”按钮,得到从服务器返回调用结果。添加自定义SoapHeader可以成功调用WebService,否则不能调用WebService,从而实现对WebService的非法调用。这种方法存在一定的弊端,就是在每一个WebService方法上都要进行一下验证,如果用户名与密码存储在数据库中,每调用一次WebService都要访问一次数据库进行用户名与密码的验证,对于频繁调用WebService来说,数据库压力很大。然而少量WebService调用这种方式还是一种不错的选择

如何用Python做Web开发

1.python入门

推荐老齐《从零开始学python》,《python简明教程》,这两本书很适合小白入门(像我一样长期徘徊在编程门外的人)

2.python进阶

推荐《python学习手册》,python学习手册的前半部分与在入门教程中的基础部分相重复,后面部分对python的介绍更细致,比如面向对象的这部分对于小白理解相对容易。

还有一本《python cookbook》,这本是在讲述python的经典用法,目前读过函数,装饰器以及网络编程这三部分,在不断的敲玩具代码的过程中,会发现书中讲的例子不断会出现。

3.学习web开发,自然要涉及到基于python的web 框架。

1)flask

flask如同官方所描述的那样,是一个web微框架,用几行代码就可以实现一个在hello world,现在的个人感觉是flask确实适合新手入门。基于这个原则,

推荐《flask web 开发》这本书,这本书简直是良心,讲的很细,并且在github上有源码,可以很容易跟着作者的步骤去学习,不懂得的地方可以去问谷歌或者qq群。

推荐的第二本是《building web applications with flask》这本书是对flask框架的细化,深入讲解flask的模板,restful等等,虽然是英文,但是叶能顺利阅读下去

推荐的第三本是《flask Framework cookbook》,这三本书是一个不段进阶的部分。

2)django

django是大而全,开箱即用,在flask了解的差不多的时候去了解,毕竟生成环境用的django相对多一点。

django学习可以看得书:(1)tango with django只有一个应用去学习,对于新手友好,可以比对github源码

(2)django by example 注重实战,有几个实例,blog, shop etc,涉及django基础,redis,celery,solr,ajax,很全面,也是web开发常用的技术

4.在学习框架的过程中,会不断体会到前端的知识也是要补回来,可以w3c school看一下。

5.数据库,在python中内置了sqlite, sql命令有相同之处,路线是sqlite, mysql, mongodb,有个逐渐过度的过程。

6.了解http的具体工作流程,这点目前还是有点模糊

7.工具集:sublime(需要配置,主要用于python编程,神器谁用谁知道), vim, firebug, firefox, linux,github(代码大宝库,各种代码)

8.学习的过程觉得几点很重要

1)做好笔记,同样的问题会遇到第二次,有个笔记容易复查

2)善用谷歌,善用qq与论坛,你现在遇到的问题,大多数前人都遇到过,stackflow是个好地方

3)迷茫的时候还是坚持看,因为毕竟是小白,不懂的太多,你总要把他弄懂

4)有时间了可以把算法与数据结构补起来

在学python,最初级的web编程为什么连接不上 源码如下 版本 2.7.1

建议在虚拟机或者局域网机器上面测试,还有换一个不常用的端口,然后检查防火墙和杀毒软件^_^ 我是来做任务的

如何在 Linux 下通过 WEB 认证方式上网

问题就在这些 Web 页面使用 IE 方言的 JavaScripts 上,有几种解决方法:

1。使用 Linux 下 IE 兼容的浏览器,有吗?谁知道请告诉我。

2。使用 wine + IE 的方法,有成功的吗?大家共同分享。

3。如果将这些鸟语改为普通话,我们就可以用 Mozilla 等非 IE 浏览器通过 Web 认证方式上网了。

4。要求 ISP 提供支持 W3C 标准的认证页面。

5。分析 web 认证的原理,编写认证程序。

最理想的方法四,可是我等不急,也不一定能等到,也许你比我幸运。我采取第三种方法,对于方法三,你一定会问:认证页面在 Web Server 上,我无权修改,行不通。确实如此,这里有个变通的办法:下载认证页面,按照 JavaScripts 标准修改并保存在本地,每次上网前用本地经过修改的 Web 认证页面而非 Web Server 的认证页面就可以了。具体修改方法, 找出认证页面使用 IE 方言的 JavaScritps,根据对照表提供的修改建议对你的认证页面作出相应修改。对于使用.cab 的认证页面,情况就比较复杂。需要分析这个.cab 在你的 JavaScripts 中的用法,判断它的功能,我这里是用它获得本地 IP。所以,我在本地执行脚本获得 IP 来模拟这个功能。似乎.cab 多与 IP 有关。

一个例子

* 以我这里为例,我的使用环境:

ISP:铁通 ADSL

认证方式:Web 认证

ISP 的接入服务器:华为 Quidway MA5200E/F (具体型号不能完全确定)

Linux:GENTOO 1.4 rc-3

Browser: Mozilla 1.4a/Phoenix 0.5

* 在 Linux 下用 mozilla (一定要用非 IE 浏览器获得认证页面,这话有点多余,但有的用户是在 Window$ 下调试的),访问 ISP 的 WEB 认证页面时,浏览器中没有显示任何内容,根本无法输入帐号和密码,更谈不上通过认证。这难不倒咱 linuxer, 查看认证页面(/index.jsp)源码,发现这两段 javascript:

id="PortalClient"

codebase=

...

var clientIp = PortalClient.localIP;

var languagetype = 0;

if ((clientIp=="")(clientIp==null)) {

window.parent.location.href="/ipError.jsp";

} else {

window.parent.location.href="/queryPort.jsp?ip="+clientIp+"newbl="+languagetype;

}

可以看出它用 PortalClient 获得本地的 IP,如果成功,转到 http://你的WEB认证页面/queryPort.jsp?ip=你当前的IP 。而 Mozilla 不支持它获取 IP (PortalClient,是针对IE的,唉,这个程序编得太短视),看来问题出在这里。既然如此,我们可以手工加上自己的 IP(这个 IP 是与 ADSL 相联的网卡从 ISP 的 DHCP 服务器获得的地址)。在 Mozilla 地址栏中输入:

--------^^^^^^^^^^^------------------^^^^^^^^^^^

--------你的ISP认证服务器 ------------- 你当前的IP

嗒嗒,登录页面出来啦!

赶快输入帐号,密码,按登录按钮(期待中。。。)。

viva!!!

ISP 的首页终于被揪出来啦,在终端中 ping ,ping 通,没问题。

* 至此,在 Linux 下 web 认证方式已经完成。方法很简单,每次上网时,在 mozilla 的地址栏中输入:

http://你的ISP认证服务器地址/queryPort.jsp?ip=你当前的IP

登录页面出来后,和 IE 中的操作过程完全一样。

* 当然你可以把这些步骤写成一个脚本,以后简单执行脚本就可以了。

#!/bin/bash

dhcpcd eth1

phoenix `ifconfig eth1 grep inet sed 's/^ *//' sed 's/ /:/g' cut -f3 -d:`

说明:

eth1 是与 ADSL 联的网卡名,根据你的实际情况填写。

61.61.61.61 是我这 ISP 的认证地址。

后面一段是获得 eth1 的 ip 地址。

注意!一定要用非 IE 浏览器获得调试认证页面,因为 IE 可以执行认证页面的 JavaScripts,有些认证过程实际上是执行多个页面完成的,IE 最后停留的页面不一定是起始的认证页面,你有可能漏掉前面的重要信息,我这里就是这种情况。

另外一种方法

如果你对方法 3 不满意,可以用方法 5,继续分析 web 认证的原理,编写自己的认证程序。其实搞清原理后,实现的方法更简单,更灵活,而且在 ISP 要求客户端定时发送 keep-alive 包的情况下,也只能采取这种方法。我是这样做的:

1。用网络分析软件(如:ethereal),抓取正常认证过程的通讯包;

在 windoze 下,用 ethereal 抓包。注意抓包时,除了 IE 不要启动其它产生网络通讯的程序,以免产生干扰数据;保存这些通讯包。

2。分析所抓包的内容;

只要看一眼 web 认证过程产生的通讯包,你就明白我为什么说这种方法更简单了。简单讲,web 认证方式实际是客户端用 http 协议向 ISP 发送用户名、密码和 IP 等内容的过程。客户端读取认证页面;将填写好认证页面表格发送到 ISP 的认证服务器。过程就这么简单。

3。编写生成这些包的程序;

用任意一个支持 http 协议的语言或工具,编写向认证服务器 POST 认证页面中 form 的程序即可,甚至读取认证页面都不需要。我用 curl 和 python 各做了一个。如果你略微了解 http 协议,只要找到认证页面中向服务器 POST 用户名、密码等数据的 form,然后转换为你采用语言的语法格式就可以了,根本不需要分析认证页面中繁杂的 Javascripts。对计时窗发出的 keep-alive 包也采用同样的方法。

例子:

* 认证页面中的 form

action=""

type="hidden" name="connectname" value=""

name="connecttype" type="hidden"

type="hidden"

value="192.168.000.000" name="localip" type="hidden"

name="IsIndex" type="hidden" 用户名: 密 码:name="password" type="password" type="submit"

* 用 curl 写的一个脚本:

#!/bin/bash

/etc/init.d/myiptables start

dhcpcd eth1

MYIP=`ifconfig eth1 grep inet sed 's/^ *//' sed 's/ /:/g' cut -f3 -d:`

echo $MYIP

UN=88888888

SERVER=61.61.61.61

curl --trace trace.txt -A 'Mozilla' -d "username=$UNpassword=8888localip=$MYIPconnectname=connecttype=-1"

说明:curl 是一个用 url 语法传输文件的命令行程序,支持 http,ftp 等协议,类似 wget。

上例中,curl 的命令行参数 -A 指明客户端的类型,这是服务器为了安全,需要指明。Mozilla 或 IE 都可以,我更愿意用 Mozilla。 -d 是必需的,表示用 POST 方法。-d 后的内容就是用户名、密码 IP 地址等信息,根据你的认证页面中 form 的 input 项目填写,内容与其保持一致,参数间用 分开。后面是认证页面的地址。执行这个脚本后,返回 200 OK,表示认证成功,否则,仔细检查 -d 后的参数是否正常,地址是否正确。

* 用 python 写的认证程序:

#!/usr/bin/env python

import httplib, urllib

params = urllib.urlencode({'connectname': '',

'connecttype': -1,

'consumeright': 0,

'separatecard': 0,

'localip': '192.168.000.000',

'IsIndex': 0,

'username': 88888888,

'password': 8888})

headers = {'Accept': 'text/html', 'User-Agent': 'Mozilla',

'Content-Type': 'application/x-www-form-urlencoded'}

server = '61.61.61.61'

path = '/secu/webLogin.jsp'

conn = httplib.HTTPConnection(server)

conn.request("POST", path, params, headers)

r1 = conn.getresponse()

print r1.status, r1.reason

data1 = r1.read()

print data1

conn.close()

产生 keep-alive 包的程序

#!/usr/bin/env python

import httplib

def testHttplib(server, path):

req = httplib.HTTP(server)

req.putrequest('GET', path)

req.putheader('Accept', 'text/html')

req.putheader('User-Agent', 'Mozilla')

req.endheaders()

ec, em, h = req.getreply()

fd = req.getfile()

return fd.read(), (ec, em)

myip = '192.168.000.000'

server = '61.61.61.61'

path = '/ClientProcess.jsp?MsgType=1ISNNO=1001LocalIP=' + myip

# print 'testing "%s%s"' % (server, path)

dataHttplib, result = testHttplib(server, path)

# print "data length (httplib):", len(dataHttplib), result

# print dataHttplib

说明:

python 是一个功能强大的脚本语言,与 Perl 类似。正如你看到的,它和 curl 完成同样的工作,但更优雅。这里要注意别漏掉'User-Agent' 和 'Content-Type' 内容,我在这个上面浪费了不少时间。其它与 curl 的说明一样。

最后,将下面内容加到 crontab 中,保证每 5 分钟向 ISP 发送一个 keep-alive 包,模拟计时窗功能。

4条大神的评论

  • avatar
    访客 2022-07-16 下午 02:01:28

    用Python做Web开发1.python入门推荐老齐《从零开始学python》,《python简明教程》,这两本书很适合小白入门(像我一样长期徘徊在编程门外的人)2.python进阶推荐《python学习手册》,python学习手册的前半部分与在入门教程中的基础部分相重复,后面部分对pyth

  • avatar
    访客 2022-07-16 下午 04:03:39

    m.Web.Services.WebService{//声明Soap头实例publicMySoapHeadermyHeader=newMySoapHeader();[System.Web.Services.Protocols.Soa

  • avatar
    访客 2022-07-16 下午 12:33:25

    P 的 DHCP 服务器获得的地址)。在 Mozilla 地址栏中输入: --------^^^^^^^^^^^------------------^^^^^^^^^^^ --------你的ISP认证服务器 ------------

  • avatar
    访客 2022-07-16 上午 08:48:49

    word=8888localip=$MYIPconnectname=connecttype=-1" 说明:curl 是一个用 url 语法传输文件的命令行程序,支持 http,ftp 等协议,类似 wget。 上例中,curl 的命令行参数 -A 指明客户端的类型,这是服务器为了安

发表评论