如何检查PHP字符串作为查询参数是否有效

如何检查PHP字符串作为查询参数是否有效,php,mysql,sql-injection,mysql-real-escape-string,Php,Mysql,Sql Injection,Mysql Real Escape String,我有一个PHP应用程序,使用PHP mysql本机库运行和管理数据库查询。 在我的应用程序中,我使用抽象层根据SQL注入验证用户输入[和任何其他输入]。 有时,在某些区域,同一输入会根据SQL注入进行多次验证,这会在输入中添加额外的斜杠 例如: $str = "It's cold"; $str = validate_against_sql($str);//produces It\'s cold $str = validate_against_sql($str);//produces It\\\'

我有一个PHP应用程序,使用PHP mysql本机库运行和管理数据库查询。 在我的应用程序中,我使用抽象层根据SQL注入验证用户输入[和任何其他输入]。 有时,在某些区域,同一输入会根据SQL注入进行多次验证,这会在输入中添加额外的斜杠

例如:

$str = "It's cold";
$str = validate_against_sql($str);//produces It\'s cold
$str = validate_against_sql($str);//produces It\\\'s cold
这意味着在输入/字符串中添加了额外的斜杠

我在谷歌上搜索了2个小时,但没有找到一种方法,我试图自己编写一个函数来完成这个过程,但我不熟悉正则表达式,所以无法完成

是否有一种方法可以添加到我的“validate_-on_-sql”函数中,该函数首先检查参数是否已经作为查询参数有效,因此在这种情况下,我将忽略再次验证,并阻止添加斜杠

我的意思是这样的:

function validate_against_sql($str){

if(!string_already_valid_as_sql_query_parameter($str)){

mysql_real_escape_string($str);

}

}
因此,基本上我希望“string\u ready\u valid\u as\u sql\u query\u parameter”函数检查是否已跳过所有特殊字符,在这种情况下,不再验证相同的输入

是否有一种方法可以添加到我的“根据sql验证”函数中,该函数首先检查参数是否已经作为查询参数有效

不 事实上,如果这里使用了一个,您无法发布您的问题,,因为它包含假定的“无效”双转义字符串。意味着根本不存在像“字符串\u已经\u有效\u作为\u sql\u查询\u参数”这样的东西

有时,在某些区域,同一输入会根据SQL注入进行多次验证,这会在输入中添加额外的斜杠

这 就是你做错了什么。应该只有一个地方需要格式化SQL值。而且它决不一定是输入验证层。让我告诉你怎么做

您必须理解输入验证SQL查询创建之间的区别。虽然输入验证本身没有什么问题,它应该与SQL完全无关。验证数据类型、格式、存在性、,但输入验证层不应接触数据,改变另一层的格式。只是因为在输入验证时,您无法知道数据将流向何处—SQL查询或电子邮件,或者数据将显示回浏览器

应该有另一个抽象层来专门处理SQL。这个人必须负责SQL格式。这是您正在寻找的东西,因为它将在执行之前根据给定的数据构建一个查询,从而减少双重转义的可能性

  • 此外,这样一个层应该独立于任何输入!事实上,您必须格式化所有的SQL值,而不仅仅是来自用户输入的值
  • 此外,SQL格式化并不像对数据运行某种转义函数那样愚蠢
  • 此外,您永远不应该为SQL注入而烦恼。你不相信我吗?请看我写的一篇文章,目的是为了把事情解释清楚:

不要使用
mysql\ucode>函数;他们被弃用了。您应该改用
mysqli
PDO
。使用参数化,就像准备好的语句提供的那样。那你就不用担心逃跑了。有关更多信息,请查看。