首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP:显示信息的最佳安全实践?

PHP:显示信息的最佳安全实践?
EN

Stack Overflow用户
提问于 2010-03-09 21:01:53
回答 4查看 387关注 0票数 7

在PHP中,我知道使用参数化查询是防止SQL注入的最佳方法。

但是,如何清除将用于其他目的的用户输入,如:

  • 显示给用户(潜在的跨站点脚本向量)
  • 寻址电子邮件或填写邮件正文

htmlentities()是净化非数据库使用的最佳方法吗?什么是这里的最佳实践?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-03-09 21:04:11

在php中,最好的xss过滤器是:

代码语言:javascript
复制
htmlspecialchars($_POST['param'],ENT_QUOTES);

您还必须对引号进行编码的原因是,您不需要<>来利用某些xss。例如,这容易受到xss的攻击:

代码语言:javascript
复制
print('<A HREF="http://www.xssed.com/'.htmlspecialchars($_REQUEST[xss]).'">link</a>');

在本例中,您不需要<>来执行javascript,因为您可以使用onmouseover,下面是一个示例攻击:

代码语言:javascript
复制
$_REQUEST[xss]='" onMouseOver="alert(/xss/)"';

ENT_QUOTES处理双引号。

电子邮件有点不同,javascript不应该由邮件客户端执行,如果是,那么您的站点不会因为相同的原产地策略而受到影响。但为了安全起见,我仍然会使用htmlspecialchars($var,ENT_QUOTES);。但是,PHP的mail()函数可能会屈服于另一种类型的漏洞,称为CRLF注入。下面是针对PHP-Nuke的一个示例漏洞。如果您有这样的函数调用:mail($fmail, $subject, $message, $header);,那么您必须确保用户不能将\r\n注入$header。

易受攻击代码:

代码语言:javascript
复制
$header="From: \"$_GET[name]\" <$ymail>\nX-Mailer: PHP";

修补:

代码语言:javascript
复制
$_GET[name]=str_replace(array("\r","\n"),$_GET[name]);
$header="From: \"$_GET[name]\" <$ymail>\nX-Mailer: PHP";
票数 5
EN

Stack Overflow用户

发布于 2010-03-09 21:22:45

您也可能希望签出HTML净化器,这将剥离任何危险的HTML,并留下安全的输入。您还可以就允许/不允许哪些HTML创建自己的规则。

http://htmlpurifier.org/

票数 2
EN

Stack Overflow用户

发布于 2010-03-09 21:12:53

那么,您可以首先为某些字段创建规则,比如电子邮件,它只应该由字母、数字组成,@(符号)?和一个句点,所以您不能在其中形成XSS,因此不需要使用htmlentities()htmlspeicalchars()来浪费资源。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2412532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档