0

抱歉没有格式化我的代码。工具栏不见了……

我想将一些数据插入到 mysql 数据库中。我在php中写了一个函数:

function add_ID($ID, $token)  {
 $add = "INSERT INTO ids (ID, token) VALUES ('$ID', '$token')";
 mysql_query($add);
 echo 'added successfully';
}  
if(isset($_GET['addDeviceID'])) {
 add_ID($_GET['ID'], $_GET['token']);
}

在我的 Browswe 的 URL 字段中,我正在调用这样的函数: http ://www.justanexample.com/example.php?ID=123123123&token=qwertzuiop

这样可行。

如果我在其中一个参数中添加一个空格,例如: http ://www.justanexample.com/example.php?ID=123123 123&token=qwertzuiop

我的 mysql 数据库中没有添加任何内容。

得到一些帮助会很棒:)谢谢!

4

5 回答 5

2

您应该在将输入发送到数据库之前对其进行验证。或者,如果无法验证,则过滤和/或转义该值。

验证

如果您希望ID是大于零的整数:

if (!ctype_digit($ID)) {
    // invalid ID
}

如果您希望token是字母数字字符串:

if (!ctype_alnum($token)) {
    // invalid token
}

过滤

过滤正在删除输入的无效部分,使其变为有效:

if (!ctype_digit($ID)) {
    $ID = preg_replace('/\D+/', '', $ID);
    // $ID does now only contain digits
}
if (!ctype_alnum($token)) {
    $token = preg_replace('/\D+/', '', $token);
    // $token does now only contain alphanumeric characters
}

逃跑

转义是替换特定上下文的元字符,某些字符串将被放置在其中。对于 MySQL 查询,您应该使用一个函数来转义 MySQL 中上下文字符串声明的元字符。PHP 具有用于此目的的mysql_real_escape_string功能:

$add = "INSERT INTO ids (ID, token) VALUES ('".mysql_real_escape_string($ID)."', '".mysql_real_escape_string($token)."')";
于 2010-02-15T11:25:10.763 回答
0

使用函数从它们中删除空间,str_replace例如:

 $ID = str_replace(' ', '', $ID);
 $token= str_replace(' ', '', $token);

 $add = "INSERT INTO ids (ID, token) VALUES ('$ID', '$token')";

另外,我怀疑您的 $ID 是表中的整数字段,因此您可以在不指定引号的情况下运行查询,例如:

 $add = "INSERT INTO ids (ID, token) VALUES ($ID, '$token')";
于 2010-02-15T11:19:07.107 回答
0

您的函数容易受到 SQL 注入的攻击。您应该在 SQL 查询中使用它们之前验证所有用户接收的参数,并通过 传递任何字符串mysql_real_escape_string,因为这样我就可以传递类似的东西example.php?token='; DROP DATABASE;并彻底搞砸您的应用程序。

在您的情况下,您应该首先检查接收到的参数是否符合您的预期,如果没有,则向用户返回错误,然后才将它们传递给 SQL 查询。

function add_ID($ID, $token)  {
  $id = mysql_real_escape_string($id);
  $token = mysql_real_escape_string($token);

  $add = "INSERT INTO ids (ID, token) VALUES ('$ID', '$token')";
  mysql_query($add);
  echo 'added successfully';
}  

if(isset($_GET['addDeviceID'])) {
  $id    = isset($_GET['id']) ? $_GET['id'] : 0; // in case no ID has been passed in
  $token = isset($_GET['token']) ? $_GET['token'] : '';

  if (!is_numeric($id) {
    die('ID is not a number');
  } 

  // validate token here as well

  add_ID($id, $token);
}

您还应该研究参数化查询,与仅使用字符串连接相比,这是一种使用参数进行 SQL 查询的整体更好的方法。为此,请考虑使用 mysqli 扩展而不是 mysql,或者更高级别的 PDO。

于 2010-02-15T11:28:27.563 回答
0

您的代码假设查询成功完成,而无需检查是否有错误。我猜这将是由于空格导致的语法错误。如果你的 ID 字段是整数类型,那么ID=123 123会出现语法错误。包括其他答案中的所有 SQL 注入和数据清理建议,您应该重写 add_ID 函数,如下所示:

function add_ID($ID, $token) {
  $query = 'blah blah blah';
  mysql_query($query);
  if (mysql_error()) {
       echo 'ruhroh, someone set us up the bomb: ', mysql_error();
  } else {
       echo 'woohoo, it worked!';
  }
}

至少这会告诉你查询是否真的成功了,如果没有成功,会发生什么。永远不要假设任何类型的数据库查询都会成功。有太多的方式让它崩溃(服务器死机、事务死锁、连接池耗尽、磁盘空间不足等),甚至没有像上面那样简单的错误处理。

于 2010-02-15T18:40:55.660 回答
-1

您可以使用 str_replace 删除空格。但这不是一个好习惯。如何修改 URL?在正常情况下,这是不真实的。相反,您应该测试来自用户的所有输入值(ID 必须是整数,Token 不应包含“'”符号和其他检查)。阅读有关 sql 注入的信息。

于 2010-02-15T11:26:05.210 回答