如何设置正确的用户名和密码文本框?

时间:2014-03-20 15:15:40

标签: c# html asp.net browser

我有一个带有用户名和密码的登录界面,但它也有一个公司字段,就像有域名一样。

问题是浏览器正在使用域名框这样的用户名,因此当您在浏览器中保存密码时,如果您键入域名,则填写密码框中的密码,那么您只需要添加用户名,最有可能是该计算机用户。这显然是一个严重的安全问题。

E.g。用户:Tom,Domain:Netweb,Pass:test

Tom登录一次并单击以保存其密码。下次他回来时,他将Netweb输入域名并按回车,它会填写为该域名保存的密码,然后他可以输入他的用户名。

我该怎么办?有没有办法设置用户名,以便在添加密码之前不使用公司或使用前两种方式?

example of username issue

我的代码如下:

<tr class="center">
    <td class="center">User Name
        <br />
        <asp:TextBox ID="txtUser" runat="server"></asp:TextBox>
    </td>
</tr>
<tr class="center">
    <td class="center">Company
        <br />
        <asp:TextBox ID="txtCompany" runat="server"></asp:TextBox>
    </td>
</tr>
<tr class="center">
    <td class="center">Password
        <br />
        <asp:TextBox ID="txtPass" runat="server" TextMode="Password"></asp:TextBox>
        <br />Remember me?
        <asp:CheckBox ID="chkPersistCookie" runat="server" AutoPostBack="false" />
        <br />
        <br />
        <asp:Button ID="btnSubmit" runat="server" Text="Login" CssClass="center" OnClick="btnSubmit_Click" />
        <br />
        <asp:Label ID="lblMessage" runat="server"></asp:Label>
        <br />
        <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="txtUser" ErrorMessage="Please enter a user name" ForeColor="Red"></asp:RequiredFieldValidator>
        <br />
        <asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" ControlToValidate="txtCompany" ErrorMessage="Please enter a company" ForeColor="Red"></asp:RequiredFieldValidator>
        <br />
        <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ControlToValidate="txtPass" ErrorMessage="Please enter a password" ForeColor="Red"></asp:RequiredFieldValidator>
    </td>
</tr>

10 个答案:

答案 0 :(得分:4)

您在此处所面对的是表单值的autocomplete属性。提交表单时,浏览器会保存表单值以便在同一页面上进一步使用。浏览器有时也为用户提供了保存网站密码的功能。

就像这样

<input type="text" name="someInputName" autocomplete="off|on" />

但请记住,即使浏览器保存了自动完成的数据。对于自动完成功能,永远不会保存用户的密码。在用户允许软件执行此操作之前,它们不会保存在任何位置。

您在这里面临的是浏览器的表单自动填充功能。在这种情况下,浏览器会保存用户的数据,然后您可以通过转到浏览器的设置以及更多内容从浏览器中删除该数据,然后选择已保存的密码,并删除您网站的密码

否则,您无法控制用户想要做什么。但是,就像谷歌一样。您可以实现他们对安全性的想法。

他们所做的是他们向您显示密码类型的输入框,然后他们编写与该帐户关联的电子邮件地址。这样,你会欺骗浏览器,浏览器会认为你需要别的东西,而不是他的密码。

您还可以做其他一些事情。比如,在一个页面上获取用户的电子邮件地址,然后在下一页上获取密码。就像Payza一样。

答案 1 :(得分:2)

如果问题只是在文本框中自动提示输入密码,则需要禁用文本框的自动完成属性

答案 2 :(得分:1)

使用自动填充字段,您最好尽可能多地为浏览器提供有用的指针。在你的情况下,这将是:

<asp:TextBox ID="username" x-autocompletetype="given-name" runat="server"></asp:TextBox>
<asp:TextBox ID="txtCompany" x-autocompletetype="organization" runat="server"></asp:TextBox>
<asp:TextBox ID="password" x-autocompletetype="password" runat="server" TextMode="Password"></asp:TextBox>

请注意,这适用于正确的表单,而不是您引用的登录类型。此外,这些是使用HTML表单输入测试的 - 我假设ASP应该将自定义属性传输到生成的HTML代码中,但它可能会失败。 ASP ID确实映射到HTML输入name


这对我来说是一个非常有趣的问题,因为自动完成似乎是那些甚至还没有接近标准的事情之一。

HTML5 W3 Spec

  

“on”关键字表示允许用户代理提供   具有自动完成值的用户,但不提供任何进一步的功能   有关用户可能期望的数据类型的信息   输入。用户代理必须使用启发式方法来决定什么   自动完成值建议。

