Php 照顾XSS

Php 照顾XSS,php,security,xss,Php,Security,Xss,我运行了一个笔测试应用程序,它发现了大量XSS错误,特别是,我犯了通过查询字符串将未经验证的数据回显到浏览器的错误 具体来说,运行它会将javascript放入我的页面。 “[ScRiPt]%20%0a%0d>警报(426177032569)%3B[/ScRiPt] 谢天谢地,我不允许用户将数据保存到数据库并显示回其他UESR,所以我认为人们只能用这个问题来攻击自己,但我仍然想解决它 建议这样做: echo htmlentities($_POST[‘input’], ENT_QUOTES, ‘U

我运行了一个笔测试应用程序,它发现了大量XSS错误,特别是,我犯了通过查询字符串将未经验证的数据回显到浏览器的错误

具体来说,运行它会将javascript放入我的页面。 “[ScRiPt]%20%0a%0d>警报(426177032569)%3B[/ScRiPt]

谢天谢地,我不允许用户将数据保存到数据库并显示回其他UESR,所以我认为人们只能用这个问题来攻击自己,但我仍然想解决它

建议这样做:

echo htmlentities($_POST[‘input’], ENT_QUOTES, ‘UTF-8’);
但目前我需要尽快修复这个问题,然后根据具体情况进行修复。 我在网站的每个页面上都有一个头文件,我知道这是一种糟糕的形式,但如果我这样做了,会有什么后果呢:

array_walk($_POST, 'htmlentities');  
我需要为COOKIE和GET做这件事。我从不使用\u请求


谢谢

在前端盲目转义所有输入将意味着程序中处理该输入的任何部分都必须处理、&等的html转义版本。如果将数据存储在数据库中,则数据库中会有html转义数据。如果在非html上下文中使用数据(如发送电子邮件),人们会看到,而不是盲目地转义前端上的所有输入,这意味着程序中处理该输入的任何部分都必须处理、&等的html转义版本。如果将数据存储在数据库中,则数据库中会有html转义数据。如果在非html上下文中使用该数据(如发送电子邮件),人们会看到上面的代码不起作用,而不是,但这确实起作用:

$_POST = clean_input($_POST);
$_GET = clean_input($_GET);
$_COOKIE = clean_input($_COOKIE);
$_SESSION = clean_input($_SESSION);

function clean_input($array){
    if(count($array)){
        foreach ($array as $key => $value) {
            $array[$key]=htmlentities($value, ENT_QUOTES, 'UTF-8');
        }
    }
    return $array;
}

我只是想弄清楚这里会出什么问题。

上面的代码不起作用,但它确实起作用了:

$_POST = clean_input($_POST);
$_GET = clean_input($_GET);
$_COOKIE = clean_input($_COOKIE);
$_SESSION = clean_input($_SESSION);

function clean_input($array){
    if(count($array)){
        foreach ($array as $key => $value) {
            $array[$key]=htmlentities($value, ENT_QUOTES, 'UTF-8');
        }
    }
    return $array;
}

我只是想弄清楚这里会出什么问题。

我最初的反应是建议您首先确保您的表示逻辑与业务逻辑分开处理,等等

如果表示逻辑确实是独立的,那么您需要评估当前输出到屏幕的方式。您能否通过将所有输出转义到屏幕的相同函数调用来运行每个输出


例如,在实际输出到屏幕时调用clean_output,但在对数据进行数据库操作或业务逻辑操作之前,我不会这样做,因为很可能您会逃避一些本应保持原样的内容。

我最初的反应是建议您首先确保您的表示逻辑与业务逻辑等分开处理

如果表示逻辑确实是独立的,那么您需要评估当前输出到屏幕的方式。您能否通过将所有输出转义到屏幕的相同函数调用来运行每个输出


例如,在实际输出到屏幕时调用clean_output,但在对数据进行数据库操作或业务逻辑操作之前,我不会这样做,因为很可能您会逃逸一些本应保持原样的内容。

HTML在进入过程中逃逸显然是错误的,但可能是临时修复如果你用合适的东西替换代码,那么从长远来看,它将是不可维护的,在你开始进行子字符串操作的任何地方,都会出现大量奇怪的应用程序级错误(包括数据库可能会自动执行的截断)跨&-编码字符。这不太可能导致安全漏洞,尽管你不能不详细查看应用程序就知道

如果每次都在$会话中开始编码,那么很快就会得到像&;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp

我认为人们只能自己动手

或者,另一个网页上的攻击者可以重定向或iframe到您的网页,并注入足够的脚本来显示一个与您的网站类似的假登录框,获取用户名和密码或自动删除他们的帐户。诸如此类。不是很好

建议这样做:echo htmlentities($_POST['input'],ENT _引号,'UTF-8')

不需要htmlspecialchars和所有这些参数-使用htmlspecialchars

您可以使用以下方法节省几次按键:

function h($s) { echo(htmlspecialchars($s)); }
...
<?php h($POST['input']) ?>
函数h($s){echo(htmlspecialchars($s));} ...
这真的没有那么多额外的麻烦。

HTML在进入过程中转义显然是错误的,但可能是暂时的修复,直到你用合适的东西替换代码。从长远来看,这将是无法维护的,而且你在开始执行子字符串操作的任何地方都会出现大量奇怪的应用程序级错误(包括数据库可能会自动执行的截断)跨&-编码字符。这不太可能导致安全漏洞,但如果不详细查看应用程序,就无法判断

如果每次都在$会话中开始编码,那么很快就会得到像&;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp

我认为人们只能自己动手

或者,另一个网页上的攻击者可以重定向或iframe到您的网页,并注入足够的脚本来显示一个与您的网站类似的假登录框,获取用户名和密码或自动删除他们的帐户。诸如此类。不是很好

建议这样做:echo htmlentities($_POST['input'],ENT _引号,'UTF-8')

不需要htmlspecialchars和所有这些参数-使用htmlspecialchars

您可以使用以下方法节省几次按键:

function h($s) { echo(htmlspecialchars($s)); }
...
<?php h($POST['input']) ?>
函数h($s){echo(htmlspecialchars($s));} ...
这真的没有那么多额外的麻烦。

所有这些都有问题吗?所有这些都有问题吗?我认为这并不能回答问题。OP问我们可以做什么