【问题标题】:Single quotes in string with jQuery ajax带有jQuery ajax的字符串中的单引号
【发布时间】:2009-12-04 04:51:35
【问题描述】:

我遇到了用户输入数据的问题,如果有单引号,脚本就会出错。

处理用户输入的单引号以免干扰 jquery/javascript 的最佳方法是什么?

更新:

我通过 ajax 将它发送到数据库。这是 json ajax 调用的数据参数。
data: "{str_" + sectionName + " :'" + UpdateText + "',EntityID: '" + EntityID + "' }",
更新文本是可以包含引号的字符串。

【问题讨论】:

  • 提供代码示例会很有帮助
  • 你对输入做了什么?
  • 我通过 ajax 将它发送到数据库。这是 json ajax 调用的数据参数。 data: "{str_" + sectionName + " :'" + UpdateText + "',EntityID: '" + EntityID + "' }",更新文本是可以包含引号的字符串。

标签: javascript jquery string escaping


【解决方案1】:

您需要使用 \ 转义引号,或者根据您计划如何使用字符串,您可以使用 javascript 转义和 unescape 函数。

alert(escape("mike's"));
alert(unescape(escape("mike's")));

也可以看看这个escape strings with jQuery

【讨论】:

    【解决方案2】:

    对于 AJAX 请求中的转义值,不要编写自己的转义实现或使用escape() 方法。 escape() 已弃用)。而是创建一个 JSON 对象并使用 JSON.stringify 方法。

    对于您的情况,它应该类似于 (暂时忽略动态属性)

    //Create Javascript object    
    var obj = { SectionName: UpdateText, EntityID: EntityID };
    

    稍后在您的 ajax 请求中,您可以这样做:

    data: JSON.stringify(obj),
    

    如果您想对 JSON 对象使用动态属性,那么对于您的特定情况,您可以分两步创建对象,例如:

    var obj = { EntityID: EntityID };
    obj["str_" + sectionName] = UpdateText;
    

    这种做法将使您免于手动转义单引号/双引号和其他无效字符。 JSON.stringify 会解决这个问题。

    (我来这里是为了寻找类似的问题,但找不到合适的工作解决方案,所以最后在这里发布了一个)

    【讨论】:

      【解决方案3】:

      您可以找到众多 String.replaceAll 实现之一或编写自己的实现,只需将任何单引号或双引号替换为转义版本,如 \" 或 \'。

      【讨论】:

        【解决方案4】:

        由于您提到了 AJAX,因此涉及单引号的字符串有可能在服务器端被拒绝。 确保在将字符串插入数据库之前使用 escape string function 提供,例如通过 php。

        $user_name = $_REQUEST['username'];
        $user_name = mysqli_real_escape_string($conn,$user_name);
        $query = "INSERT into chat(username,message) VALUES('".$user_name."')";
        

        这有助于转义可能出现在“$user_name”字符串中的任何单引号或双引号。 它还可以防止任何类型的 SQL 注入攻击!

        【讨论】:

          【解决方案5】:

          出于各种原因,您应该真正清理服务器端脚本中的输入。如果您只是显示用户输入的所有内容,那么您的应用程序可能会被用于发起跨站点脚本攻击。

          【讨论】:

          • 我认为他的问题是他在尝试向服务器发送数据时遇到了客户端的 javascript 错误。
          【解决方案6】:

          Javascript 有一个内置的方法,它不仅仅包含单引号。它叫encodeURIComponent,来自Javascript Kit

          用于为具有特殊含义的字符编码 URI 的参数部分,以将它们与用作键/值分隔符的保留字符(例如“&”)分开。它比 encodeURI() 更具包容性,它对 URL 字符串中所有具有特殊含义的字符进行编码,包括“=”和“&”。仅在 URI 的参数部分使用此方法;否则,如果 URI 包含作为有效 URI 一部分的字符之一(即:“+”),则该 URI 可能不再有效,但如果是 URI 参数的一部分,则应进行转义。

          所以你的代码应该变成:

          data: "{str_" + encodeURIComponent(sectionName) + " :'" + encodeURIComponent(UpdateText) + "',EntityID: '" + encodeURIComponent(EntityID) + "' }",
          

          为了安全起见,我在查询字符串中对发送的所有内容进行了编码,但可以跳过对 EntityID 的编码,因为它不是来自用户(我假设),所以你知道它不会有特殊字符.

          【讨论】:

          • encodeURI 和 encodeURIComponent 不会转义单引号,至少在当前版本的 Chrome/Safari 上不会
          【解决方案7】:

          在 Javascript 中使用转义单引号

          UpdateText.replace('\'', '\\\'')
          

          要转义所有单引号,请使用

          UpdateText.replace(/'/g, '\\\'')
          

          【讨论】:

            【解决方案8】:

            感谢 mbrevoort, 我详细说明他的回答

            当您在查询中发送单引号时

            empid = " T'via" 
            empid = escape(empid)
            

            当你得到包含单引号的值时

            var xxx = request.QueryString("empid") 
            xxx = unscape(xxx)
            

            如果您想在查询中搜索/插入包含单引号的值

            xxx = Replace(empid, "'", "''")
            

            【讨论】:

              【解决方案9】:

              接受的答案不应该是使用的解决方案。

              为了通过 AJAX 将其发送到 DB,其中 request data单引号 ' in字符串,请执行以下操作:

              1. 将您的请求数据组织为一个对象
              var data = {
                "sectionName" : sectionName, 
                "UpdateText" : updateText,
                "EntityID"  : entityID
              }
              
              1. Stringfy 您的 数据JSON 并使用 AJAX 发送
              data = JSON.stringify(data); 
              $.ajax({
                          url: "",
                          type: "POST",
                          data: data, 
                          contentType: "application/json; charset=utf-8",
                          dataType: "json"
                      }).done(function (res) {
                          alert(res); 
                      }); 
              
              1. 取决于数据库,对于SQL Server,将单引号' 替换为双引号''转义单引号 .
              string data = date.Replace("'", "''")
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2015-09-16
                • 2015-10-29
                • 2017-02-26
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多