PHP $ _GET安全性,$ _POST安全性最佳实践

时间:2012-03-31 13:12:57

标签: php security variables post get

这是一个很好的主题,但我想在几种不同的情况下对使用用户变量数据的方法进行一些确认。

  1. 该变量从不在数据库中使用,从不存储,仅在用户的屏幕上显示。使用哪个函数来确保没有html或javascript可以搞砸了?

  2. 该变量被带入数据库,并在SQL查询中使用。

  3. 变量同时执行。

  4. 目前我是xss_clean和strip_tags。我一直都是这样做的,只是通过自动驾驶仪。有更好的技术吗?如果有相同的问题,请道歉。我有点假设有,虽然我找不到一个如此彻底。

    干杯。

4 个答案:

答案 0 :(得分:4)

  1. 在输出时使用适当的功能,在HTML上下文中,这是htmlspecialchars
  2. 使用预备陈述
  3. 请参阅1.和2. - 取决于您是在显示变量还是在查询中使用它。

答案 1 :(得分:2)

对PHP人员最不相信的一点是$ _GET或$ _POST与安全性有关。

重要的不是来源而是目的地!

  • 如果必须处理数据库,则无论数据是来自$ _POST,SOAP请求还是数据库,规则始终都是相同的。它必须始终相同:数据的占位符,其他所有内容的白名单。
  • 如果必须将某些数据输出到浏览器中,无论数据是来自$ _POST,SOAP请求还是数据库,都必须正确地准备它。
  • 如果您必须阅读文件 - 您必须确保文件名,无论它来自何处。

答案 2 :(得分:-1)

  1. 在第一种情况下,htmlspecialchars()可能是最佳选择,允许用户使用所有字符,如&lt ;,>,&等等。
  2. 在第二种情况下,您需要使用一些数据库转义函数,如mysql_real_escape_string或使用PDO或mysqli的预准备语句。准备好的语句是这里的最佳选择,但如果你只熟悉mysql,那么mysql_real_escape_string也能正常工作。如果你没有使用mysql,那么在大多数SQL API中都有类似的功能。
  3. 在第三种情况下,两者都是分开的,给你两个不同的结果,一个用于输出,一个用于数据库。
  4. 参考文献:

    http://php.net/manual/en/function.htmlspecialchars.php

    http://php.net/manual/en/function.mysql-real-escape-string.php

    http://php.net/manual/en/book.pdo.php

    http://php.net/manual/en/book.mysqli.php

答案 3 :(得分:-1)

$id="1;drop table users;"; $id=mysql_real_escape_string($id); $sql="SELECT * FROM table

WHERE id=$id";