0

请记住,我还在学习。我在一个网站上工作,我只是从现有的代码中调整和复制大部分代码,因为这是我理解它们的最简单方法。

我不断收到由使用撇号引起的 sql 错误,我已经开始输入mysql_real_escape_string()for each 文本字段,这解决了各个问题。

现在这真的只是我在寻求帮助。请不要讽刺,我真的只是想学习,这是提问的最佳场所,所以在这里:

有什么方法可以修复一般设置来过滤掉干扰的撇号吗?基本上任何可以帮助网站防止sql注入的东西?任何帮助将不胜感激 :)

4

3 回答 3

3

通用解决方案:所有参数(值)都应通过prepared statement placeholders传递

http://nz.php.net/manual/en/pdo.prepare.php

http://nz.php.net/manual/en/mysqli.prepare.php

于 2012-04-12T22:15:40.160 回答
0

有什么方法可以修复一般设置来过滤掉干扰的撇号吗?

绝对没有。

很久以前有一个,但现在它被诽谤、弃用和逐出教会(因为它从来没有按预期工作并且没有达到它的目的)。

您面临的问题来自 SQL 查询是一个程序这一事实。 因此,您必须遵循创建此程序的语法规则,就像使用任何其他程序语言一样。如果你碰巧创建了一个 PHP 程序,你也必须注意那些烦人的撇号——你不能把它放在代码中随机的地方,但每个地方都必须有严格的语法含义,或者——如果是撇号作为数据的一部分 - 它必须正确转义

所以,这只是语法问题。
解决问题的最佳方法是将代码与数据分离。
原生准备好的语句为您提供了这种可能性。
您可以创建一个程序 - 查询本身 - 并最终将一些变量绑定到它,因此,程序代码和日期分别发送到 SQL 服务器。
这就是为什么准备好的语句被认为是创建动态 SQL 查询的最佳方式。

但当然,您必须明确地将每个变量绑定到它的查询 - 因此,没有通用的方法。

但是,您可以使用一些助手来自动进行绑定,因此,代码变得简洁

$db->run("SELECT * FROM table WHERE id=?",$id); 

这将是一个简短的书面和同时完全安全的。

于 2012-04-13T11:15:01.687 回答
-1

使用为您执行此操作的数据访问层是比手动保护每个查询参数更好的方法。不仅因为它很乏味,而且因为你最终会忘记一个关键参数。

当我还在使用 PHP 时,我使用了 SafeSQL——它非常轻巧且不引人注目……但是如果您是初学者,插入它可能仍然是一项艰巨的任务。

于 2012-04-12T22:14:41.090 回答