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

我想将一些数据插入 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&令牌=qwertzuiop

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

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

有帮助吗?

解决方案

您的功能是容易受到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。

其他提示

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

验证

如果你期望 ID 为大于零的整数:

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

如果你期望 代币 是一个字母数字字符串:

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)."')";

使用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')";

您的代码是假设查询成功完成,如果没有出现错误,不断检查。我猜这将是一个语法错误,由于空间。如果你的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!';
  }
}

至少这会告诉你,如果查询确实成功了,什么炸毁了,如果它没有。不要假设任何形式的数据库查询会成功。有太多的方式为它炸毁(服务器死亡,事务死锁,连接池耗尽,磁盘空间,等...),以没有连一些简单的错误如上处理。

您可以使用str_replace函数来删除空格。但是,这不是一个好的做法。 如何网址这样修改?在正常情况下,这是不真实的。 相反,您应该从用户测试所有的输入值(ID必须是整数,令牌不应该含有“'”符号等的检查)。阅读关于SQL的注射剂。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top