Как правильно вставить данные, содержащие специальные символы, в поле базы данных с помощью Perl и DBI?

У меня есть форма, мало чем отличающаяся от вопроса/комментария на этом сайте, которую я хочу опубликовать в поле в базе данных.

Однако, если кто-то, где нужно поместить специальные символы, такие как @#;"|, либо терпит неудачу, либо вставляет неправильно. Есть ли способ вставить указанные данные в базу данных без того, чтобы Perl пытался рассматривать определенные символы как операторы?


person Mose    schedule 01.07.2010    source источник
comment
какой код у тебя ломается? да, есть способ, но вы не дали достаточно информации.   -  person msw    schedule 01.07.2010
comment
возможный дубликат специальных символов в Perl   -  person Ether    schedule 01.07.2010
comment
Да, это еще даже не проблема базы данных, поэтому я открыл отдельный вопрос. Исключив элемент базы данных из сценария, если бы я хотел напечатать сообщение, в котором используются специальные символы, присвоить его переменной, отправить страницу самой себе и напечатать эту переменную — Perl интерпретировал бы многие специальные символы как операторы. Помните, я не только пытаюсь сбежать, но и любой другой специальный символ. Я хочу, чтобы текстовое поле работало так же, как добавленный комментарий здесь. Как только я смогу передать текст в переменную, часть базы данных должна работать нормально.   -  person Mose    schedule 01.07.2010
comment
возможный дубликат Как защититься от внедрения SQL атаки с использованием Perl DBI?   -  person Sinan Ünür    schedule 02.07.2010
comment
@mose, попробуйте следующее: спорьте с людьми, которые отвечают на ваш первый вопрос о неработающем коде не к вашему удовлетворению, и отказывайтесь отвечать, покажите нам свой код, чтобы мы могли исправить его для вас. Зажигайте, добро пожаловать в StackOverflow.   -  person msw    schedule 02.07.2010
comment
@msw Не уверен, откуда ты все это взял. Люди дают мне подключения к базе данных, однако, прежде чем я даже протестирую базу данных, код анализирует специальные символы. Я действительно не думал, что мне нужно печатать это, чтобы понять суть, но вот: $var =q {!@#$%^&*()_+{}][\:;'‹›., /?}; напечатайте $var перед публикацией этого исследования DBI-quote, и это не сработало в сценарии, который запрашивает все специальные символы, а не только одинарные кавычки.   -  person Mose    schedule 02.07.2010
comment
@msw Например: $var = q{тестирование $pecial ch@racter's}; возвращает что-то в результате: тестирования 0ecial char0acters   -  person Mose    schedule 02.07.2010
comment
Странно, я получаю testing $pecial ch@racter's в $var. Вы все еще не показываете код, который ломается. Вот отличное руководство: perldoc.perl.org/perlop. html#Quote-and-Quote-like-Operators   -  person msw    schedule 02.07.2010
comment
@msw: Этот парень разместил здесь точно такой же вопрос: stackoverflow.com/questions/3153972... опять же, он поспорил с ответы, которые он получил (которые, что неудивительно, были такими же, как здесь), и отказался показать часть кода, которая действительно была взломана, несмотря на просьбы... вздох   -  person psmears    schedule 03.07.2010


Ответы (1)


Вы можете использовать метод дескриптора базы данных quote. Чтобы процитировать документацию:

цитировать

$sql = $dbh->quote($value);
$sql = $dbh->quote($value, $data_type);

Заключите строковый литерал в кавычки для использования в качестве литерала в операторе SQL, экранировав любые специальные символы (например, кавычки), содержащиеся в строке, и добавив требуемый тип внешних кавычек.

$sql = sprintf "SELECT foo FROM bar WHERE baz = %s", $dbh->quote("Don't");

Однако лучше использовать заполнители и значения привязки:

$dbh->do("INSERT INTO foo VALUES(?)", undef, "@#;|");
person Eugene Yarmash    schedule 01.07.2010