我正在通过NerdDinner工作,我对以下部分感到有点困惑......
首先,他们添加了一个用于创建新晚餐的表单,其中包含一些文本框,如下所示:
<%= Html.TextArea("Description") %>
然后,他们展示了将表单输入绑定到模型的两种方法:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create() {
Dinner dinner = new Dinner();
UpdateModel(dinner);
...
}
Run Code Online (Sandbox Code Playgroud)
要么:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Dinner dinner) { ... }
Run Code Online (Sandbox Code Playgroud)
好的,很棒,到目前为止看起来都非常简单.
然后他们说:
在接受任何用户输入时,始终对安全性总是偏执是很重要的,并且在将对象绑定到表单输入时也是如此.您应该小心始终对任何用户输入的值进行HTML编码,以避免HTML和JavaScript注入攻击
咦?MVC正在为我们管理数据绑定.您应该在哪里/如何进行HTML编码?
我有一个用于发送电子邮件的实用程序类.电子邮件生成为html.
我在编码未正确显示的特殊字符时遇到问题.
但是,我无法弄清楚如何使用,HtmlEncode因为我没有电流HttpContext.是否有一个.Net类将特殊字符转换为HTML代码而不运行Asp.Net?
我希望这是有道理的,我对这些东西的运作方式有点不稳定.谢谢!
有没有办法使用TextBoxFor帮助程序与编码文本?
例如:使用以下MVC3帮助器和Razor视图引擎时:
@Html.TextBoxFor(model => model.Description)
Run Code Online (Sandbox Code Playgroud)
和model.Description的值被编码,例如:
<script>alert();'</script>
Run Code Online (Sandbox Code Playgroud)
结果是带有编码字符串的文本框,当想要的结果是带有解码字符串的文本框时:
<script>alert();'</script>
Run Code Online (Sandbox Code Playgroud)
有没有办法使用MVC TextBoxFor编码字符串而不是使用
@Html.TextBox("Description", Server.HtmlDecode(Model.Description))
Run Code Online (Sandbox Code Playgroud)
?
当我尝试在ASP.NET中提交表单时,我收到了上述异常.
这篇文章真的很有帮助,但即使在设置后ValidateRequest="false"我也只为""组合得到此错误.由于我们使用的是挪威字符,因此需要此特定组合.
而且我也httpRuntime requestValidationMode="2.0"参与其中web.config.
当我提交/ POST数据到服务器,我需要的HTMLEncode它的字符(相关的),因为通过设置禁止输入检查validationRequest = false是不是一个好的做法.
所有解决方案最终都在替换字符串中的字符:
这就是我写的.
function htmlEncode(str) {
str = str.replace(/\&/g, "&");
str = str.replace(/\</g, "<");
str = str.replace(/\>/g, ">");
str = str.replace(/ /g, " ");
return str;
}
Run Code Online (Sandbox Code Playgroud)
但是显然正则表达式可以用更快的东西代替(不要误解我 - 我喜欢正则表达式).
此外,使用索引+子字符串似乎很浪费.
这样做的最快方法是什么?
我看起来像Sublime Text中给出的功能,快捷方式(windows)Ctrl+ Shift+ P命名为"HTML:编码特殊字符",但在IntelliJ IDEA中.此功能可以对此进行转换(作为示例):
I'm a special character phrase "áéíóú ñ"
Run Code Online (Sandbox Code Playgroud)
进入:
I'm a special character phrase "áéíóú ñ"
Run Code Online (Sandbox Code Playgroud)
只能通过包围指定的文本并按下上面给出的快捷键组合(再次,在Windows Ctrl+ Shift+中P).
有什么想法吗?
更新(07-04-2016)
到目前为止,Intellij Idea本身支持此功能(2016版).您需要选择要转换的文本和(在OSX中)Cmd + Shift + A并键入"Encode",然后选择"编码XML/HTML特殊字符"操作
唯一需要注意的是,这仅适用于html字符串(据我所知).
亲自尝试一下:
echo(html_entity_decode("…"));
Run Code Online (Sandbox Code Playgroud)
它回声…而不是…它应该.
为什么这不会解码,我怎么能这样做呢?
人们说为了防止SQL注入,你可以做以下其中一件事(其中包括):
我已完成第1项,准备我的陈述,但我现在想知道是否应该逃避所有用户输入.这是浪费时间,因为我准备好了陈述,还是这会增加预防的机会?
使用PHP,在MSQUL数据库中存储特殊字符(如下所示)的最佳方法是什么,以避免注入.
« " ' é à ù
Run Code Online (Sandbox Code Playgroud)
这是我现在这样做的方式:
$book_text=$_POST['book_text'];
$book_text=htmlentities($book_text, "ENT_QUOTES");
$query=//DB query to insert the text
Run Code Online (Sandbox Code Playgroud)
然后:
$query=//DB query to select the text
$fetch=//The fetch of $book_text
$book_text=html_entity_decode($book_text);
Run Code Online (Sandbox Code Playgroud)
这样,我的所有文本都以HTML实体格式化.但我认为这占用了大量的数据库空间.那么,有更好的方法吗?
在cshtml文件中,我将一个字符串分配给一个属性.例如:
<input name="somename" value="@Model.Value">
Run Code Online (Sandbox Code Playgroud)
由于@ Model.Value字符串可以包含任何Unicode字符,因此显然必须对字符串进行编码.Razor会自动编码这个值吗?我猜它不会或不会因为我可以很容易地在它之后放一个@ Html.Raw将整个事情分解成两个标签.
我想我需要做的是:
<input name="somename" value="@Html.Raw(Html.AttributeEncode(Model.Value))">
Run Code Online (Sandbox Code Playgroud)
那是对的吗?
同样,如果我在脚本中的JavaScript字符串中嵌入字符串值,我应该使用:
//I could use Ajax instead of HttpUtility here, but Ajax just wraps the same call.
<script>$('id').data('key','@Html.Raw(HttpUtility.JavaScriptStringEncode(Model.Value))');</script>
Run Code Online (Sandbox Code Playgroud) html-encode ×10
asp.net-mvc ×2
php ×2
security ×2
.net ×1
asp-classic ×1
asp.net ×1
c# ×1
ide ×1
javascript ×1
jquery ×1
mysql ×1