Ошибка с кодированием апостроф в и из базы данных - PullRequest
0 голосов
/ 19 сентября 2011

У меня есть HTML-строка, которая динамически создается на стороне сервера.

strHTML = "<td><a href""google.com"" onclick=""SaveToDatabase('" + arrString(0) + "','" + arrString(1) + "')""  

Значение arrString (1) равно javascript: OpenDoc ('ProductManual.pdf', 'vbShowDoc')

Сообщение об ошибке: ожидается')'

Как мне закодировать это значение для сохранения в базе данных и декодировать при извлечении из базы данных?

Ответы [ 4 ]

2 голосов
/ 19 сентября 2011

Проблема в том, что вы SaveToDatabase («что угодно», «javascript: OpenDoc (« ProductManual.pdf »,« vbShowDoc »)») ""

обратите внимание на проблему с вашими кавычками.у вас есть открывающая цитата в 'javascript, но ваша заключительная цитата, которую он принял после OpenDoc (' это не ваша заключительная цитата, поэтому используйте \ '. Вам необходимо закодировать вашу цитату с помощью \'

Также см .: http://forums.asp.net/t/1047952.aspx

Редактировать: я вижу, что Mid787 побил меня, но я хотел предоставить дополнительную информацию

2 голосов
/ 19 сентября 2011

простой

вы должны заменить ' на \'

(C #)

arrString(0)=arrString(0).replace("'",@"\'")
1 голос
/ 20 сентября 2011

Каждый раз, когда вы читаете ввод от пользователя или любого внешнего источника, вы ВСЕГДА ВСЕГДА должны всегда избегать его, прежде чем пытаться создать из него команду SQL.

Один из способов сделать это - использовать подготовленные операторы илихранимые процедуры и использовать встроенные вызовы функций для установки переменных.Тогда функция позаботится о любом экранировании.

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

Пэт О'Хара сказал «Привет»

в

Пэт О'Хара сказал: «Привет»

Некоторые движки SQL имеют другие символы, которые требуют экранирования, как в Postgres, вы также должны удваивать обратную косую черту.

Довольно просто написатьфункция, чтобы сделать это, а затем ВСЕГДА использовать его.

У меня было много разговоров с программистами, где они говорят, что они не беспокоятся в этом случае, потому что они не думали, что кто-то когда-либо будет входитьцитата в этой конкретной области.Но обычно причина нашего разговора в том, что кто-то это сделал.Не анализируй это!Просто сделай это!Это как носить ремень безопасности.Вы могли бы сидеть там и вычислять шансы, которые вы получите в аварии в этой конкретной поездке, но почему?Мудрый водитель делает это бессмысленным автоматическим действием, чтобы всегда просто пристегнуть ремень безопасности, даже если все, что он делает, это перемещает автомобиль с дороги на улицу.Мудрый программист базы данных всегда избегает входных строк, потому что вы никогда не знаете.

0 голосов
/ 19 сентября 2011

Если вы пытаетесь передать строку типа

INSERT dbo.table(foo) VALUES('foo'bar');

Вам нужно удвоить апострофы:

INSERT dbo.table(foo) VALUES('foo''bar');

Но @Джон Хартсок абсолютно прав: вам не следует посылать произвольные составные строки на SQL Server. Если вы используете параметры, вы можете полностью избежать этой проблемы.

...