0

我有一个要附加到 SQL 语句的变量,但似乎有导致错误的隐藏字符。

我有 $addToInventory 变量,它是一个数字(例如 405,000)。我正在尝试使用以下代码片段来摆脱字符,但是当我回显时,我仍然在数字后面看到 \0\0\0\0 (null)。

$addToInventory= str_replace(",", "", $pieces[1]);
$addToInventory= str_replace("\r", "", $addToInventory);    
$addToInventory= str_replace("\n", "",$addToInventory); 
$addToInventory = preg_replace('/^[\pZ\pC]+|[\pZ\pC]+$/u', '', mysql_real_escape_string($addToInventory));
$sql_query = "UPDATE products set products_quantity = " .$addToInventory."  where products_model like '$code'";

回显 $sql_query 会产生:

UPDATE products set products_quantity = 405000\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 where products_model like '111'. 
4

4 回答 4

7

使用trim(). 它删除 NUL 字节字符。

此函数返回一个字符串,其中从 str 的开头和结尾去除了空格。如果没有第二个参数, trim() 将删除这些字符:

  • " " (ASCII 32 (0x20)),一个普通的空格。
  • "\t" (ASCII 9 (0x09)),一个制表符。
  • "\n" (ASCII 10 (0x0A)),换行(换行)。
  • "\r" (ASCII 13 (0x0D)),回车。
  • “\0”(ASCII 0 (0x00)),NUL 字节。
  • "\x0B" (ASCII 11 (0x0B)),一个垂直制表符。
$addToInventory= str_replace(",", "", $pieces[1]);
$addToInventory= trim($addToInventory); 
于 2013-05-21T13:11:51.487 回答
2

如果要删除字符串周围的所有空白字符,请使用trim().

$addToInventory = trim( $addToInventory );

您当前的代码似乎极易受到 SQL 注入攻击。确保在查询中使用它之前进一步清理$addToInventory或使用PDOmysqli提供的准备好的语句。

于 2013-05-21T13:12:59.820 回答
0

此外,您应该避免构建这样的查询,因为您的应用程序很可能容易发生 SQL 注入,除非您绝对确定 $pieces[1] 变量已被清理。例如,如果攻击者将 $pieces[1] 更改为“'0'; DROP DATABASE something; --”,您的查询将变为:UPDATE products set products_quantity = '0'; 删除数据库的东西;-- products_model 像 'XXX'

...这将有效地破坏您的数据库

确保清理用于构造查询的变量,或者将它们作为参数添加到准备好的语句中。在此处查看有关准备好的陈述的更多信息: http ://en.wikipedia.org/wiki/Prepared_statement

于 2013-05-21T13:18:38.070 回答
-1

在插入数据库之前,您必须使用一些转义函数 n 来防止语句 mysqli_real_escape_string 与修剪函数

于 2013-05-21T13:15:41.800 回答