使用$ _GET&$ _POST

Hum*_*ton 3 php sql-injection

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

我有一个菜单项,作为URL的一部分传递事件ID#.在我的特定情况下,它将用户带到该事件的信息页面.然后有一个按钮,让他们注册参加活动.点击它们并注册参加活动并返回到相同的信息页面,现在它们已经注册并让他们看到一些额外的东西.

当他们第一次点击页面时,我使用$ _GET来计算事件ID#,如果他们点击注册按钮作为隐藏输入字段,则将其传递回页面.但这次我需要使用$ _POST来计算事件ID#.所以我的查询中的代码有一个布尔部分,看起来像

SELECT stuff FROM ... WHERE eventID = ($_GET["ID"] ? $_GET["ID"] : $_POST["ID"])
Run Code Online (Sandbox Code Playgroud)

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

hbw*_*hbw 8

  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']);
Run Code Online (Sandbox Code Playgroud)

此外,正如outis所指出的,请记住,您可以选择使用预准备语句而不仅仅是原始SQL查询.

* - 正如Stewart在评论中提到的那样,可以通过variables_order配置指令配置排序.

  • 消毒的现代替代方法是使用预先准备好的声明:http://us2.php.net/manual/en/pdo.prepared-statements.php (6认同)
  • $ _REQUEST还会掩盖$ _COOKIE,这可能是你不想发生的事情. (2认同)