题
抱歉没有格式化我的代码。工具栏不见了...
我想将一些数据插入 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的注射剂。