通过阻止GET / POST中的HTML标记来防止XSS

时间:2015-12-25 02:06:06

标签: html http xss middleware

是否可以阻止 XSS攻击 GET / POST输入中阻止任何 HTML标记(编码/未编码)?此外,服务器端的(有意)动态数据不包含任何HTML标记。

可以通过中间件来阻止HTML标记,该中间件检查是否在任何 GET / POST 请求中显示任何html标记。

我的所有静态字符串都是安全的,只有动态字符串是我必须担心的,动态字符串来自客户端(使用GET / POST请求)或来自数据库,如果我可以确保这些字符不是 [“,',<,>,&] 来自客户端或数据库的任何动态字符串,我能否避免使用XSS?

3 个答案:

答案 0 :(得分:2)

即使您阻止了[“,',<,>,&],也可能会注入错误代码。它总是取决于您对所发送数据的处理方式。您要显示它吗?如果是这样的话? ,为什么不只是使用htmlspecialchars等效的,已经存在的,经过测试的函数?

通过仅禁用上述字符,您仍然可能会受到感染,具体取决于您插入数据的位置。想象一下:

allProducts.removeAll(productSelected) ;
finalCost = allProducts.stream().collect(Collectors.summingDouble(Data::getRTotal));
// update label...

通过插入 onclick = alert(document.cookie),您也可以执行代码。

正如我所说,这取决于您插入数据的位置,但针对XSS(以及绝对所有其他潜在攻击媒介)的最佳做法是使用经过严格测试,众所周知的现有功能。

此外,这也会导致潜在的安全问题:

<img src="...." <?=$_GET['data']; ?> />

...如果您插入的内容如 javascript:alert(document.cookie)或类似内容。

答案 1 :(得分:1)

假设您正在使用 PHP

  • 获取输入后使用MySQL:

    $foo = $_POST['bar'];
    $safefoo = $mysqli_instance->real_escape_string($foo)
    

Safefoo将是变量的消毒版本

如果您不使用mysql,但想删除特殊字符

// Strip HTML Tags
$clear = strip_tags($des);
// Clean up things like &amp;
$clear = html_entity_decode($clear);
// Strip out any url-encoded stuff
$clear = urldecode($clear);
// Replace non-AlNum characters with space
$clear = preg_replace('/[^A-Za-z0-9]/', ' ', $clear);
// Replace Multiple spaces with single space
$clear = preg_replace('/ +/', ' ', $clear);
// Trim the string of leading/trailing space
$clear = trim($clear);

答案 2 :(得分:1)

通过正确转义所有输入数据,您可以避免XSS和代码注入(并且仍然保持数据透明性):

的伪代码:

// Pre-processing:
myData=readFromHttp("arg-name");

// ...Processing...
// Use myData only in user sections, not for composing SQL statements:
// SQL statements should be static, and apply dynamic data through placeholders.

// Post-processing: Compose an HTML result:
"<html>"+escapeHtml(myData)"</html>"

escapeHtml函数必须按以下顺序执行这些替换:

& --> &amp;
< --> &lt;
> --> &gt;
" --> &quot;

同样,您必须使用参数来接受来自用户的数据,而不是代码。接受数据时,HTML中存在某些区域:

<a title="data">...</a>
<strong>data</strong>
<p>data</p>

...但还有其他人只接受代码(或URL)。这些必须由静态代码组成:

<a href="code">...
<img src="code">...
<script src="code">...
<script>code</script>
相关问题