PHP $ _POST&拒绝假表格安全

时间:2011-03-24 08:18:22

标签: php security forms post

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

我清理数据等因此我不会(太)担心XSS或注入式攻击,我只是不希望有人能够,例如,将无意义的东西添加到购物车等等。

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

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

6 个答案:

答案 0 :(得分:6)

答案 1 :(得分:3)

存在一个简单的规则:绝不信任用户输入

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

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

虽然它需要经验并能够识别所有不同的情况,但以下是您应该注意的最常见情况:

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

答案 2 :(得分:2)

在主题中查看@ nettuts tutorial

只需使用之前接受的答案also in the topic更新我的答案。

答案 3 :(得分:2)

你的问题的答案简短而明确:

  

有一种可靠的方法可以确保我的php脚本只能由我网站上托管的表单调用吗?

当然不是。

实际上,您网站上托管的表单不会调用任何脚本。所有脚本都由客户浏览器中托管的表单调用。
知道这将有助于理解此事。

  

无法预测所有案例。

相反,它会 所有好网站都这样做。
尽管如此,没有什么比这更难的了。

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

答案 4 :(得分:-1)

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

如果您使用电子邮件地址,请确保它们是有效的电子邮件地址,并可能在授权交易之前发送带有链接的确认电子邮件。虽然验证电话号码可能很难,但电话号码(文本中的确认码)也是如此。

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

基本上规则确保所有输入都是您期望的。你不会捕捉到所有东西(名字和地址几乎都要接受任何角色),但这应该得到大部分。

我认为没有任何办法可以完全确保它是你的形式。表单中的HTTP Referrer和隐藏字段可能有所帮助,但它们不可靠。您所能做的就是尽可能严格地验证所有内容。

答案 5 :(得分:-3)

只要您相信您的数据清理方式,我就不会发现问题......而且您说您要对其进行消毒。

您确实知道http://php.net/manual/en/function.strip-tags.phphttp://www.php.net/manual/en/function.htmlentities.phphttp://www.php.net/manual/en/filter.examples.validation.php 正确?