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

标签 php mysql sql-injection mysql-real-escape-string

我有一个 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/

相关文章:

php - Codeigniter - 设置 SSL 并收到 404 错误

php - 流式传输文件时 CURL 比 fread 慢?如何加速 CURL

php - SELECT 语句在 mariadb 10.0 中不起作用,但在 mariadb 5.5 中起作用

ios - 验证来自 SQL 注入(inject) objective-c 的输入

php - Nginx - 未从反向代理调用 PHP 脚本

mysql - 在Sequelize中,更新从findAll返回的第一个实例会修改所有实例(mySQL)

php - 为什么这条MySQL语句语法错误?

mysql - SQL 脚本不会在 Joomla 的组件安装中插入值

php - 如何防止 PHP 中的 SQL 注入(inject)?

java - 如何保护自己免受动态查询中的 SQL 注入(inject)攻击?