我可以在没有 POST 的情况下在 python 中实现 Web 用户身份验证系统吗?
Posted
技术标签:
【中文标题】我可以在没有 POST 的情况下在 python 中实现 Web 用户身份验证系统吗?【英文标题】:Can I implement a web user authentication system in python without POST? 【发布时间】:2010-09-09 08:35:01 【问题描述】:我的大学不支持 POST cgi 方法(我知道,这很疯狂),我希望能够拥有一个用户可以拥有用户名和密码并安全登录的系统。这甚至可能吗?
如果不是,您将如何使用 POST 进行处理?只是出于好奇。
干杯!
【问题讨论】:
【参考方案1】:在这种情况下,javascript 是最好的选择。
随着对用户名和密码的请求,它会发送一个唯一的随机字符串。然后,您可以使用 javascript md5 库通过组合随机字符串和密码 [pwhash = md5(randomstring+password)] 来生成散列密码。然后,javascript 实例化对 http://SERVER/login.cgi?username=TheUsername&random=RANDOMSTRING&pwhash=0123456789abcdef0123456789abcdef
的调用然后服务器必须做两件事: 检查随机字符串是否曾经被使用过,如果有,则拒绝该请求。 (对安全非常重要)
查找用户名的明文密码,然后执行 md5(randomstring+password)。如果这与用户在 URL 中作为 pwash 提供的内容相匹配,那么您就知道是用户。
检查随机字符串是否曾经被使用过的原因是为了阻止重复攻击。如果有人能够看到网络流量或浏览器历史记录或日志,那么他们只需使用相同的 URL 再次登录即可,无论他们是否知道原始密码。
我还建议将“Pragma: no-cache”和“Cache-Control: no-cache”放在 CGI 脚本返回的标头顶部,这样经过身份验证的会话不会存储在浏览器或您的ISP 网络缓存。
更安全的解决方案是使用适当的加密和挑战响应。你告诉服务器你的用户名,服务器发回一个挑战(一些用你的密码加密的随机字符串),然后你告诉服务器随机字符串是什么。如果您能够告诉服务器,那么显然您拥有密码并且就是您所说的那个人! Kerberos 就是这样做的,但要小心得多,以防止各种攻击。
【讨论】:
【参考方案2】:一个不错的选择:HTTP Digest authentication
很难成功,但可以选择:Client-side hashing with Javascript
【讨论】:
【参考方案3】:安全登录是非常主观的。完全“安全”并不容易实现(如果可能的话……值得商榷)。但是,您可以靠近。
如果 POST 不是一个选项,也许您可以使用目录安全方法,例如 .htaccess 或 windows 身份验证,具体取决于您所在的系统。
以上两种方法都会让您弹出允许输入用户名和密码的窗口。
要使用 POST 作为发送登录凭据的方法,您只需使用带有 method="post" 的 html 表单并使用 $_POST['varname 从 php 或 ASP 页面等检索信息'] PHP 中的方法或 ASP 中的 request.form("varname") 方法。例如,从 PHP 或 ASP 页面中,您可以在用户数据库中进行查找,以查看该用户名/密码组合是否存在,如果存在,则将它们重定向到适当的页面。
作为参考,HTML/ASP 部分使用http://www.w3schools.com/ASP/showasp.asp?filename=demo_simpleform
【讨论】:
【参考方案4】:如果支持,您可以使用 HTTP 身份验证。
您必须添加 SSL,因为所有方法、POST、GET 和 HTTP Auth(当然,除了 Digest HHTP 身份验证)都发送纯文本。
GET 基本上就像 POST,它只是对您可以发送的数据量有一个限制,通常比 POST 小很多,并且语义差异使得 GET 从这个角度来看不是一个好的候选者,即使从技术上讲,他们都可以做到。
至于示例,您使用的是什么? Python有很多选择,比如cgi模块或者一些框架,比如Django、CherryPy等等
【讨论】:
【参考方案5】:使用一点 JavaScript,您可以让客户端对输入的密码和服务器生成的 nonce 进行哈希处理,并在 HTTP GET 中使用它。
【讨论】:
【参考方案6】:您实际上可以使用 GET 方法完成所有操作。但是,您需要对登录使用完整的质询响应协议。 (您可以使用 javascript 在客户端进行哈希处理。您只需每次发送一个唯一的质询。)您还需要使用 SSL 来确保没有人可以看到穿过的字符串。
在某些意义上,GET 和 POST 请求之间没有真正的安全差异,因为它们都以明文形式传递,在其他意义上和实践中...... GET 非常容易被拦截,并且遍布大多数人日志和您的网络浏览器的历史记录。 :)
(或者按照其他海报的建议,使用完全不同的方法,例如 HTTP auth、digest auth 或一些更高级别的身份验证方案,例如 AD、LDAP、kerberos 或 shib。但是我有点假设如果你没有 POST你也不会有这些。)
【讨论】:
我应该为后代强调,在实践中,坚持一些标准比编写自己的身份验证代码要好得多。出错的方法有很多,而我提供的建议比大多数人更容易出错。请在使用它之前尝试其他所有方法,然后不要依赖它来做任何严重的事情。以上是关于我可以在没有 POST 的情况下在 python 中实现 Web 用户身份验证系统吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有 root 访问权限的情况下在服务器上杀死其他人的 Python 进程?