Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有必要将用户提交的数据转义为HTML输入值?_Html_Mysql_Input_Xss - Fatal编程技术网

是否有必要将用户提交的数据转义为HTML输入值?

是否有必要将用户提交的数据转义为HTML输入值?,html,mysql,input,xss,Html,Mysql,Input,Xss,假设您从用户输入中获取一个字符串并存储到数据库中。稍后检索该字符串并用该字符串填充新表单输入的值。在没有任何消毒的情况下是否存在XSS危险?如果是,对原始输入的干扰最小的最佳方法是什么 $str = $_POST['string']; // INSERT $str INTO MYSQL // LATER $string = // database fetched string <input type="text" name="data" value

假设您从用户输入中获取一个字符串并存储到数据库中。稍后检索该字符串并用该字符串填充新表单输入的值。在没有任何消毒的情况下是否存在XSS危险?如果是,对原始输入的干扰最小的最佳方法是什么

$str = $_POST['string'];
// INSERT $str INTO MYSQL

// LATER
$string = // database fetched string
<input type="text" name="data" value="<?= $string ?>" /> // << XSS vulnerable?
$str=$\u POST['string'];
//在MYSQL中插入$str
//后来
$string=//数据库获取的字符串

如果
$string
是:

foo"/><script type="javascript">...something malicious...</script>
foo”/>…恶意的东西。。。
这是一个XSS漏洞

通过防止XSS的常用方法修复它:


另请参见

对于web开发人员来说,这是一件比较常见的事情,大多数开发人员要么使用内置数据验证,要么使用Javascript编写自己的验证,要么使用服务器端验证,但我认为JS更受欢迎。很好,你也在考虑所有这些,@BryanBergo你绝对不应该编写自己的验证/转义/encoding函数。在安全性方面,你绝对应该使用经过战斗测试的工具。你绝对不应该只依赖客户端验证。人们可以禁用JS,但仍然提交表单,或者完全绕过客户端,使用
curl
等工具直接发布到服务器端脚本。@customcommander说得好关于curl,尽管您不能将certian http头分配为只允许来自授权域的请求,这样可以保护您免受基于curl的攻击吗?@BryanBergo也许,但我认为这些攻击也可能是伪造的。我的观点是,安全性不是服务器对客户端的责任:您应该为方便起见进行客户端验证(为您节省往返服务器的时间)并可能作为一线安全门,但它不能成为故事的结尾。必须在服务器上再次验证数据。同样,从服务器返回的内容并不意味着它可以信任;默认情况下,您的客户机不能承担安全性。我是否应该使用htmlspecialchars_decode()在更新mysql数据之前返回输入。我看过的许多网站都建议存储原始用户输入。我遇到电子邮件无法正确显示编码字符的问题,它们显示的是代码而不是表示的字符。除非输出到html,否则不要对html特殊字符进行编码。如果电子邮件是rich html格式的电子邮件,请对这些字符进行编码。如果电子邮件是纯文本,请不要这样做。有些电子邮件是多部分的,因此它们包括纯文本和html格式。因此,您可以在电子邮件的一部分编码htmlspecialchars,但不在纯文本部分编码。并在数据库中存储原始用户输入。不要存储html编码的实体,只存储原始文本。在显示它时,将编码作为最后一步。原因是,这为您提供了灵活性--有时数据库中的文本将以html输出形式显示,有时它将是纯文本。因此,如果我预先填充已编码的输入值,我应该在将编辑内容放回数据库之前对其进行解码,然后更正t?为什么要对输入进行编码?不,只是不要对输入进行编码。将输入作为纯文本,以纯文本形式存储在数据库中,以纯文本形式从数据库中获取。仅当该内容将以html输出形式呈现时,才在输出时对其进行编码。