美好的一天, 首先,我是一个开始编码的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();
答案 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)的信息直接发送到数据库,因为它可能会导致一些严重的安全问题。