来自Google的团队似乎希望使用their proposal

进行更改
  

目前的自动填充产品依赖于上下文线索来确定   应填充到表单元素中的数据类型。示例   这些上下文线索包括输入元素的名称,文本   围绕它和占位符文本。

     

我们已经讨论过这些临时方法的缺点   几种自动填充产品的开发人员,都对此感兴趣   在一个允许网站作者对其表单进行分类的解决方案中   田野自己。而目前的现场分类方法工作   一般来说,在很多情况下,由于这些原因,它们是不可靠或模棱两可的   Web开发人员在创建时使用的许多变体和约定   他们的形式:

以下是一个nice link,其中介绍了此提案的实施方式:

<input type="text" name="firstname" value="" x-autocompletetype="given-name">  
<input type="text" name="doesn-matter" value="" x-autocompletetype="family-name">  
<input id="email" type="text" name="email" value="" x-autocompletetype="email">

更多链接:

答案 3 :(得分:1)

现在通过最后交换文本框来解决。

答案 4 :(得分:1)

我们如何处理这个问题是在每个页面加载时将随机值附加到文本框的id和name属性上。然后浏览器无法调用自动完成,因为它是为具有不同标识符的字段存储的。

使用ClientIDMode =&#34;静态&#34;为此,.net不会为您生成ID。

答案 5 :(得分:0)

我不确定我理解你的问题。但有几个提示:

您可以告诉Chrome不要使用自动填充功能记住密码:http://www.w3schools.com/tags/att_input_autocomplete.asp

您可以使用tabindex:http://www.w3schools.com/tags/att_global_tabindex.asp

更改文本框的标签顺序

答案 6 :(得分:0)

如果你唯一的问题是你可以自动填写密码,你可以通过代码隐藏来禁用它:

txtPass.Attributes.Add("autocomplete", "off");

答案 7 :(得分:0)

使用域名/公司:

<asp:TextBox id="Textbox1" runat="server" autocomplete="off"></asp:TextBox>

或者从CodeBehind:

Textbox1.Attributes.Add("autocomplete", "off");

它将禁用textbox公司的自动完成功能。

如果它没有解决问题,另一种方法是使用一些验证,如:

  1. 输入域名/公司时,检查是否提供了用户名。

  2. 如果没有提供用户名&amp;密码存在,提供错误信息以填写用户名优先&amp;故意清空公司和公司的文本框密码

  3. jquery中的一些代码就像:

    $(txtDomain).focusout(function() {
          if($txtUserName).val().trim()=="" && $(txtDomain).val().trim()!="" && $(txtPass).val().trim()!="")
          {
             alert('Please fill the username first');
             $(txtPass).val('');
             $(txtDomain).val('');
          }
    

    我知道这不是一个好的解决方案。也有可用性问题。但这可能是最后的手段,如果其他任何事情都行不通。

    希望它有所帮助。

答案 8 :(得分:0)

浏览器会自动将凭据填写到错误的文本字段吗?

有时候我会在Chrome和Safari上发现这种奇怪的行为,当中有相同格式的密码字段时。我想,浏览器会查找密码字段以插入保存的凭据。然后它自动填充(只是猜测由于观察)最近的textlike-input字段,它出现在DOM中的密码字段之前。由于浏览器是最后一个实例而您无法控制它,有时甚至autocomplete = off也不会阻止填写凭据。这个readonly-fix对我有用。

当您将订单换成&#34;用户...密码...公司&#34;有用。浏览器将再次使用密码(现在是用户)之前的字段来填写凭据。

修复浏览器自动填充: 设置只读并在焦点上设置可写(点击和标签)

 <input type="password" readonly  
     onfocus="$(this).removeAttr('readonly');"/>

答案 9 :(得分:-5)

手动管理Cookie, 这是jQuery示例。

     $("#chkPersistCookie").change(function() {

        if(this.checked) {

        var username = $('#txtUser').attr("value");
        var password = $('#txtPass').attr("value");

        $.cookie('username', username, { expires: 14 });
        $.cookie('password', password, { expires: 14 });
        $.cookie('remember', true, { expires: 14 });

    } else {
        $.cookie('username', null);
        $.cookie('password', null);
        $.cookie('remember', null);

    }
    });

要获取cookie并将其分配回控件,请使用以下

var remember = $.cookie('remember');
    if ( remember == 'true' ) {

        $("#chkPersistCookie").attr("checked",true)
        var username = $.cookie('username');
        var password = $.cookie('password');

        $('#txtUser').attr("value", username);
        $('#txtPass').attr("value", password);
    }