очистить данные для SQL с помощью JavaScript - PullRequest
5 голосов
/ 21 декабря 2010

У меня есть куча форм, которые имеют различные элементы ввода.Я хочу санировать их на стороне сервера ( да , я использую серверный JavaScript), чтобы использовать эти входные данные в качестве параметров и предотвратить искажение специальных символов.

Перед ваминапример, «это не относится к области JavaScript» и т. д. и т. д.

Я использую многомиллионное лицензионное программное решение, которое имеет JavaScript, но, по-видимому, не имеет стандартных функций, подобных этой.коробка.Итак, чем бы я ни пользовался, я могу заверить вас, что вы, вероятно, никогда не касались этого и не слышали об этом.И он поддерживает JavaScript на стороне сервера, потому что хорошо, язык классный.

Моя первая цель - очистить данные перед их отправкой в ​​базу данных, и мне просто нравится, например, способ, которым Ruby маркирует внешние данные: tainted,И у меня скорее нет никаких испорченных данных.Так что я мог гуглить и копировать и вставлять туда-сюда плохое регулярное выражение, и у меня получился печальный пример.Тем не менее, я хотел бы иметь функцию, которая сказала бы: «Хорошо, она отбирает 70% возможного материала из этих данных и чертовски хорошо очищает».

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

function sanitize(myString) { ... ; return myString }

Как мне выбрать такие символы, как '# !?и другие специальные символы, и как я могу вернуть их обратно?Мне известен метод escape JavaScript, но я хочу знать, отлажена ли и уже доступна функция, прежде чем я заново изобрел колесо.

Я рассмотрел: - Побег JavaScript - Кодировка Base64 - Regex

Я просто спрашиваю людей, которые писали такие функции раньше.

Спасибо,

1 Ответ

9 голосов
/ 21 декабря 2010

См. Обновление ниже

Вы заново изобретаете колесо.Все, что вы используете для общения с базой данных, должно иметь какую-то концепцию «подготовленного заявления».В Java это буквально класс PreparedStatement, но практически любая система доступа к базе данных должна иметь нечто подобное.Вы используете их, чтобы не создавать операторы SQL в виде строк.Так, например, концептуально:

preparedStatement = prepare("insert into mytable (id, name) values (?, ?)")
preparedStatement.setField(0, theId);
preparedStatement.setField(1, theName);

Not :

statement = "insert into mytable (id, name) values ('" + theId + "', '" + theName + "')"

... что требует инъекционных атак.

The "Концепция «подготовленное утверждение» централизует выход на уровень связи с базой данных, который хорошо подготовлен для обработки. Если вы сообщите людям, что вы используете для доступа к вашей базе данных, они смогут указать вам на соответствующий механизм. См. Ниже.

Просто для того, чтобы избежать сомнений: вывы делаете это на сервере , верно?Я имею в виду, вот как я это прочитал, вы на самом деле сказали «Я хочу очистить их на стороне сервера ...» .Но на тот случай, если вы думаете об этом на стороне клиента: Вы не можете .Ничего, абсолютно ничего, что посылает вам клиентская сторона, можно доверять, так как это может быть подделкой.Вы должны сделать это на стороне сервера.


Обновление : Вы прокомментировали, что используете Rhino на сервере приложений.Отлично!Тогда просто PreparedStatement и пусть ваш драйвер JDBC справится с этим за вас. (Для тех, кто не является Java: Rhino - это JavaScript для Java VM. Это великолепно.)

...