我的大学不支持POST cgi方法(我知道,这很疯狂),我希望能够建立一个用户可以拥有用户名和密码并安全登录的系统。这甚至可能吗?
如果不是,你会用POST怎么做?只是出于好奇。
干杯!
答案 0 :(得分:5)
您实际上可以使用GET方法完成所有操作。但是,您需要为登录使用完整的质询响应协议。 (您可以使用javascript在客户端进行哈希。您只需要每次都发送一个独特的挑战。)您还需要使用SSL来确保没有人能够看到字符串。
从某种意义上讲,GET和POST请求之间没有真正的安全性差异,因为它们都是明文,其他意义上和实践中都有... GET是一个很容易拦截的地狱,而且大多数人都是日志和Web浏览器的历史记录。 :)
(或者正如其他海报所建议的那样,使用完全类似于HTTP身份验证,摘要身份验证或某些更高级别身份验证方案(如AD,LDAP,kerberos或shib)的不同方法。但我有点假设如果您没有POST你不会有这些。)
答案 1 :(得分:1)
如果支持,您可以使用HTTP身份验证。
您必须添加SSL,因为所有方法,POST,GET和HTTP Auth(除了Digest HHTP身份验证)都会发送明文。
GET基本上就像POST一样,它只对你可以发送的数据量有一个限制,这通常比POST要小很多,并且语义差异使GET从这个角度来看不是一个好的候选者,即使从技术上讲,他们都可以做到。
至于例子,你在用什么? Python中有很多选择,比如cgi模块或者像Django,CherryPy等一些框架
答案 2 :(得分:0)
使用一些JavaScript,您可以让客户端散列输入的密码和服务器生成的nonce,并在HTTP GET中使用它。
答案 3 :(得分:0)
一个不错的选择:HTTP Digest authentication
更难以取得好成绩,但有一个选择:Client-side hashing with Javascript
答案 4 :(得分:0)
在这种情况下,Javascript是最佳选择。
除了用户名和密码的请求外,它还会发送一个唯一的随机字符串。然后,您可以通过组合随机字符串和密码[pwhash = md5(randomstring + password)],使用javascript md5库生成哈希密码。然后,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网络缓存。
更安全的解决方案是使用适当的加密和质询 - 响应。你告诉服务器你的用户名,服务器发回一个挑战(一些用你的密码加密的随机字符串),你告诉服务器随机字符串是什么。如果你能告诉服务器,那么显然你有密码,你说的是谁! Kerberos就是这样做的,但要小心防范各种攻击。
答案 5 :(得分:-1)
安全登录非常主观。完全'安全'并不容易实现(如果可能的话......有争议)。但是,你可以近距离接触。
如果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部分