Php SQL注入-这(oneliner)安全吗?

Php SQL注入-这(oneliner)安全吗?,php,mysql,security,sql-injection,Php,Mysql,Security,Sql Injection,PHP: 一个邪恶的天才黑客能将SQL注入我的选择方式吗?为什么你不使用mysql\u real\u escape\u字符串或更好的准备语句?您的解决方案似乎很愚蠢。为什么不使用mysql\u escape\u字符串?是的,他可以,加上而不是“还有,我想这个查询会给你一个错误。”。 最好的办法是: $SQL = "SELECT goodies FROM stash WHERE secret='" . str_replace("'",'',$_POST['secret']) . "

PHP:


一个邪恶的天才黑客能将SQL注入我的选择方式吗?

为什么你不使用mysql\u real\u escape\u字符串或更好的准备语句?您的解决方案似乎很愚蠢。

为什么不使用mysql\u escape\u字符串?是的,他可以,加上而不是“还有,我想这个查询会给你一个错误。”。 最好的办法是:

$SQL = "SELECT goodies FROM stash WHERE secret='" . str_replace("'",'',$_POST['secret']) . "'";
我已经考虑了一段时间,但我看不到任何方法可以将SQL注入到这个语句中

以单引号开头的SQL字符串在下一个单引号处终止,除非使用反斜杠或另一个引号\'或\'进行转义。由于要删除所有单引号,因此不能有双引号。如果您转义结束引号,您将得到一个错误,但没有SQL注入

然而,这种方法有许多缺点:

输入中的单引号将被忽略。 输入中的反斜杠处理不正确-它们将被视为转义码。 如果最后一个字符是反斜杠,则会出现错误。 如果稍后扩展查询以添加第二个参数,则将允许SQL注入攻击。 例如:

$query = sprintf("SELECT goodies FROM stash WHERE secret='%s'",
addcslashes(mysql_real_escape_string($_POST['secret']),'%_'));
当使用参数\和或1=1调用时-将导致:

$SQL = "SELECT goodies FROM stash WHERE secret='" .  
    str_replace("'",'',$_POST['secret']) .  
"' AND secret2 = '" .
    str_replace("'",'',$_POST['secret2']) .  
"'";  
哪个MySQL会看到类似这样的内容:

SELECT goodies FROM stash WHERE secret='\' AND secret2=' OR 1 = 1 -- '
即使在这种情况下不可能导致注入,但缺点使其不适合用于避免SQL注入的通用方法


正如已经指出的那样,解决办法是使用事先准备好的声明。这是防止SQL注入攻击的最可靠的方法。

seconded。。。特别是对于准备好的陈述,请使用精简的准备好的陈述。过滤根本不起作用;始终使用参数绑定。我正在动态构建语句,以便使用大量选项进行搜索,因此我宁愿通过将语句构建为一个字符串来将每个键值对保持在一起。不过,15分钟内有6票。。手心出汗。@T4NK3R:str_replace比mysql_real_escape_string更瘦吗?为作业使用适当的工具-str_replace是一种半自动的替换。即使动态生成查询,您仍然可以绑定到其参数,而不是依赖特殊的编码技术。您不需要转义%和u,因为您没有使用LIKE。是的,addcslashes函数是optional我正在动态构建一个语句,用于带有许多选项的搜索,因此我宁愿通过将语句构建为一个字符串来将每个键值对保持在一起。当值结尾包含\时,仍然可以得到一个无效的语句,这将逃避结束。“+1:有趣的问题。但不管它是否被证明是安全的,我还是不推荐它一个错误是可以的-只要它不影响诚实的用户。我认为查询从secret=''没有问题的stash中选择goodies。双引号不会结束字符串。你指的是什么样的错误?哎呀,我经常犯这种错误!。但是用mysql\u real\u escape\u string$\u POST['secret']替换str\u replace可以解决这个问题,并消除导致错误的可能性?@T4NK3R:做了多少?有一种非常罕见的情况,mysql\u real\u escape\u字符串无法正常工作:。预先准备好的语句是最好的方法,但是如果操作正确,mysql\u real\u escape\u字符串也应该可以工作。Do:add extra key=value对主要是整数,尽管通过简单的int强制转换进行了强化。顺便说一句:我的php源代码是UTF-8,数据库连接也是mysql\u set\u字符集'utf8',$dbCon;-现在开始阅读你的链接@T4NK3R:如果在同一个查询中有两个字符串,并且两次都使用str_replace方法,那么正如我所演示的,这是不安全的。如果使用mysql\u real\u escape\u string,我上面显示的攻击是不可能的。@Mark Byers:对,这是可怕的阅读,但不会影响我,而且脆弱性现在已经修复,不管怎样:-你的答案是我的绿色对勾。但感谢所有参与的人!
SELECT goodies FROM stash WHERE secret='...' OR 1 = 1