كيف يمكنني الهروب من سلسلة داخل كود JavaScript داخل معالج onClick؟

StackOverflow https://stackoverflow.com/questions/97578

سؤال

ربما أفكر في هذا كثيرًا، ولكن أواجه مشكلة في معرفة ما يمكن استخدامه في الهروب على سلسلة في بعض تعليمات برمجية JavaScript داخل معالج onClick الخاص بالرابط.مثال:

<a href="#" onclick="SelectSurveyItem('<%itemid%>', '<%itemname%>'); return false;">Select</a>

ال <%itemid%> و <%itemname%> حيث يحدث استبدال القالب.مشكلتي هي أن اسم العنصر يمكن أن يحتوي على أي حرف، بما في ذلك علامات الاقتباس المفردة والمزدوجة.حاليًا، إذا كانت تحتوي على علامات اقتباس مفردة، فإنها تكسر كود JavaScript.

كانت فكرتي الأولى هي استخدام وظيفة لغة القالب لتجاوز اسم العنصر في JavaScript، والذي يفلت من علامات الاقتباس.لن يؤدي ذلك إلى إصلاح حالة السلسلة التي تحتوي على علامات اقتباس مزدوجة والتي تكسر HTML الخاص بالارتباط.كيف يتم معالجة هذه المشكلة عادة؟هل أحتاج إلى الهروب من معالج onClick بأكمله باستخدام HTML؟

إذا كان الأمر كذلك، فسيبدو ذلك غريبًا حقًا نظرًا لأن وظيفة الهروب الخاصة بلغة القالب من شأنها أيضًا أن تقوم بتعريف الأقواس وعلامات الاقتباس والفواصل المنقوطة...

يتم إنشاء هذا الارتباط لكل نتيجة في صفحة نتائج البحث، لذا فإن إنشاء طريقة منفصلة داخل علامة JavaScript غير ممكن، لأنني سأحتاج إلى إنشاء طريقة منفصلة لكل نتيجة.

كما أنني أستخدم محركًا للنماذج تم تطويره محليًا في الشركة التي أعمل بها، لذا فإن الحلول الخاصة بمجموعة الأدوات لن تكون ذات فائدة بالنسبة لي.

هل كانت مفيدة؟

المحلول

في JavaScript، يمكنك ترميز علامات الاقتباس المفردة كـ "\x27" وعلامات الاقتباس المزدوجة كـ "\x22".لذلك، باستخدام هذه الطريقة، يمكنك، بمجرد دخولك إلى علامات الاقتباس (المزدوجة أو المفردة) لسلسلة جافا سكريبت الحرفية، استخدام \x27 \x22 دون خوف من أي علامات اقتباس مضمنة "تندلع" من سلسلتك.

‎\xXX مخصص للأحرف < 127، و\uXXXX مخصص للأحرف يونيكود, ، لذا، بالتسلح بهذه المعرفة، يمكنك إنشاء قوة JSEncode وظيفة لجميع الشخصيات التي هي خارج القائمة البيضاء المعتادة.

على سبيل المثال،

<a href="#" onclick="SelectSurveyItem('<% JSEncode(itemid) %>', '<% JSEncode(itemname) %>'); return false;">Select</a>

نصائح أخرى

اعتمادًا على لغة جانب الخادم، يمكنك استخدام أحد هذه اللغات:

نت 4.0

string result = System.Web.HttpUtility.JavaScriptStringEncode("jsString")

جافا

import org.apache.commons.lang.StringEscapeUtils;
...

String result = StringEscapeUtils.escapeJavaScript(jsString);

بايثون

import json
result = json.dumps(jsString)

بي أتش بي

$result = strtr($jsString, array('\\' => '\\\\', "'" => "\\'", '"' => '\\"', 
                                 "\r" => '\\r', "\n" => '\\n' ));

روبي على القضبان

<%= escape_javascript(jsString) %>

استخدم الامتدادات المخفية، واحدة لكل من المعلمات <%itemid%> و <%itemname%> واكتب قيمهم بداخلها.

على سبيل المثال، المدى ل <%itemid%> ستبدو <span id='itemid' style='display:none'><%itemid%></span> وفي وظيفة جافا سكريبت SelectSurveyItem لاختيار الحجج من هذه الامتدادات innerHTML.

حاول تجنب استخدام القيم النصية في HTML الخاص بك واستخدم JavaScript لربط أحداث JavaScript.

تجنب أيضًا "href=#" إلا إذا كنت حقًا تعرف ماذا تفعل.إنه يكسر الكثير من قابلية الاستخدام للنقر الأوسط القهري (فتحة علامة التبويب).

<a id="tehbutton" href="somewhereToGoWithoutWorkingJavascript.com">Select</a>

مكتبة جافا سكريبت المفضلة لدي هي jQuery:

<script type="text/javascript">//<!-- <![CDATA[
jQuery(function($){
   $("#tehbutton").click(function(){
        SelectSurveyItem('<%itemid%>', '<%itemname%>');
        return false;
   });
});
//]]>--></script>

إذا كنت تعرض قائمة من الروابط بهذه الطريقة، فقد ترغب في القيام بذلك:

<a id="link_1" href="foo">Bar</a>
<a id="link_2" href="foo2">Baz</a>

