通过输入类型文本防止SQL注入

时间:2014-12-10 08:32:55

标签: php sql database string inject

我需要一些帮助,而且非常快,因为我的数据库被注入了。我至少需要一个不允许用户使用的脚本:[Spaces,Sybols喜欢('*','=','/','。')和一个单词列表('SELECT','FROM' ,'WHERE')]在我的登记表格的文本字段中。

我听到了关于mysql_real_escape_string()的一些事情。这个命令在做什么?并且不要发布到PHP: mysql_real_escape_string() Manual的链接,因为我已经阅读过了。

3 个答案:

答案 0 :(得分:2)

有一种正确和错误的方法可以解决这个问题。 (通常)错误的方法是尝试设置输入卫生方法(如脚本)并希望没有任何东西通过。它通常不起作用。

我建议您重写PHP SQL查询以使用 MySQLi预处理语句。这些是首先从常用SQL语法(" SELECT ... WHERE ...")转换为引擎可以使用的语句的查询,然后只有您的输入替换了字段,从而防止SQL注入。

例如,(非常)易受影响的SQL语法:

"SELECT * FROM users_passwords WHERE user='" + user + "' AND pass='" + password + "'"

可以转换为以下准备好的声明:

"SELECT * FROM users_passwords WHERE user=? AND password=?"

然后,使用命令bind_param(),您可以在准备语句后用参数安全地替换?占位符。虽然原始的SQL查询允许您使用一些基本的注入技术(比如写' OR true OR'),但是准备好的语句不允许这样做。

这是一个有效的例子:

// Create a new MySQLi connection object
$db = new mysqli('localhost','db_username','db_password','db_name');

// Create a new prepared statement
$stmt = $db->prepare('SELECT * FROM users_passwords WHERE user=? AND pass=?');

// Bind the parameters, in order, to the statement (s stands for string)
$stmt->bind_param('ss', username, password);

// Self-explanatory
$stmt->execute();

答案 1 :(得分:0)

如果您使用的是PHP,那么为什么不在PHP脚本中执行此操作。在GET和POST中清理所有用户提供的输入,然后将其移至DB调用。这是正确的做法。

答案 2 :(得分:0)

即使你清理它,我也会强烈避免从任何输入构造SQL查询字符串 出于安全目的和性能的好方法是使用函数来设置参数:

for example:
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);

请参阅http://php.net/manual/en/pdo.prepared-statements.php