jQuery AlphaNumericPlugin - проблема копирования и вставки - PullRequest
2 голосов
/ 11 марта 2009

Я использую плагин .alphanumeric для jQuery, который, безусловно, делает то, что я ожидал, когда пользователи вводят текст прямо в текстовое поле. Но если пользователь скопирует и вставит значение в текстовое поле, все ставки отключены.

$("#<%= txtNumber.ClientID %>").alphanumeric({allow:"-"});

Я, конечно, могу сделать это:

$(document).ready(function() {
    $("#<%= txtNumber.ClientID %>").blur(function() {
        $("#<%= txtNumber.ClientID %>").val(
            RemoveInvalidCharacters(
                $("#<%= txtNumber.ClientID %>").val()
            )
        );
    });
});

//FUNCTION REMOVES ANY ; IN TEXT TO PREVENT SQL INJECTION
function RemoveInvalidCharacters(text) {
     return text.replace(';', '');
}

Но ... Я бы предпочел не прибегать к еще большему коду с помощью функций .blur (). Есть ли другие способы обойти это?

Ответы [ 5 ]

3 голосов
/ 13 марта 2009

Обработка события вставки довольно проста. Я использую эту технику в моем маскируемом плагине ввода с хорошими результатами. Не стесняйтесь просматривать источник, чтобы увидеть его в использовании.

Вот соответствующие биты, модифицированные для вашего примера выше.

var pasteEventName = $.browser.msie ? 'paste' : 'input';
$("#<%= txtNumber.ClientID %>").bind(pasteEventName, function() {
   setTimeout(function() { 
      RemoveInvalidCharacters(
         $("#<%= txtNumber.ClientID %>").val()
      ); 
   }, 0);
});
1 голос
/ 08 ноября 2010

Мне тоже нужно было решить проблему с вставкой, и я понял, что будет работать для меня. Человек все еще может использовать Edit> Paste в меню браузеров, но Ctrl-V, а также вставка правой кнопкой мыши обрабатываются. Протестировано в FF, IE, Opera, Safari, Chrome:

<!DOCTYPE html>
<html>
<head>
    <title>Only Allow Certain Characters</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
</head>
<body>
    <br>
    <form id="myform" action="">
        <input id="element1" name="mytext1" type="text">
        <input id="element2" name="mytext2" type="text">
    </form>
<script>
    /* removes evil chars while typing */
    (function($){
        $.fn.disableChars = function(a) {

            a = $.extend({
                allow: ''
            }, a);

            b = a.allow.split('');
            for ( i=0; i<b.length; i++) b[i] = "\\" + b[i];
            a.allow = b.join('');

            var regex = new RegExp('[^a-z0-9' + a.allow + ']', 'ig');

            $(this)
            .bind('keyup blur', function() {
                if (this.value.search(regex) != '-1') {
                    this.value = this.value.replace(regex, '');
                }
            })
            .bind('contextmenu',function () {return false});

        }
    })(jQuery);

    $("#element1").disableChars();
    $("#element2").disableChars({allow:".,:-() "});
</script>
</body>
</html>
1 голос
/ 03 февраля 2010

Я нашел это решение здесь: http://www.devcurry.com/2009/10/allow-only-alphanumeric-characters-in.html

<script type="text/javascript">
$(function() {
 $('input.alpha').keyup(function() {
  if (this.value.match(/[^a-zA-Z0-9 ]/g)) {
   this.value = this.value.replace(/[^a-zA-Z0-9 ]/g, '');
  }
 });
});
</script>

<input type="text" name="test" value="" class="alpha">
0 голосов
/ 13 марта 2009

Таким образом, вы не предотвратите внедрение SQL. Мне не нужно использовать вашу форму, я могу сделать мою и отправить ее в ваш сценарий. Еще проще: я могу отключить JavaScript и удалить вашу базу данных.

Вместо этого проверьте правильность ввода на стороне сервера.

Самый простой способ - избежать его или использовать параметризованные запросы.

0 голосов
/ 11 марта 2009

Копирование и вставка определенно является проблемой для маскируемых входов.

Рассматривали ли вы «кодирование» специальных символов при отправке формы, а не когда пользователь вводит значения? Мы делаем то же самое, чтобы позволить пользователям вводить символы <и> в текстовые поля (мы преобразуем их в & lt; и & gt; через javascript, а затем обратно в <и> в коде позади.

...