SQL Update代码问题/ PHP注入

时间:2014-07-10 17:24:35

标签: php sql sql-server

我的SQL Update脚本出现问题。 它打印“Motto Changed”但不更新行。根据许多教程,我的代码都是正确的。请帮忙

$sql="UPDATE loadout SET motto='".$_POST['motto']."'  WHERE steamid='".$steamid."'";

再次更新:

<?php
   require "../requires/php/steam.php";
 $dbhost  = '**';
 $dbname  = 'battlefield';
 $dbuser  = 'battlefield';
 $dbpass  = '**'; 

$con = mysql_connect($dbhost, $dbuser, $dbpass);

$authserver = bcsub( SteamID(), '76561197960265728' ) & 1;
    $authid = ( bcsub( SteamID(), '76561197960265728' ) - $authserver ) / 2;
$steamid = mysql_real_escape_string("STEAM_0:$authserver:$authid");




$motto = mysql_real_escape_string($_POST['motto']);

mysql_select_db($dbname, $con);


$sql="UPDATE loadout SET motto='{$motto}'  WHERE steamid='{$steamid}'";


if (!mysql_query($sql, $con))
{
   die('Error: ' . mysql_error());
}
echo "Motto Changed";

if (!mysql_query($sql, $con))
{
die('Error: ' . mysql_error());
}
 $n = mysql_affected_rows();
echo"Motto changed on {$n} row(s)";

mysql_close($con)
?>

1 个答案:

答案 0 :(得分:0)

永远不要将$ _POST变量直接插入到SQL字符串中。您不能信任$ _POST变量,它们可能很容易包含修改SQL语法的字符,以及导致SQL注入漏洞的原因。

奇怪的是,您创建了一个转义版本为$motto,然后您永远不会使用它(根据@Arth的评论)。

总是将您插入到SQL中的字符串转义为SQL,即使您认为它们是安全的。&#34;例如,$ steamid只包含您控制的文字文本,以及几个整数。这应该是安全的,但如果其他开发人员明年改变了Steamid的格式呢?如果你逃避它,你就不会出错。

$steamid = mysql_real_escape_string("STEAM_0:$authserver:$authid");

$motto = mysql_real_escape_string($_POST['motto']);

$sql="UPDATE loadout SET motto='{$motto}'  WHERE steamid='{$steamid}'";

当然,最佳做法是使用查询参数。您正在使用PHP不推荐使用的mysql扩展,它不支持查询参数。但我明白,如果您还没有准备好重写大量代码来切换到PDO。如果是,请按照How can I prevent SQL-injection in PHP?

中的示例进行操作

另一个问题:如果您想知道UPDATE是否影响了行,请不要认为它只是因为UPDATE没有返回错误。如果WHERE子句中的条件只与零行匹配,那么这不是错误。如果UPDATE匹配一行,它也不是错误,但座右铭已包含您尝试设置的字符串。

更新后,检查受影响的行数

if (!mysql_query($sql, $con))
{
    die('Error: ' . mysql_error());
}
$n = mysql_affected_rows();
echo "Motto changed on {$n} row(s)";