2011-03-24 79 views
1

我目前正在编写一个使用表单和PHP $ _POST数据的Web应用程序(迄今为止这么标准!:))。然而,(这可能是一个noob查询)我刚刚意识到,理论上,如果有人用假表单将HTML文件放在他们的计算机上,请将该操作作为我网站上使用的脚本之一并用他们自己的随机数据填充这个表单,他们不能将这些数据提交到表单中并导致问题吗?

我清理数据等,所以我不(太)担心XSS或注入式攻击,我只是不希望有人能够,例如,胡说八道的东西添加到购物车等等等等

现在,我意识到对于一些可以写入保护的脚本,例如只允许将东西放入可在数据库中找到的购物车中,但可能会出现某些情况,无法预测所有情况。

所以,我的问题是 - 是否有一个可靠的方法来确保我的PHP脚本只能通过托管在我的网站上的窗体调用?也许有些Http Referrer会检查脚本本身,但我听说这可能不可靠,或者可能是一些htaccess voodoo?这看起来像一个太大的安全漏洞(特别是像客户评论或任何客户输入的东西)只是开放。任何想法将非常感激。 :) 再次感谢!

+0

你必须添加某种独特的令牌到你的表单。 – kapa 2011-03-24 08:24:40

回答

2

看看@nettuts tutorial的话题。

只需更新我的答案以前接受的答案also in the topic

+0

尽管表单键是防止XSS帖子的有效方法,但他们对专门伪造的请求不做任何处理,我相信这是这里的主要问题。 (不要贬低XSS保护的重要性,特别是在购物应用程序中) – Riimu 2011-03-24 08:45:19

+0

@Rinuwise:对不起,这是我的错,因为我没有再读整个教程(我还记得它触及引用者的东西) – fabrik 2011-03-24 08:51:57

-3

我没有看到这个问题,只要你相信你的消毒数据的方式...你说你清理它。

你知道的关于http://php.net/manual/en/function.strip-tags.php,http://www.php.net/manual/en/function.htmlentities.phphttp://www.php.net/manual/en/filter.examples.validation.php 对不对?

+1

Thanks all!@分形R - 非常感谢,我会检查一下。 @fabrik,谢谢,我今天早上读这个。 @Rinuwise - 谢谢,我确保我清理所有数据,但主要是我担心的伪造请求。 @Quamis谢谢你,我现在只是在处理纯数据,而不是危险的用户输入。 @ Col. Shrapnel - 啊,当然是关于浏览器托管的形式(我),谢谢指出。至于预测所有情况,我可以验证存储在数据库中的数据,但我不确定是否有人添加无稽之谈的用户详细信息与有效的产品纯粹的恶作剧。 – flukeflume 2011-03-24 09:56:16

+0

@ user674512你只是不会处理任何不属于你的数据库结构的东西,对吧?注意,一次回答所有人都不是个好主意。 – 2011-03-24 13:17:38

+0

@Col。弹片 - 哎呀,对不起,我是堆栈溢出的新手,未来我会分解它们。但是,不,我不是那个意思,只是处理这些数据会更容易;我打算把其他东西的地方在DB晶格结构 – flukeflume 2011-03-24 16:57:13

3

存在一个简单的规则:永远不要相信用户输入

所有的用户输入,不管是什么情况,都必须由服务器验证。伪造的POST请求是执行SQL注入攻击或其他类似攻击的标准方式。你不能相信引用者标题,因为这可能是伪造的。请求中的任何数据都可以伪造。无法确保数据已从安全来源提交,如您自己的表格,因为任何和所有可能的检查都需要用户提交的数据,这些数据可能是伪造的。

保护自己的唯一方法是清理所有用户输入。只接受可接受的值。如果一个值(如ID)引用数据库实体,请确保它存在。永远不要将未经验证的用户输入插入到查询中,等等。

虽然它需要经验和认识各种不同的情况下,这里是最常见的情况下,你应该尽量注意:

  1. 切勿将原始用户输入查询。要么使用诸如mysql_real_escape_string()之类的函数来逃避它们,要么更好地使用通过API(如PDO)准备好的查询。在查询中使用原始用户输入可能导致SQL注入。
  2. 切勿将用户输入的数据直接输出到浏览器。始终通过像htmlentities()这样的函数来传递它。即使数据来自数据库,您也不应该相信它,因为所有数据的原始来源通常来自用户。不小心向用户输出数据可能导致XSS攻击。
  3. 如果任何用户提交的数据必须属于一组有限的值,请确保它有。例如,确保用户提交的任何ID存在于数据库中。如果用户必须从下拉列表中选择值,请确保所选值是可能的选择之一。
  4. 任何和所有输入验证,例如用户名中允许的字母,必须在服务器端完成。客户端上的任何表单验证,例如javascript检查,仅仅是为了方便用户。他们不会为您提供任何数据安全性。
2

的回答你的问题是短暂的,毫不含糊:

有确保我的PHP脚本只能通过托管在我的网站形式被称为一种可靠的方法?

当然不是。

事实上,没有脚本由您网站上托管的形式调用。由客户浏览器托管的表单调用的所有脚本。
知道这将有助于理解此事。

它不可能预测所有情况。

相反,它会。
这样做的所有好网站。
虽然没有什么难的。

每个表单包含的参数数量有限。你只需要检查每个参数 - 就这些。

-1

正如你所说,确保在数据库中存在的产品是一个良好的开端。如果您使用邮政编码或邮政编码获取地址信息,请确保它对提供的城市有效。让国家和城市下降,并检查该城市是否适合所提供的国家。

如果你把电子邮件地址,确保它们是有效的电子邮件地址,也许发送确认电子邮件的链接交易被授权之前。电话号码相同(文本中的确认码),但验证电话号码可能很困难。

永远不要存储信用卡或付款详情如果可以避免的话(我倾向于认为只有极少数情况需要存储详细信息)。

基本上规则是确保所有的输入是你期望他们是。你不会去捕捉所有的东西(名字和地址必须接受几乎任何角色),但这应该可以获得大部分。

我不认为有完全保证,这是你的形式,他们都来自什么办法。您的表单中的HTTP Referrer和可能隐藏的字段可能有帮助,但它们不可靠。你所能做的就是尽可能严格地验证一切。

+0

逃逸不是主要的,也没有防守可言 – 2011-03-24 09:45:08

+0

在安全方面,它是至关重要的,虽然不是什么OP再次询问 – Belinda 2011-03-24 09:47:51

+1

不存在的数据:逃逸(至少SQL相关一个)在安全性方面没有意义。 – 2011-03-24 09:49:47