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

时间:2014-04-27 09:58:09

标签: 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\\\'s cold

这意味着会在输入/字符串中添加额外的斜杠。

我用谷歌搜索了2个小时并且找不到办法,并尝试自己写一个函数来完成这个过程,但我不熟悉正则表达式而且不能做到这一点。

有没有办法添加到我的" validate_against_sql"首先检查参数是否已作为查询参数有效的函数,所以在这种情况下,我会忽略再次验证它并阻止添加斜杠?

我的意思是这样的:

function validate_against_sql($str){

if(!string_already_valid_as_sql_query_parameter($str)){

mysql_real_escape_string($str);

}

}

所以,基本上我想要" string_already_valid_as_sql_query_parameter"函数检查是否已跳过所有特殊字符,在这种情况下,不要再次验证相同的输入。

1 个答案:

答案 0 :(得分:0)

  

有没有办法添加到我的“validate_against_sql”函数中,该函数首先检查参数是否已作为查询参数有效

没有

事实上,如果在这里使用了一个,则无法发布您的问题,因为它包含所谓的“无效”双重转义字符串。意味着根本就没有“string_already_valid_as_sql_query_parameter”这样的东西。

  

有些时候,在某些区域,多次对SQL注入验证相同的输入,这会为输入添加额外的斜杠

你做错了什么。应该只有一个地方需要格式化SQL值。绝不是必须输入验证层。让我告诉你如何做到这一点。

您必须理解输入验证 SQL查询创建之间的区别。虽然输入验证本身没有任何问题,它应该完全没有任何问题。使用SQL。可以验证数据类型,格式,存在等。但是输入验证层永远不应该触摸数据,更改其另一层的格式。仅仅因为在输入验证时您无法知道数据的去向 - SQL查询或电子邮件消息,或者它将显示回浏览器。

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

  • 此外,这样的层应该独立于任何输入!实际上,您必须格式化所有 SQL值,而不仅仅是来自用户输入的值。
  • 此外,SQL格式化并不像在数据上运行一些转义函数那么愚蠢。
  • 此外,你不应该打扰自己的SQL注入。你不相信我吗?请阅读我为了解释此事而写的文章:The Hitchhiker's Guide to SQL Injection protection