ВАЖНО
. Лучший способ предотвратить SQL Injection - использовать подготовленные выражения вместо экранирования , поскольку демонстрирует принятый ответ .
Существуют библиотеки, такие как Aura.Sql и EasyDB , которые позволяют разработчикам легче использовать подготовленные инструкции. Чтобы узнать больше о том, почему подготовленные операторы лучше в останавливать SQL-инъекцию , см. этот
mysql_real_escape_string()
обход и недавно зафиксированные уязвимости Unicode SQL Injection в WordPress .Предотвращение впрыска - mysql_real_escape_string ()
У PHP есть специально созданная функция для предотвращения этих атак. Все, что вам нужно сделать, это использовать функцию функции
mysql_real_escape_string
.
mysql_real_escape_string
берет строку, которая будет использоваться в запросе MySQL, и возвращает ту же строку со всеми попытками внедрения SQL безопасно сбежал. В принципе, это заменит эти неприятные кавычки ('), которые пользователь может ввести с помощью заменителя в MySQL, сэкономленная цитата.ПРИМЕЧАНИЕ: вы должны подключиться к базе данных, чтобы использовать эту функцию!
// Подключение к MySQL
$name_bad = "' OR 1'"; $name_bad = mysql_real_escape_string($name_bad); $query_bad = "SELECT * FROM customers WHERE username = '$name_bad'"; echo "Escaped Bad Injection:
" . $query_bad . "
"; $name_evil = "'; DELETE FROM customers WHERE 1 or username = '"; $name_evil = mysql_real_escape_string($name_evil); $query_evil = "SELECT * FROM customers WHERE username = '$name_evil'"; echo "Escaped Evil Injection:
" . $query_evil;Более подробную информацию вы найдете в MySQL - SQL Injection Prevention .
Используйте ViewContext
и посмотрите RouteData
набор для извлечения и контроллера и элементов действия. Но я думаю, устанавливая некоторую переменную данных, которая указывает на контекст приложения (например, "editmode" или "ошибка"), а не контроллер/действие уменьшает связь между Вашими представлениями и контроллерами.
В RC можно также извлечь данные маршрутов как имя метода действия как это
ViewContext.Controller.ValueProvider["action"].RawValue
ViewContext.Controller.ValueProvider["controller"].RawValue
ViewContext.Controller.ValueProvider["id"].RawValue
<час> ViewContext.Controller.ValueProvider.GetValue("action").RawValue
ViewContext.Controller.ValueProvider.GetValue("controller").RawValue
ViewContext.Controller.ValueProvider.GetValue("id").RawValue
ViewContext.Controller.RouteData.Values["action"]
ViewContext.Controller.RouteData.Values["controller"]
ViewContext.Controller.RouteData.Values["id"]
ViewContext.RouteData.Values["action"]
ViewContext.RouteData.Values["controller"]
ViewContext.RouteData.Values["id"]
Получить текущий идентификатор на Представлении:
ViewContext.RouteData.Values["id"].ToString()
Для получения текущего контроллера:
ViewContext.RouteData.Values["controller"].ToString()
В MVC необходимо предоставить Представлению все данные, которым не позволяют Представление собрать его собственные данные поэтому, что можно сделать, должен установить класс CSS в действии контроллера.
ViewData["CssClass"] = "bold";
и выбирают это значение от Вашего ViewData в Вашем Представлении
Я знаю, что это более старый вопрос, но я видел его и подумал, что вам может быть интересна альтернативная версия, чем позволить вашему представлению обрабатывать извлечение данных, необходимых для выполнения своей работы.
На мой взгляд, более простым способом было бы переопределить метод OnActionExecuting . Вам передается ActionExecutingContext , который содержит член ActionDescriptor , который вы можете использовать для получения искомой информации, которая является ActionName, и вы также можете получить доступ к ControllerDescriptor, и он содержит ControllerName.
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
ActionDescriptor actionDescriptor = filterContext.ActionDescriptor;
string actionName = actionDescriptor.ActionName;
string controllerName = actionDescriptor.ControllerDescriptor.ControllerName;
// Now that you have the values, set them somewhere and pass them down with your ViewModel
// This will keep your view cleaner and the controller will take care of everything that the view needs to do it's job.
}
Надеюсь, это поможет. Во всяком случае, по крайней мере, это покажет альтернативу для всех, кто задается вашим вопросом.
Я голосую за 2:
string currentActionName = ViewContext.RouteData.GetRequiredString("action");
и
string currentViewName = ((WebFormView)ViewContext.View).ViewPath;
Вы можете получить как физическое имя текущего представления, так и действие, которое его запустило. Это может быть полезно на частичных страницах * .acmx для определения хост-контейнера.