pg_prepare() 准备好的语句(不是 PDO)是否可以防止 SQL 注入?

2023-12-01

我正在开发的目标系统不支持 PDO尽管我正在寻求一种防止 SQL 注入的解决方案PHP 5.1.x on a PostGres-DB 8.2+。目前有no切换到 PDO 的机会。

我目前的解决方案是 pg_prepare-prepared 语句:

// Trying to prevent SQL-Injection
$query = 'SELECT * FROM user WHERE login=$1 and password=md5($2)';
$result = pg_prepare($dbconn, "", $query);
$result = pg_execute($dbconn, "", array($_POST["user"], $_POST["password"]));
if (pg_num_rows($result) < 1) {
  die ("failure");
}

但 pg_prepare-documentation 缺少一个重要信息:

它讲述了“以后的使用”

pg_prepare() 创建一个准备好的语句以供以后执行 pg_execute() 或 pg_send_execute().[...]

它讲述了“命名/匿名声明”

该函数创建一个名为 stmtname 的预准备语句 查询字符串,必须包含单个 SQL 命令。 stmtname 可能是 "" 创建一个未命名的语句,在这种情况下任何预先存在的 未命名的语句会被自动替换;[...]

它讲述了“类型转换”

与 pg_prepare() 一起使用的准备好的语句也可以通过以下方式创建 执行 SQL PREPARE 语句。 (但是pg_prepare()更灵活 因为它不需要预先指定参数类型。)此外, 虽然 PHP 没有删除预准备语句的函数, SQL DEALLOCATE 语句可用于此目的。

但它并没有说明这种预准备语句的实现是否可以安全地避免 SQL 注入

*此安全问题的几乎所有注释都涉及 PDO 解决方案,在文档中注意到驱动程序可防止 SQL 注入。但如果 pg_prepare 是一个简单的解决方案,我现在会使用 pg_prepare。*

感谢您提供这一可能是最佳实践解决方案的重要信息。

编辑(标记为解决方案后):感谢非常有启发性的答案!

  • 我将 Frank Heikens 的解决方案标记为最佳答案,因为它解释了 SQL 注入中的一个重要点。程序员可能会使用准备好的语句,但 SQL 注入缺乏可能仍然错误地存在!
  • 除了 Frank Heikens 的回答之外,hoppa 还表明使用 pg_prepare/pg_query_params 可以防止 SQL 注入。不过谢谢。
  • 现在将使用优化的代码pg_query_params(感谢米伦·A·拉德夫)
  • And pg_escape_string()作为替代方案(感谢 halfer)

所有答案都有帮助:)

// Trying to prevent SQL-Injection (**updated**)
$sql_query = 'SELECT * FROM user WHERE login=$1 and password=md5($2);';
$result = pg_query_params($dbconn_login, $sql_query, array($_POST["user"], $_POST["password"]));
if (pg_num_rows($result) < 1) {
  die('failure');
}

准备好的语句可以安全地避免 SQL 注入,因为没有人可以更改查询计划after它已经准备好了。但是,如果您的语句已经被泄露,您仍然会遭受 SQL 注入的困扰:

<?php 
// how NOT to construct your SQL....
$query = 'SELECT * FROM user WHERE login=$1 and password=md5($2) LIMIT '. $_POST['limit']; -- injection!
$result = pg_prepare($dbconn, "", $query);
$result = pg_execute($dbconn, "", array($_POST["user"], $_POST["password"]));
if (pg_num_rows($result) < 1) {
  die ("failure");
}
?>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pg_prepare() 准备好的语句(不是 PDO)是否可以防止 SQL 注入? 的相关文章

