是否存在一种万能函数,可以很好地为SQL注入和XSS攻击清除用户输入,同时仍然允许某些类型的HTML标记?


当前回答

只是想添加关于输出转义的主题,如果您使用php DOMDocument使您的html输出,它将在正确的上下文中自动转义。属性(value="")和<span>的内部文本不相等。 为了防止XSS,请阅读以下内容: OWASP跨站防御备忘单

其他回答

你从不清理输入。

你总是要清理输出。

你应用到数据的转换,使其能够安全地包含在SQL语句中,完全不同于你在HTML中应用的转换,完全不同于你在Javascript中应用的转换,完全不同于你在LDIF中应用的转换,完全不同于你应用到CSS中的转换,完全不同于你应用到Email....中的转换

务必验证输入——决定您是否应该接受它进行进一步处理,还是告诉用户它是不可接受的。但是不要对数据的表示进行任何更改,直到它离开PHP为止。

很久以前,有人试图发明一种适合所有人的机制来转义数据,我们最终使用了“magic_quotes”,它不能正确地转义所有输出目标的数据,导致不同的安装需要不同的代码才能工作。

PHP过滤器扩展有许多检查外部用户输入所需的功能&它的设计是为了使数据消毒更容易和更快。

PHP过滤器可以轻松地清理和验证外部输入。

没有万能函数,因为有多个关注点需要解决。

SQL注入——如今,一般来说,每个PHP项目都应该通过PHP数据对象(PDO)使用准备好的语句作为最佳实践,以防止错误引用以及针对注入的全功能解决方案。这也是最灵活和安全的方式来访问您的数据库。

检查(唯一正确的)PDO教程几乎所有你需要知道的关于PDO。(衷心感谢顶级SO贡献者@YourCommonSense,为这个主题提供了很棒的资源。)

XSS -消毒数据的方式…

HTML Purifier has been around a long time and is still actively updated. You can use it to sanitize malicious input, while still allowing a generous & configurable whitelist of tags. Works great with many WYSIWYG editors, but it might be heavy for some use cases. In other instances, where we don't want to accept HTML/Javascript at all, I've found this simple function useful (and has passed multiple audits against XSS): /* Prevent XSS input */ function sanitizeXSS () { $_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING); $_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING); $_REQUEST = (array)$_POST + (array)$_GET + (array)$_REQUEST; }

XSS -在输出时消毒数据…除非你保证数据在添加到你的数据库之前被正确地消毒,否则你需要在显示给你的用户之前消毒它,我们可以利用这些有用的PHP函数:

当您调用echo或print来显示用户提供的值时,请使用htmlspecialchars,除非数据已经过适当的安全处理并允许显示HTML。 json_encode是一种从PHP向Javascript提供用户提供值的安全方法

您是否使用exec()或system()函数调用外部shell命令,或使用反勾运算符?如果是这样,除了SQL注入和XSS之外,您可能还需要解决一个额外的问题,即用户在您的服务器上运行恶意命令。如果您想转义整个命令或escapeshellarg来转义单个参数,则需要使用escapeshellcmd。

不。你不能在没有任何上下文的情况下过滤数据。有时你想把SQL查询作为输入,有时你想把HTML作为输入。

您需要筛选白名单上的输入——确保数据符合您所期望的某些规范。然后,您需要在使用它之前对它进行转义,这取决于您使用它的上下文。

为SQL转义数据(防止SQL注入)的过程与为(X)HTML转义数据(防止XSS)的过程非常不同。

你所描述的是两个独立的问题:

消毒/过滤用户输入数据。 转义输出。

1)用户输入应该总是被认为是糟糕的。

使用准备语句,或/和使用mysql_real_escape_string进行过滤绝对是必须的。 PHP还内置了filter_input,这是一个很好的开始。

2)这是一个很大的主题,它取决于输出数据的上下文。对于HTML,有一些解决方案,比如htmlpurifier。 作为经验法则,总是对输出的任何内容进行转义。

这两个问题都太大了,无法在一篇文章中详细讨论,但有很多文章会更详细地介绍:

PHP输出

更安全的PHP输出