- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我最近决定将我当前使用 php mysql_query 执行的所有普通 mysql 查询切换为 PDO 样式查询,以提高性能、可移植性和安全性。对于这个数据库交互工具的任何专家,我只是有一些快速的问题
如果所有的statements都准备好,是否可以防止注入(inject)? (我在 php.net 上注意到它写了'但是,如果查询的其他部分是用未转义的输入构建的,SQL 注入(inject)仍然是可能的'我不太确定这是什么意思)。这是否仅仅意味着如果所有变量都通过 prepare 函数运行它是安全的,而如果直接插入一些则不是?
目前,我在页面顶部有一个连接,并在页面的其余部分执行查询。我更详细地查看了 PDO,并注意到每个涉及连接和连接关闭的查询都有一个 try and catch 过程。有没有一种直接的方法来连接然后重用该连接,而不必尝试一切或通过连接、查询和关闭不断重复该过程?
谁能用通俗易懂的语言简要解释一下 set_exception_handler 的用途?
我感谢任何更有经验的人的任何建议。
最佳答案
没有防止 SQL 注入(inject)的 Elixir 。即使您已准备好,也可能会有不安全的查询。
$sql = "SELECT * FROM MyTable WHERE id = " . $_GET["id"];
$stmt = $pdo->prepare($sql);
看到了吗? Prepare 只需要一个字符串并将其准备为 SQL 查询。您仍然可以在准备字符串之前将不安全的内容插入到字符串中。。 prepare 只看到一个字符串,它不知道你是按字面意思写的,还是部分字符串来自不可信的来源。
您可以在 SQL 查询中使用参数占位符,然后当您对准备好的语句调用 execute()
时,您可以提供动态值。但是您只能使用参数占位符来代替 SQL 表达式中的文字值——不能对查询中的其他类型的动态内容进行参数化。看我的介绍SQL Injection Myths and Fallacies有关 SQL 注入(inject)的示例和许多其他信息。
我不会将每个 PDO 调用都放在try block 中。我编写了一个类来为我的应用程序的某些逻辑内聚部分封装数据访问。当我调用那个类时,我将调用包装在一个 try block 中。如果该类中潜在的许多数据库访问操作之一出现问题,我会发现并处理它。
您可以使用 set_exception_handler()
代替 catch
block 。如果您的应用程序中发生异常,但您没有捕捉到它,并且它一直在堆栈中向上冒泡,直到它会中止脚本,调用此函数。想象一下您的整个 PHP 脚本都在一个顶级 try
block 中,并且您声明的代码将进入相应的 catch
block 。
我从不使用 set_exception_handler()
。函数运行后,您的脚本无论如何都会停止执行,因此没有机会重试产生异常的操作。它还在顶级范围内运行,因此您失去了异常的上下文。此时您唯一可以做的就是漂亮地打印异常消息并退出。我更喜欢在离异常更近的地方处理异常,这样我就可以添加一些关于异常上下文的信息,或者在 PHP 脚本停止之前做一些其他事情。
回复你的评论:
您不应该对表名或列名使用 mysql_real_escape_string()
,因为引用标识符的规则不同于引用文字字符串值的规则。只是不要将来自外部或不受信任来源的输入插入到您的 SQL 查询中。
我在演示文稿中使用关联数组编写了一个代码示例,这样如果用户输入与已知值匹配,它会将其用作关联数组中的键来查找表(或列,在我的例子)。这意味着您不必使用任何转义/引用函数,因为您不会将不受信任的内容插入到您的 SQL 查询中。您只能插入您在关联数组中预定义的值。
关于异常,我的意思是(在高层次上):
$domainObject = new MyDomain();
try {
$domainObject->create_report($formInput);
} catch (PDOException $e) {
// Report error politely so the user knows what happened
// and what they can do to fix it.
}
create_report()
内部的工作很复杂,可能涉及多个 SQL 查询,其中任何一个都可能以多种方式出错。您不一定需要为该函数内的每个 SQL 操作捕获异常,您可以只捕获从函数中弹出的任何和所有异常,并在一个地方处理它们,在调用 create_report( )
。
此外,您可能不想向他们逐字逐句地吐出异常消息,因为他们不知道该怎么做。
关于php - 关于mysql转PDO的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2841691/
关闭。这个问题是off-topic .它目前不接受答案。 想要改进这个问题? Update the question所以它是on-topic用于堆栈溢出。 关闭 12 年前。 Improve thi
我有一个动态网格,其中的数据功能需要正常工作,这样我才能逐步复制网格中的数据。假设在第 5 行中,我输入 10,则从第 6 行开始的后续行应从 11 开始读取,依此类推。 如果我转到空白的第一行并输入
我有一个关于我的按钮消失的问题 我已经把一个图像作为我的按钮 用这个函数动画 function example_animate(px) { $('#cont
我有一个具有 Facebook 连接和经典用户名/密码登录的网站。目前,如果用户单击 facebook_connect 按钮,系统即可运行。但是,我想将现有帐户链接到 facebook,因为用户可以选
我有一个正在为 iOS 开发的应用程序,该应用程序执行以下操作 加载和设置注释并启动核心定位和缩放到位置。 map 上有很多注释,从数据加载不会花很长时间,但将它们实际渲染到 map 上需要一段时间。
我被推荐使用 Heroku for Ruby on Rails 托管,到目前为止,我认为我真的会喜欢它。只是想知道是否有人可以帮助我找出问题所在。 我按照那里的说明在该网站上创建应用程序,创建并提交
我看过很多关于 SSL 错误的帖子和信息,我自己也偶然发现了一个。 我正在尝试使用 GlobalSign CA BE 证书通过 Android WebView 访问网页,但出现了不可信错误。 对于大多
我想开始使用 OpenGL 3+ 和 4,但我在使用 Glew 时遇到了问题。我试图将 glew32.lib 包含在附加依赖项中,并且我已将库和 .dll 移动到主文件夹中,因此不应该有任何路径问题。
我已经盯着这两个下载页面的源代码看了一段时间,但我似乎找不到问题。 我有两个下载页面,一个 javascript 可以工作,一个没有。 工作:http://justupload.it/v/lfd7不是
我一直在使用 jQuery,只是尝试在单击链接时替换文本字段以及隐藏/显示内容项。它似乎在 IE 中工作得很好,但我似乎无法让它在 FF 中工作。 我的 jQuery: $(function() {
我正在尝试为 NDK 编译套接字库,但出现以下两个错误: error: 'close' was not declared in this scope 和 error: 'min' is not a m
我正在使用 Selenium 浏览器自动化框架测试网站。在测试过程中,我切换到特定的框架,我们将其称为“frame_1”。后来,我在 Select 类中使用了 deselectAll() 方法。不久之
我正在尝试通过 Python 创建到 Heroku PostgreSQL 数据库的连接。我将 Windows10 与 Python 3.6.8 和 PostgreSQL 9.6 一起使用。 我从“ht
我有一个包含 2 列的数据框,我想根据两列之间的比较创建第三列。 所以逻辑是:第 1 列 val = 3,第 2 列 val = 4,因此新列值什么都没有 第 1 列 val = 3,第 2 列 va
我想知道如何调试 iphone 5 中的 css 问题。 我尝试使用 firelite 插件。但是从纵向旋转到横向时,火石占据了整个屏幕。 有没有其他方法可以调试 iphone 5 中的 css 问题
所以我有点难以理解为什么这不起作用。我正在尝试替换我正在处理的示例站点上的类别复选框。我试图让它做以下事情:未选中时以一种方式出现,悬停时以另一种方式出现(选中或未选中)选中时以第三种方式出现(而不是
Javascript CSS 问题: 我正在使用一个文本框来写入一个 div。我使用以下 javascript 获取文本框来执行此操作: function process_input(){
你好,我很难理解 P、NP 和多项式时间缩减的主题。我试过在网上搜索它并问过我的一些 friend ,但我没有得到任何好的答案。 我想问一个关于这个话题的一般性问题: 设 A,B 为 P 中的语言(或
你好,我一直在研究 https://leetcode.com/problems/2-keys-keyboard/并想到了这个动态规划问题。 您从空白页上的“A”开始,完成后得到一个数字 n,页面上应该
我正在使用 Cocoapods 和 KIF 在 Xcode 服务器上运行持续集成。我已经成功地为一个项目设置了它来报告每次提交。我现在正在使用第二个项目并收到错误: Bot Issue: warnin
我是一名优秀的程序员,十分优秀!