首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高效清理用户输入的文本

高效清理用户输入的文本
EN

Stack Overflow用户
提问于 2011-11-17 18:20:43
回答 3查看 3.7K关注 0票数 7

我有一个html表单,接受用户输入的大小约为1000的文本,并提交到一个php页面,它将被存储在mysql数据库中。我将PDO与预准备语句一起使用,以防止sql注入。但是,要净化用户输入的文本,需要做的最好的努力是什么?

我想防止任何脚本注入,xss攻击,等等。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-17 23:25:43

安全性是一个有趣的概念,吸引了很多人。不幸的是,这是一个复杂的主题,即使是专业人士也会弄错。我发现谷歌( Google )、Facebook (更像是CSRF)、几家大型在线零售商(主要是SQL injection / XSS)以及数以千计的小型企业和个人网站都存在安全漏洞。

以下是我的建议:

1)使用参数化查询

参数化查询强制将传递给查询的值视为单独的数据,因此DBMS无法将输入值解析为SQL代码。许多人会建议您使用mysql_real_escape_string()转义字符串,但与流行的想法相反,它是而不是是SQL注入的万能解决方案。以下面的查询为例:

代码语言:javascript
复制
SELECT * FROM users WHERE userID = $_GET['userid']

如果$_GET['userid']设置为1 OR 1=1,则不会有特殊字符,也不会对其进行过滤。这将导致返回所有行。或者,更糟糕的是,如果它被设置为1 OR is_admin = 1怎么办

参数化查询可以防止这种注入的发生。

2)验证您的输入

参数化查询很棒,但有时意外的值可能会导致代码出现问题。确保您正在验证它们在范围内,并且它们不允许当前用户更改他们不应该能够更改的内容。

例如,您可能有一个密码更改窗体,该窗体向更改其密码的脚本发送POST请求。如果您将他们的用户ID作为隐藏变量放在表单中,他们可能会更改它。发送id=123而不是id=321可能意味着他们更改了其他人的密码。确保所有内容都经过了正确的验证,包括类型、范围和访问权限。

3)使用htmlspecialchars转义显示的用户输入

假设你的用户输入他们的“关于我”,如下所示:

</div><script>document.alert('hello!');</script><div>

这样做的问题是,您的输出将包含用户输入的标记。试图自己用黑名单来过滤它是一个糟糕的想法。使用htmlspecialchars过滤掉字符串,这样HTML标签就会转换成HTML实体。

4)请勿使用$_REQUEST

跨站点请求伪造(CSRF)攻击的工作方式是让用户单击一个链接或访问一个URL,该URL表示在他们登录的站点上执行操作的脚本。$_REQUEST变量是$_GET$_POST$_COOKIE的组合,这意味着您无法区分在POST请求中发送的变量(即通过表单中的input标签发送的变量)和作为GET的一部分在URL中设置的变量(例如page.php?id=1)。

假设用户想要向某人发送一条私人消息。它们可能会向sendmessage.php发送POST请求,参数为tosubjectmessage。现在假设有人发送了一个GET请求:

代码语言:javascript
复制
sendmessage.php?to=someone&subject=SPAM&message=VIAGRA!

如果您使用的是$_POST,您将看不到这些参数中的任何一个,因为它们是在$_GET中设置的。您的代码将看不到$_POST['to']或任何其他变量,因此它不会发送消息。但是,如果您使用的是$_REQUEST$_GET$_POST就会粘连在一起,所以攻击者可以将这些参数设置为URL的一部分。当用户访问该URL时,他们会无意中发送消息。真正令人担忧的是,用户不需要做任何事情。如果攻击者创建了一个恶意页面,它可能包含指向该iframe的URL。示例:

代码语言:javascript
复制
<iframe src="http://yoursite.com/sendmessage.php?to=someone&subject=SPAM&message=VIAGRA!">
</iframe>

这导致用户在没有意识到他们做了什么的情况下向人们发送消息。因此,您应该避免使用$_REQUEST,而使用$_POST$_GET

5)把你得到的任何东西都当做可疑的(甚至恶意的)

您不知道用户发送给您的是什么。这可能是合法的。这可能是一次袭击。永远不要相信用户发给你的任何东西。转换为正确的类型,验证输入,在必要的地方使用白名单进行过滤(避免黑名单)。这包括通过$_GET$_POST$_COOKIE$_FILES发送的任何内容。

如果你遵循这些指导原则,你在安全性方面就处于一个合理的地位。

票数 8
EN

Stack Overflow用户

发布于 2011-11-17 18:39:01

您需要区分两种类型的攻击: SQL注入和XSS。SQL注入可以通过使用准备好的语句或DB库的引用函数来避免。在插入到数据库之前,可以使用quoting函数。

可以通过用htmlspecialchars将所有特殊字符引起来来避免使用XSS。在从数据库中读取输出并将原始输入存储在数据库中之后,对输出进行转义被认为是一种很好的方式。这样,当您在不需要HTML转义的其他上下文(文本、电子邮件、JSON编码字符串)中使用输入时,仍然可以使用来自用户的原始输入。

另请参阅this answer来回答类似的问题。

票数 4
EN

Stack Overflow用户

发布于 2011-11-17 18:24:32

为了安全,你需要做两件简单的事情:

使用预准备语句或转义数据correctly.

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

https://stackoverflow.com/questions/8165500

复制
相关文章

相似问题

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