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

时间:2015-08-31 13:04:08

标签: php mysql null

美好的一天, 首先,我是一个开始编码的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();

2 个答案:

答案 0 :(得分:0)

欢迎使用StackOverflow 进行编程!

首先,我知道你正在学习,但我会很难帮助你。你从书本或教程中养成了一个坏习惯,我不会让你学习它。

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并使用参数化查询。此外,mysql_*系列函数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
}

再一次,我确信你在想“看起来像很多工作的圣牛”,因为我把你的代码中的一行变成了20,但这是编程交易的一部分。这也是人们花费大量时间编写库和框架来抽象出大量此类“笨拙的工作”代码的原因。

快乐的编码!

答案 1 :(得分:0)

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

$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)的信息直接发送到数据库,因为它可能会导致一些严重的安全问题。