很多空格进入数据库.... (PHP, Mysql)

Lot's of blank spaces getting into database.... (PHP, Mysql)

美好的一天, 首先,我是一个 I.T 开始接触编码的人,所以请保持温柔 ^^。

所以目前我正在构建一个脚本,它接收输入 (Nexmo) 并将其发送到我的数据库。

遗憾的是,我的数据库中似乎充满了很多空白。出于某种原因,我似乎无法过滤掉这些空值?

有人愿意帮忙吗? 谢谢! 这是代码

require('db.php');
if (!$connect) {
    die('Could not connect: ' .mysql_error());
}
$sql = "INSERT INTO `INCOMING` (`TO`, `TEXT` , `FROM`, `MESSAGEID`) VALUES ('$_GET[to]','$_GET[text]' ,'$_GET[msisdn]' , '$_GET[messageId]')";
if (!mysql_query($sql)){
    die('Error: ' . mysql_error());
}
else  {

    echo "TO";
}


mysql_close();

欢迎使用 Whosebug 编程!

首先,我知道你正在学习,但我会努力帮助你。你从书本或教程中养成了坏习惯,我不会让你学习的。

SQL注入是#1 vulnerability on OWASP。通过将请求中的数据(即 $_GET)直接插入到 SQL 查询中,您暴露了此漏洞。至少,在与查询集成之前先转义数据

$to = mysql_real_escape_string($_GET['to']);
$text = mysql_real_escape_string($_GET['text']);
$msisdn = mysql_real_escape_string($_GET['msisdn']);
$messageId = mysql_real_escape_string($_GET['messageId']);

$sql = "INSERT INTO `INCOMING` (`TO`, `TEXT` , `FROM`, `MESSAGEID`) VALUES ('$to','$text' ,'$msisdn' , '$messageId')";

我知道这看起来需要更多的工作,但是 好的编程并不是为了节省您自己的击键次数。 话虽如此,您最好还是切换到 PDO and using parameterized queries. Besides, the mysql_* family of functions are deprecated

现在 - 关于您的实际问题。所有传入的数据都需要进行验证并经常进行过滤,以匹配应用程序的业务规则。例如,如果您希望所有这些字段都至少有一个非空白字符,则需要强制执行。从上面构建代码段:

function filterInput($value)
{
    // Trim all leading/trailing whitespace and newlines
    return preg_replace('/^[\s\r\n]+|[\s\r\n]+$/', $value);
}

function validateInput($value)
{
    if (NULL === $value || '' === $value) {
        return false;
    }

    return true;
}

// Filter input per your business rules
$to = filterInput($_GET['to']);
$text = filterInput($_GET['text']);
$msisdn = filterInput($_GET['msisdn']);
$messageId = filterInput($_GET['messageId']);

// Now verify they all have real values
if (validateInput($to) && validateInput($text) && validateInput($msisdn) && validateInput($messageId)) {
    // Now escape for SQL
    $to = mysql_real_escape_string($to);
    $text = mysql_real_escape_string($text);
    $msisdn = mysql_real_escape_string($msisdn);
    $messageId = mysql_real_escape_string($messageId);

    // Proceed with INSERT
}

再一次,我确定您在想 "holy cow that looks like a lot of work" 因为我拿了您的一行代码并将其变成了 20 行,但这是编程的一部分。这也是为什么人们花费大量时间编写库和框架来抽象出大量此类 "grunt work" 代码的原因。

编码愉快!

为确保不向数据库发送空格,您可以替换

$sql = "INSERT INTO `INCOMING` (`TO`, `TEXT` , `FROM`, `MESSAGEID`) 
   VALUES ('$_GET[to]','$_GET[text]' ,'$_GET[msisdn]' , '$_GET[messageId]')";

if( !empty($_GET['to']) and !empty($_GET['text']) and !empty($_GET['msisdn']) and !empty($_GET['messageId']) ) {
  $sql = sprintf("INSERT INTO `INCOMING` (`TO`, `TEXT` , `FROM`, `MESSAGEID`) 
    VALUES ('%s','%s' ,'%s' , '%s')", 
    trim($_GET['to']), trim($_GET['text']), 
    trim($_GET['msisdn']), trim($_GET['messageId']));
}

这样,您将在插入之前删除前导和尾随空格、换行符和其他不可打印的字符 并且 只有在您拥有所有内容时才会执行插入信息。

除此之外,唯一要确保的是您的列不是 CHAR 类型,因为这会导致您从代码中发送的内容出现空白。

我还建议不要将信息从浏览器 (GET) 直接发送到数据库,因为这可能会导致一些严重的安全问题。