我所拥有的片段:
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变量
答案 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
使用像
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部分