<script type="text/javascript">
   jQuery(function($){
        var l = [[1,'Bar'],[2,'Baz']];
        $(l).each(function(k,v){
           $("#link_" + v[0] ).click(function(){
                SelectSurveyItem(v[0],v[1]);
                return false;
           });
        });
   });
 </script>

إذا كان الأمر يتعلق بسمة HTML، فستحتاج إلى تشفير HTML (كحد أدنى: > ل &gt; < ل &lt و " ل &quot;) هو - هي، و الهروب من علامات الاقتباس المفردة (بخط مائل عكسي) حتى لا تتداخل مع اقتباسات جافا سكريبت الخاصة بك.

أفضل طريقة للقيام بذلك هي باستخدام نظام القوالب الخاص بك (توسيعه، إذا لزم الأمر)، ولكن يمكنك ببساطة إنشاء وظيفتين للهروب/الترميز ولفهما حول أي بيانات موجودة هناك.

ونعم، من الصحيح تمامًا (صحيح، حتى) إلغاء HTML لمحتويات سمات HTML بالكامل، حتى لو كانت تحتوي على جافا سكريبت.

قد يكون الحل الآخر المثير للاهتمام هو القيام بذلك:

<a href="#" itemid="<%itemid%>" itemname="<%itemname%>" onclick="SelectSurveyItem(this.itemid, this.itemname); return false;">Select</a>

ثم يمكنك استخدام ترميز HTML القياسي على كلا المتغيرين، دون الحاجة إلى القلق بشأن التعقيدات الإضافية لاقتباس جافا سكريبت.

نعم هذه يفعل إنشاء HTML غير صالح تمامًا.ومع ذلك، فإنه يكون تقنية صالحة، وجميع المتصفحات الحديثة تدعمها.

إذا كان الأمر كذلك، فمن المحتمل أن أوافق على اقتراحي الأول، وأتأكد من أن القيم مشفرة بتنسيق HTML و لقد هربت علامات الاقتباس المفردة.

قم بتعريف وظائف منفصلة في قسم <head> واستدعاء تلك الموجودة في طريقة onClick الخاصة بك.إذا كان لديك الكثير، فيمكنك استخدام نظام تسمية لترقيمها، أو تمرير عدد صحيح في onClicks الخاص بك والحصول على بيان تبديل كبير في الوظيفة.

لقد واجهت هذه المشكلة أيضا.لقد قمت بإنشاء برنامج نصي لتحويل علامات الاقتباس المفردة إلى علامات اقتباس مزدوجة تم تجاوزها والتي لن تؤدي إلى كسر HTML.

function noQuote(text)
{
    var newtext = "";
    for (var i = 0; i < text.length; i++) {
        if (text[i] == "'") {
            newtext += "\"";
        }
        else {
            newtext += text[i];
        }
    }
    return newtext;
}

استخدم ال مكتبة مايكروسوفت لمكافحة XSS والذي يتضمن ترميز جافا سكريبت.

أولاً، سيكون الأمر أسهل إذا تم ضبط معالج onclick بهذه الطريقة:

<a id="someLinkId"href="#">Select</a>
<script type="text/javascript">
  document.getElementById("someLinkId").onClick = 
   function() {
      SelectSurveyItem('<%itemid%>', '<%itemname%>'); return false;
    };

</script>

ثم يجب أن يتم الهروب من itemid وitemname لجافا سكريبت (أي، " يصبح \", ، إلخ.).

إذا كنت تستخدم Java على جانب الخادم، فيمكنك إلقاء نظرة على الفصل الدراسي StringEscapeUtils من اللغة العامية في جاكرتا.بخلاف ذلك، لن يستغرق الأمر وقتًا طويلاً لكتابة طريقة "escapeJavascript" الخاصة بك.

هل الإجابات هنا هي أنه لا يمكنك الهروب من علامات الاقتباس باستخدام JavaScript وأنك تحتاج إلى البدء بالسلاسل التي تم تجاوزها.

لذلك.لا توجد طريقة تمكن JavaScript من التعامل مع السلسلة "قالت مارج "كنت سأبدو" لبيتر" وتحتاج إلى تنظيف بياناتك قبل عرضها على البرنامج النصي؟

أي محرك قوالب جيد يستحق الملح سيكون له وظيفة "علامات الاقتباس".لدينا (أيضًا محليًا، حيث أعمل) أيضًا وظيفة للهروب من علامات الاقتباس لجافا سكريبت.في كلتا الحالتين، يتم بعد ذلك إلحاق متغير القالب بـ _esc أو _js_esc، اعتمادًا على ما تريده.لا يجب عليك مطلقًا إخراج المحتوى الذي أنشأه المستخدم إلى متصفح لم يتم الهروب منه، IMHO.

واجهت نفس المشكلة وحليتها بطريقة صعبة.قم أولاً بإنشاء المتغيرات العامة، v1، وv2، وv3.وفي عند النقر أرسل مؤشرا 1 أو 2 أو 3 وفي الوظيفة تحقق من 1 و 2 و 3 لوضع v1 و v2 و v3 مثل:

onclick="myfun(1)"
onclick="myfun(2)"
onclick="myfun(3)"

function myfun(var)
{
    if (var ==1)
        alert(v1);

    if (var ==2)
        alert(v2);

    if (var ==3)
        alert(v3);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top