Одиночные кавычки и апострофы в именах (такие как O'Brian) обычно вызывают проблемы в динамических клиентских сценариях, потому что они ломают их и позволяют вставлять вредоносный код (так называемые атаки сценариев).
Я написал следующий C # 6 метод расширения для кода для решения этой проблемы:
public static class Extension
{
public static string ToSQEscapedStringJS<T>(this T unescapedStr)
{
if (unescapedStr == null || unescapedStr.ToString() == "")
{
return "''";
}
// replace ' by @@@
var escapedStr = (unescapedStr).ToString().Replace("'", "@@@");
// JS code to replace @@@ by '
string unEscapeSQuote = "replace(/@{3}/g, String.fromCharCode(0x27))";
// add @@@ escaped string with conversion back to '
return $"('{escapedStr}'.{unEscapeSQuote})";
}
}
Его использование просто. Рассмотрим следующий пример динамического скрипта:
// contains apostroph (aka single quote) and is dangerous for your script block
var name = "O'Brian";
var nameEscp = name.ToSQEscapedStringJS(); // creates JS expression from it
// building up the script
string strScript =
$"<script>window.opener.document.forms(0).{control.Value}.value = {nameEscp};</script>";
ClientScript.RegisterClientScriptBlock(this.GetType(), "anything", strScript);
Обратите внимание , что nameEscp
уже заключено в одинарные кавычки, поэтому вы можете безопасно поместить его после =
.
Хитрость в том, что строка экранируется и сразу после назначения сразу же выходит (путем выполнения выражения JavaScript) на лету, т.е.
.value = ('O@@@Brian'.replace(/@{3}/g, String.fromCharCode(0x27));
будет вставленным выражением присваивания, которое будет отправлено клиенту в виде скрипта. После исполнения .value
содержит O'Brian
.