我是否需要在html属性值中转义引号?允许哪些字符?
这有效吗?
<span title="This is a 'good' title.">Hi</span>
Run Code Online (Sandbox Code Playgroud) 我想按原样打印以下文字:
echo "<label> AAAAA";
Run Code Online (Sandbox Code Playgroud)
但它只是显示'AAAAA'作为输出.
如何逃脱'<'和'>'符号.
在我的Web应用程序中,用户可以输入文本数据.此数据可以显示给其他用户,原始作者也可以返回并编辑他们的数据.我正在寻找安全地逃避这些数据的正确方法.
我只是在进行sql清理,因此所有内容都会在读取时存储.假设我在数据库中有"似曾相识".或者,更加极端,一个<script>标签.这可能是有效的,甚至不是恶意的输入.
我正在htmlentities()出路以确保一切都被逃脱.问题是html和输入字段对待事物的方式不同.我想确保它在HTML中是安全的,但是作者在编辑文本时会看到他们在输入字段中输入的内容.我也使用jQuery动态填充表单字段和数据.
如果我这样做:
<p><?=htmlentities("déjà vu");?></p>
<input type=text value="<?=htmlentities("déjà vu");?>">
Run Code Online (Sandbox Code Playgroud)
页面源放入déjà vu两个地方(我不得不反击或者你会看到"似曾相识"!)问题是输出<p>是正确的,但输入只显示转义文本.如果用户重新提交表单,他们会双重逃避并破坏他们的输入.
我知道我仍然需要清理进入该领域的文本,否则你可以结束价值报价并做坏事.我找到的唯一解决方案就是这个.我再次使用jQuery.
var temp = $("<div></div>").html("<?=htmlentities("déjà vu");?>");
$("input").val(temp.html());
Run Code Online (Sandbox Code Playgroud)
这有效,因为它导致div将转义的文本作为编码字符读取,然后jquery将这些编码的字符复制到输入标记,并进行适当保留.
所以我的问题是:这仍然是安全的,还是某处有安全漏洞?更重要的是,这是唯一/正确的方法吗?我是否遗漏了有关html和字符编码如何工作的问题,这使得这个问题难以解决?
这实际上是错误的,我过度简化了我的例子,以至于它不起作用.问题实际上是因为我使用jQuery的val()将文本插入到字段中.
<input>
<script>$("input").val("<?=htmlentities("déjà vu");?>");</script>
Run Code Online (Sandbox Code Playgroud)
这样做的原因是表单是动态的 - 用户可以随意添加或删除字段,因此它们是在页面加载后生成的.
所以似乎jQuery正在逃避数据进入输入,但它还不够好 - 如果我自己不做任何事情,用户仍然可以放入</script>标签,查杀代码并插入恶意代码.但是这里有另一个论点要做.由于只有原作者才能在输入框中看到文字,我是否应该打扰?基本上他们可以执行XSS攻击的唯一人就是他们自己.
这应该相当容易,但我不知道我在这里缺少什么:
我有我的数据库,我希望从中填充alt属性.
我的代码如下:
<img src="admin/uploads/retouch/'.$list->thumbnail.'" class="thumb-image" alt="'.utf8_encode(addslashes($list->titulo)).'" />
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我的数据库中的"titulo"里面有什么东西"就在它上面,我在我的代码中得到了这个结果:
<img ti!\""="" por="" ¡hazlo="" manos.="" en="" estÁ="" prestaciones="" tus="" mejorar="" alt="\" class="thumb-image" src="admin/uploads/retouch/noticia_default.png">
Run Code Online (Sandbox Code Playgroud)
来自数据库的句子是:"MEJORAR TUS PRESTACIONESESTÁENTUS MANOS."HAZLO POR TI!