我有一个 PHP 应用程序,其中使用 PHP mysql native 库来运行和管理数据库查询。 在我的应用程序中,我使用抽象层来验证用户输入[和任何其他输入]以防止 SQL 注入(inject)。 有时,在某些区域,同一输入会针对 SQL 注入(inject)进行多次验证,这会在输入中添加额外的斜杠
例如:
$str = "It's cold";
$str = validate_against_sql($str);//produces It\'s cold
$str = validate_against_sql($str);//produces It\\\'s cold
这意味着额外的斜杠被添加到输入/字符串中。
我在谷歌上搜索了两个小时,没有找到办法,并尝试自己编写一个函数来完成这个过程,但我不熟悉正则表达式,无法做到这一点。
有没有一种方法可以添加到我的“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”函数检查是否已跳过所有特殊字符,并且在这种情况下不要再次验证相同的输入。
最佳答案
Is there a way to add to my "validate_against_sql" function that checks first if the parameter is already valid as a query parameter
没有。
事实上,如果在这里使用它,您将无法发布您的问题,因为它包含所谓的“无效”双转义字符串。意味着根本不存在“string_already_valid_as_sql_query_parameter”这样的东西。
Some times, in some areas the same input is validated against SQL injection multiple times, which adds additional slashes to the input
这个
你做错了什么。应该只有一个地方需要对 SQL 值进行格式化。并且绝不必须是输入验证层。让我告诉你如何做到这一点。
您必须理解输入验证和SQL 查询创建之间的区别。虽然输入验证本身没有任何问题,但它应该绝对没有任何问题。验证数据类型、格式、存在性等是可以的。但是输入验证层永远不应该接触数据,为另一层更改其格式。只是因为在输入验证时,您无法知道数据将去往何处 - SQL 查询或电子邮件消息,否则它将显示回浏览器。
应该有另一个抽象层,专门处理SQL。这个人必须负责 SQL 格式化。这是您正在寻找的东西,因为它将在执行之前根据给定数据构建查询,从而减少任何双重转义的可能性。
- 此外,这样的层应该独立于任何输入运行!事实上,您必须格式化所有 SQL 值,而不仅仅是来自用户输入的值。
- 此外,SQL 格式化并不像仅仅对数据运行一些转义函数那么愚蠢。
- 此外,您永远不应该为 SQL 注入(inject)而烦恼。你不相信我吗?请看我写的一篇文章,目的是把事情说清楚:The Hitchhiker's Guide to SQL Injection protection
关于php - 如何检查 PHP 字符串作为查询参数是否有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23321916/