PHP $ _GET ['变量'] Echos但不会在$查询中进行评估

时间:2014-11-18 22:11:54

标签: php mysql

我所拥有的片段:

echo $_GET['tournamententryid'].'<br/>';

以上行将正确显示:32

在上面的线下面,我有:

if (isset($_POST['submit']))
{
    $query='UPDATE tbl_tournamententry set score='.$_POST['score'].' WHERE id='.$_GET['tournamententryid'];
    echo $query;
}

&#39; echo $ query&#39;的输出从上面的结果来看:

UPDATE tbl_tournamententry set score=876 WHERE id=

我无法理解为什么$ query变量不包含。 。 .ID = 32。我试图连接在一起的$ query应该是:

UPDATE tbl_tournamententry set score=876 WHERE id=32

我错过了什么?

更多信息: 接收页面URL是:     http://example.com/test/submitascore.php?tournamententryid=32&gamename=Creature+From+the+Black+Lagoon

该网址是&#39; get&#39;我的$ _GET [&#39; tournamententryid&#39;]值为32(并且正确回声)来自。 $ _POST收到用户输入的分数。因此,第1页允许用户选择&#39; tournamententryid&#39;这是submitascore.php页面的href。 submitascore.php URL包含$ _GET变量

2 个答案:

答案 0 :(得分:2)

这是一种可怕的做法。在将变量注入SQL之前,请先查看清理变量。

以下代码容易受到SQL注入(攻击)

的攻击
if (isset($_POST['submit'])) {
    $query='UPDATE tbl_tournamententry set score='.$_POST['score'].' WHERE id='.$_GET['tournamententryid'];
    echo $query;
}

了解PDO&amp;确保您没有使用过时的PHP版本

PDO示例

首先连接到您的数据库,如此

$database = "mydatabase";
$username = "myusername";
$password = "mypassword";

$PDO = new PDO('mysql:host=localhost;dbname='.$database, $username, $password);

然后

$sql = $PDO->prepare('UPDATE tbl_tournamententry set score=:score WHERE id=:id');
$sql->execute(array(
    ":score" => $_POST['score'],
    ":id" => $_GET['tournamententryid'],
);

使用预准备语句,您的变量将被清理以防止SQL注入。 通过将变量直接放入用户可以控制的SQL中,任何人都可以放置任何内容。 SQL与PHP分开。

例如,如果用户将$_GET['id']设置为'' or 1=1 使用像

这样的SQL语句

SELECT * FROM users WHERE username=$_GET['id']

那么它将是SELECT * FROM users WHERE id='' or 1=1 SQL具有数学能力,因此1等于1并且总是如此。

用更简单的术语来说,这意味着IF 1=1 LIST ALL USERS

此外,您正在使用$ _POST和$ _GET

$ _ GET来自URL,例如

http://example.com/?tournamententryid=1

$_GET['tournamententryid']将能够访问上述网址中的内容。这被称为GET方法。

然而,$_POST['tournamententryid']是通过POST方法发送的另一个变量。它们服务于不同目的。您可能需要$_POST['tournamententryid']

答案 1 :(得分:2)

我理解这个问题:

当页面加载时,URL正确包含GET tournamententryid变量,并且$ _GET [&#39; tournamententryid&#39;]可用。

该页面包含一个表单方法=&#34; post&#34;它调用自身,因此当用户单击提交按钮时,URL将从以下位置重写:

http://example.com/test/submitascore.php?tournamententryid=32&gamename=Creature+From+the+Black+Lagoon

http://example.com/test/submitascore.php

从而完全删除$ _GET变量。感谢大家的大脑锻炼!

解决方案:在表单方法=&#34; post&#34;中,将$ _GET [&#39; tournamententryid&#39;]的值存储在输入=&#34;隐藏&#34; value = $ _ GET [&#39; tournamententryid&#39;]用于POST部分