我可以在没有POST的情况下在python中实现Web用户身份验证系统吗?

时间:2020-03-05 18:55:18  来源:igfitidea点击:

我的大学不支持POST cgi方法(我知道,这很疯狂),我希望能够拥有一个用户可以使用用户名和密码并安全登录的系统。这有可能吗?

如果不是,我们将如何使用POST进行操作?只是出于好奇。

干杯!

解决方案

回答

我们可以使用HTTP身份验证(如果支持)。

我们必须添加SSL,因为所有方法POST,GET和HTTP Auth(当然,Digest HHTP身份验证除外)都将发送纯文本。

GET基本上就像POST一样,它对我们可以发送的数据量有一个限制,通常比POST小得多,并且语义上的差异使GET从该角度出发不是一个好的候选者,即使从技术上来说,它们可以做到。

例如,我们在使用什么? Python中有很多选择,例如cgi模块或者某些框架,例如Django,CherryPy等。

回答

实际上,我们可以使用GET方法完成所有操作。但是,我们需要对登录使用完整的质询响应协议。 (我们可以使用javascript在客户端进行哈希处理。我们每次都只需要发出一个唯一的挑战即可。)我们还需要使用SSL来确保在字符串经过时没人能看到它们。

从某种意义上说,GET和POST请求之间都没有真正的安全性差异,因为它们在其他方面和实践中都是以纯文本形式出现的……GET是一个容易被拦截的地狱,并且遍及大多数人的日志和网络浏览器的历史记录。 :)

(或者根据其他发布者的建议,使用完全不同的方法,例如HTTP身份验证,摘要身份验证或者某种更高级别的身份验证方案,例如AD,LDAP,kerberos或者shib。也不要有这些。)

回答

使用一些JavaScript,我们可以让客户端对输入的密码和服务器生成的现时值进行哈希处理,然后在HTTP GET中使用它。

回答

安全登录是非常主观的。全面的"安全性"并不容易实现(如果有可能……值得商))。但是,我们可以接近。

如果不选择POST,则可以根据所使用的系统使用目录安全性方法,例如.htaccess或者Windows身份验证。

以上两种情况都会为我们提供一个弹出窗口,允许我们输入用户名和密码。

要将POST用作发送登录凭据的方法,我们只需使用带有method =" post"的HTML表单,并使用$ _POST ['varname']方法从PHP或者ASP页面中检索信息。在PHP或者ASP中的request.form(" varname")方法中。例如,在PHP或者ASP页面中,我们可以在用户数据库中进行查找,以查看该用户名/密码组合是否存在,如果存在,则将其重定向到适当的页面。

作为参考,将http://www.w3schools.com/ASP/showasp.asp?filename=demo_simpleform用于HTML / ASP部分

回答

一个不错的选择:HTTP摘要式身份验证

很难顺利完成,但有一个选择:使用Javascript进行客户端哈希

回答

在这种情况下,JavaScript是最佳选择。

连同对用户名和密码的请求,它发送一个唯一的随机字符串。然后,我们可以使用javascript md5库,通过组合随机字符串和密码[pwhash = md5(randomstring + password)]来生成哈希密码。然后,javascript会实例化对http://SERVER/login.cgi?username = TheUsername&random = RANDOMSTRING&pwhash = 0123456789abcdef0123456789abcdef的调用

然后,服务器必须执行以下两项操作:
检查该随机字符串是否曾经被使用过,如果已经使用过,则拒绝该请求。 (对于安全性非常重要)

查找用户名的明文密码,然后执行md5(randomstring + password)。如果与用户在URL中作为pwhash提供的内容匹配,则我们知道是该用户。

我们检查是否曾经使用过随机字符串的原因是为了阻止重复攻击。如果某人能够看到网络流量或者浏览器历史记录或者日志,那么他们可以简单地使用相同的URL重新登录,而无论他们是否知道原始密码都没关系。

我还建议在CGI脚本返回的标头的顶部放置" Pragma:no-cache"和" Cache-Control:no-cache",以使经过身份验证的会话不存储在浏览器或者ISP的Web缓存中。

更为安全的解决方案是使用适当的加密和质询响应。我们告诉服务器用户名,服务器发回质询(一些用密码加密的随机字符串),然后我们告诉服务器随机字符串是什么。如果我们能够告诉服务器,那么显然我们具有密码,并且说的是我们自己! Kerberos这样做,但是要非常仔细地防止各种攻击。