我有一个应用程序,通过将动态mysql查询与mysql(mysqli)实际转义字符串结合使用,将大大受益。如果我运行了通过mysql真正的转义从用户那里收到的所有数据,那么它与使用mysql预准备语句一样安全吗?
虽然标题中的问题是模棱两可的, 可以 解释为“动态mysql查询的 每个部分 格式 是否正确……”,因此有肯定的答案,但正文中的问题
不是 :
如果我运行了通过mysql真正的转义从用户那里收到的所有数据,那么它与使用mysql预准备语句一样安全吗?
如果您更仔细地看这个问题,您将理解,这只是 魔术引述的 化身!此不受欢迎,不推荐使用和已删除的功能的确切目的是“通过转义运行所有用户输入”。
如今,每个人都知道魔术引号是不好的。 那为什么要肯定的答案呢?
好的,似乎需要再次解释,为什么批量转义不好。
问题的根源是一个非常强烈的妄想,几乎每个PHP用户
都对它抱有幻想:每个人都有一个奇怪的信念,即逃避对“危险字符”(它们是什么?)进行某些操作,使它们“安全”(如何?)。不用说,这只是一个完整的垃圾。
事实是:
转义只是一种 字符串格式 而已。
当需要时-尽管有注射的可能,但仍需要它。
当您不需要它时,即使有一点注射也无济于事。
说到与准备好的语句的区别,至少存在一个问题(在sql-injection
标记下已经多次提及):这样
的代码
$clean = mysql_real_escape_string($_POST['some_dangerous_variable']);
$query = "SELECT * FROM someTable WHERE somevalue = $clean";
将帮助您避免注射。
Beause转义只是字符串格式化工具,无论如何都不是防止注入的工具。
去搞清楚。
但是,转义与准备好的语句有一些共同点:
如果发生以下情况,它们都不能保证您不会被注入
为了安全起见,请参阅我的答案,以解释FULL
sql注入保护的操作方法
长话短说:只有在您对初始陈述进行2次必要的更正和1次补充之后,您才能认为自己是安全的:
如果我运行
了通过mysql真正的转义从用户那里收到的所有数据,并且始终将其括在引号中
(并且,如ircmaxell所提到的,mysqli_set_charset()
它用于使mysqli_real_escape
string()实际上起作用了(在这种罕见的情况下,使用一些奇怪的编码,例如GBK))是否与使用mysql准备好的语句一样安全?
遵循这些规则-是的,它与本地准备好的语句一样安全。
问题内容: 在PDO :: Prepare页上指出: “并且通过消除对参数的手动引用来帮助防止SQL注入攻击” 知道这一点,是否有一个像mysql_real_escape_string()这样的PHP函数可以照顾到PDO的转义?还是PDO会为我做好一切转义? 编辑 我现在意识到我问了一个错误的问题。我的问题确实是,“ PDO会为我做什么?” 我现在通过这些答案意识到,它实际上仅消除了对引号进行转义
问题内容: 假设我们有一个查询: 以及要获取的ID数组: 预处理语句它劝准备一个语句,并调用它多次: 但是现在我必须手动对结果进行排序。我有其他不错的选择吗? 问题答案: 您可以这样进行: 使用此方法,您将为每个id调用bind_param,并且已由mysql完成排序。
问题内容: 我知道准备好的语句的功能,但是我不能在这里使用它。我通过HTTP(而不是通过JDBC)将sql查询发送到外部服务器。如何对SQL查询进行转义字符串?有没有办法通过JDBC做到这一点?还是我应该为此使用自定义类/函数? ps另外,我已经连接到其他数据库,因此可以使用JDBC函数。 问题答案: 这听起来很不安全。如果要通过HTTP发送SQL语句,则可能会受到中间人攻击(以及其他攻击)的危害
我犯了什么错?
问题内容: 我正在使用JDBC模板,并希望使用准备好的语句从数据库中读取数据。我遍历.csv文件中的许多行,并且在每一行上执行一些具有相应值的SQL选择查询。 我想加快从数据库中的读取速度,但是我不知道如何使JDBC模板与准备好的语句一起使用。 有PreparedStatementCreator和PreparedStatementSetter。如本例所示,它们都是使用匿名内部类创建的。但是在Pre
问题内容: 对于此查询,有必要使用吗? 任何改进或查询是否还好? 在这种情况下,查询速度很重要。 问题答案: 否,准备好的查询(正确使用时)将确保对数据进行正确的转义以进行安全查询。您有点正确地使用它们,只需要更改一件事。因为您使用的是“?” 占位符,最好通过execute方法传递参数。 请注意,如果要将其输出到页面,数据库清理并不意味着可以在HTML中安全显示,因此也可以在其上运行htmlspe