随机推荐

  • 外部主机上的会话变得混乱

    问题听起来像这样 使用会话登录在我的本地主机上工作得很好 但是当完全相同的文件上传到我的主机 hostgator 时 会话不会 或者它们会变得混乱 此外 注销功能在主机上不起作用 我检查过 每个页面都有 session start 在里面
  • 使用 -v 查看调用?

    我的一个 iOS 应用程序遇到严重的链接器问题 请参阅上一篇文章详情 linker command failed with exit code 1 use v to see invocation 一个基本问题是 如何使用 v 查看调用 我可
  • 如何接收来自 Angular Reactive Form 的文件上传?

    我有在 Angular 7 反应式表单中上传文件的模块 我需要反应式表单 因为我需要一起上传文件和其他一些信息 我关注这篇文章 https medium com amcdnl file uploads with angular reacti
  • Scala 整数列表列表

    我是 Scala 新手 有点困惑 给定一个列表列表List List Int 如何调用每个列表的某个元素的特定索引 例如每个列表的第二个元素 Simple val ints List List 1 2 List 3 4 val result
  • 如何通过网络浏览器检查应用程序是否已安装?

    这是针对 Windows 的 我有一个要转换为 AIR 的 Flash 应用程序 我使用 NSIS 构建了一个强制安装程序 它运行良好 不过 我希望在网站上有一个图标 用于检查应用程序是否已安装并询问用户是否希望运行它 如果未安装 他们可以
  • 在 Windows/NTFS 中附加到文件是原子的吗?

    如果我从多个进程编写一个简单的文本日志文件 它们是否会覆盖 损坏彼此的条目 基本上 这个问题UNIX 中文件追加是原子的吗 但适用于 Windows NTFS 您可以在本地文件上获得原子追加 使用 FILE APPEND DATA 访问权限
  • 使用 OpenSSL 1.1.1d 静态编译 Qt 5.13.1 生成 QSslSocket::connectToHostEncrypted:TLS 初始化失败

    我想实现什么目标 我需要创建一个具有 SSL 支持的便携式 一体化 应用程序 问题是什么 因此 我面临的核心问题是将 SSL 支持纳入我的二进制 便携式应用程序中 A MCVE该应用程序的功能很简单 Project pro file QT
  • Spring Data JPA 本机查询中的变量

    使用 Spring Data JPA 我需要查询数据库并返回一系列OrderEntitys基于一个startAmt and a endAmt金额 我不确定是否应该将这两个变量映射到实体OrderEntity 作为某种类型的单独类 实体 模型
  • pandas:带有列表的记录以分隔行

    我有一个像这样的 Python Pandas DataFrame NCBI RefSeq 的 UCSC 模式 chrom exonStart exonEnds name chr1 100 200 300 110 210 310 gen1 c
  • 单击按钮即可 Xpages 更多字段(无限制)

    我想从 x 开始 xpage 应用程序上的字段 在我的应用程序中 我有一对文本数据字段和数字数据字段 比如说 10 对 然后当用户单击 更多字段 时 我希望动态显示更多对 而无需完整的字段刷新页面 但想要无限制 字段 只要页面不崩溃 然后我
  • 如何从我的应用程序启动电子邮件客户端,以便我可以看到收件箱、已发送的项目等

    当我从应用程序启动电子邮件客户端时 会打开电子邮件客户端的撰写窗口 但是当我像这样启动时 我无法看到收件箱 已发送的项目等 简而言之 如何从应用程序启动电子邮件客户端 就像从桌面启动一样 任何建议将不胜感激 简而言之 如何从应用程序启动电子
  • 在 Prolog 规则中使用事实列表

    我目前正在编写一个铁路线程序 但在使用来自事实的列表时遇到了一些麻烦 我对 Prolog 很陌生 到目前为止已经写了以下事实和规则 location euston northernLine location warrenStreet vic
  • 无法在程序中命中断点。main Blazor 客户端 wasm

    创建一个基本的 Blazor 应用程序 我正在尝试调试我的应用程序的 main start 方法 主要是检查我正在注入的对象并主要从 appsettings json 获取配置 我还在 lauchSettings json 中添加了用于浏览
  • iOS 7 导航栏和滚动视图在故事板和模拟器中是不同的

    我有一个带导航栏的导航控制器 不是半透明的 我在根视图中添加了一个滚动视图 但是当我运行该应用程序时 它显示的内容与我在 StoryBoard 中看到的不同 一切都变低了 这是我在故事板中看到的 这是在模拟器中 你的故事板应该像这样 在 i
  • TSQL 使用 dd-mm-yyyy 和 yyyy-mm-dd 有什么区别

    出于兴趣 我有一个相当基本的问题 在 T SQL SSMS 等 中 使用之间的 幕后 有什么区别dd mm yyyy and yyyy mm dd在 where 语句中 例如 这两个查询给我不同的结果 select from DB tabl
  • 选定的打印机托盘不打印 Word 文档

    我有一个应用程序 word addin 它有一个类 应该在选定的打印机和托盘上打印Word文档 它现在可以工作 但它会忽略选定的纸盒并始终从手动进纸进行打印 我的课程如下 class printerManager String printe
  • 2009 ACM-ICPC 世界总决赛飞机调度挑战赛

    出于好奇 我查看了2009年ACM国际大学生编程竞赛的题目 问题很有趣 他们可以在http cm baylor edu resources pdf 2009Problems pdf 我无法想出解决问题 1 的算法 我将在此处重现该问题 它在
  • 跨多个变量执行卡方检验并提取 R 中的相关 p 值

    好吧 直接回答问题 我有一个包含很多分类变量的数据库 具有以下几个变量的示例数据库 gender lt as factor sample letters 6 7 100 replace TRUE prob c 0 2 0 8 smoking
  • 如何将 png 文件上传到 S3 Bucket?

    正在尝试上传一个png文件使用S3 for Google Apps 脚本库到 S3 存储桶 get the image blob const imgBlob UrlFetchApp fetch imageUrl getBlob init S
  • pg_prepare() 准备好的语句(不是 PDO)是否可以防止 SQL 注入?

    我正在开发的目标系统不支持 PDO尽管我正在寻求一种防止 SQL 注入的解决方案PHP 5 1 x on a PostGres DB 8 2 目前有no切换到 PDO 的机会 我目前的解决方案是 pg prepare prepared 语句