php - 使用 $_GET 和 $_POST

标签 php sql-injection

也许我从一开始就做错了,如果是这样我也会改正...

我有一个菜单项,它作为 URL 的一部分传递事件 ID#。在我的特定情况下,它将用户带到该事件的信息页面。然后有一个按钮可以让他们注册参加事件。单击,他们已注册参加事件,然后返回到同一信息页面,该页面现在显示他们已注册并让他们看到一些额外的内容。

他们第一次访问该页面时,我使用 $_GET 来计算事件 ID#,如果他们单击作为隐藏输入字段的注册按钮,该事件 ID# 就会传回页面。但这次我需要使用 $_POST 来计算事件 ID#。所以我查询中的代码有一个 bool 部分,看起来像

SELECT stuff FROM ... WHERE eventID = ($_GET["ID"] ? $_GET["ID"] : $_POST["ID"])

它有效,但感觉它可以做得更好......

最佳答案

  1. 清理您的数据库输入。 mysql_real_escape_string()是实现此目的的一种快速简便的方法(或者,如果 ID 始终是数字,您可以只使用 intval() )。不要像爱上的学校一样Bobby Tables .
  2. 如果您不确定使用了哪种请求方法,请使用 $_REQUEST 超全局变量,它包含 GET 和 POST 变量(例如:$_REQUEST['ID' ])。我通常不使用 $_REQUEST,因为我想清楚我的数据来自何处,但这是使用它的完美情况。

正如 Nick Presta 指出的那样,$_REQUEST 还包括 cookie 变量,事实上,名称冲突的默认*优先顺序是 $_COOKIE$_POST,然后是 $_GET。鉴于此,在将数据插入查询之前,您可以执行您现在正在执行的操作,或者改用 $_SERVER['REQUEST_METHOD']:

// You can use mysql_real_escape_string() instead if you want
$id = ($_SERVER['REQUEST_METHOD'] == 'POST') ? intval($_POST['id']) : intval($_GET['id']);

此外,如前所述,请记住您可以选择使用 prepared statements而不仅仅是原始 SQL 查询。

* — 顺序是 configurable通过 variables_order 配置指令,正如 Stewart 在评论中提到的那样。

关于php - 使用 $_GET 和 $_POST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1252448/

相关文章:

javascript - Json 调用无法解释 Jquery 移动应用程序中的 PHP 变量

spring-mvc - 使用 Spring MVC 框架清理用户输入

java - 使用 JTOpen 连接到 AS/400 时存在 SQL 注入(inject)风险

php - SQL 注入(inject)检测 - 已编译正则表达式......寻找测试注入(inject)

PHP替换数组中的字符

php - PDO 选择具有未知列的查询?

ruby-on-rails-4 - Rails 4 - 在 SQL 查询中使用 LIKE 运算符防止 SQL 注入(inject)

php - 为什么我的查询不起作用?

PHP 数组转 Json 对象

PHP 断开和 mysql 连接