0

我正在考虑XSS漏洞!

我有网站,其中所有数据 b/w Web 服务器和客户端都通过 XHR 传输 - JSON 和浏览器 javascript 完成其余工作以显示该网站。

当客户端提交数据时,这是我将数据记录在数据库(PHP)中之前的代码:

$string = trim($_POST['user_input']);
$string = strip_tags($string);
$string = mysql_real_escape_string($string);

当服务器从数据库中获取数据时 PHP 代码如下:

$string = htmlspecialchars($db_value);

接着

header('Content-Type: application/json; charset=utf-8');
print json_encode($string);

这足以保护我免受 XSS 攻击吗?

4

2 回答 2

2

作为一般经验法则,这里的另一个答案是不正确的。将 application/json 用于您的内容类型将解决一些问题,但许多客户端倾向于从 JSON 对象中提取数据并将其显示在页面上。这导致了经典的攻击。

停止 XSS 的唯一可靠方法(我说可靠,因为它不是万无一失的)是清理入站流上的数据(完全拒绝请求可能是一个更好的调用)并编码所有可能显示的输出(即:用户可以修改的任何内容)。

此外,不要接受并非为安全性而设计的方法本质上是安全的想法(json_encode 并不意味着 XSS 安全性,不应该这样使用)。任何关于由于 X 而没有必要进行正常安全实践的建议,如果不是完全无视,就应该持怀疑态度。

于 2015-04-24T16:19:41.423 回答
1

这真的取决于。如果$stringpost json_encode 的内容包含 HTML 实体并在页面上显示为 html,那么您将容易受到 XSS 的攻击。如果不是这种情况(而且不是因为您一直在使用application/json),那么不仅没有必要使用htmlspecialchars,而且可能是不可取的,因为它会改变您尝试通过 JSON 传输的原始数据。

我不会说你对 XSS 完全无懈可击,因为它只受到恶人想象力的限制,但我会说header('Content-Type: application/json;')在这种情况下提供了足够的保护。

在不相关的注释上,停止使用ext/mysql.

于 2013-02-07T00:23:35.800 回答