是否可以阻止 XSS攻击在 GET / POST输入中阻止任何 HTML标记(编码/未编码)?此外,服务器端的(有意)动态数据不包含任何HTML标记。
可以通过中间件来阻止HTML标记,该中间件检查是否在任何 GET / POST 请求中显示任何html标记。
我的所有静态字符串都是安全的,只有动态字符串是我必须担心的,动态字符串来自客户端(使用GET / POST请求)或来自数据库,如果我可以确保这些字符不是 [“,',<,>,&] 来自客户端或数据库的任何动态字符串,我能否避免使用XSS?
答案 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)
获取输入后使用MySQL:
$foo = $_POST['bar'];
$safefoo = $mysqli_instance->real_escape_string($foo)
Safefoo将是变量的消毒版本
如果您不使用mysql,但想删除特殊字符
// Strip HTML Tags
$clear = strip_tags($des);
// Clean up things like &
$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
函数必须按以下顺序执行这些替换:
& --> &
< --> <
> --> >
" --> "
同样,您必须使用参数来接受来自用户的数据,而不是代码。接受数据时,HTML中存在某些区域:
<a title="data">...</a>
<strong>data</strong>
<p>data</p>
...但还有其他人只接受代码(或URL)。这些必须由静态代码组成:
<a href="code">...
<img src="code">...
<script src="code">...
<script>code</script>