首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在php中输入卫生设施

在php中输入卫生设施
EN

Stack Overflow用户
提问于 2011-08-21 18:50:52
回答 7查看 2.4K关注 0票数 3

我知道sql注入在stackoverflow上已经被讨论过很多很多次了。

使用这种方法的缺点是什么?

代码语言:javascript
复制
foreach($_POST as &$value)
    $value = mysql_real_escape_string($value);

它只有两行,看起来使用起来很方便,但我认为这不是一种很常用的方法。

请不要把讨论变成事先准备好的声明和PDO,即使这可能是最好的实践。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-08-21 21:47:20

使用此代码的主要缺点是修改POST数组中的数据。这可能会影响以后对POST数组的操作(比如输出到屏幕)。这也可能导致混淆,如果你与其他程序员一起工作,他们可以合理地期望POST数组保持不变。由于前面的原因,它还可能使代码维护变得更加困难。处理代码的任何人都需要知道您修改了POST数组。

我的建议是,如果你打算使用mysql_real_escape_string,而不是参数化查询,那就确保你将它与sprintf和正确的类型说明符结合使用,如下所示:

代码语言:javascript
复制
$query = sprintf("INSERT INTO purchases (amount, num_items, prod_descrip) 
                    VALUES (%f, %d, '%s')",
                    mysql_real_escape_string($_POST['amount'])
                    mysql_real_escape_string($_POST['num_items'])
                    mysql_real_escape_string($_POST['prod_descrip']));

请注意,%f适用于浮点型,%d适用于整型,%s适用于字符串值。还要注意,我直接在查询字符串中使用$_POST数据,而没有进行任何类型的验证,在实践中我不会这样做(只是为了简单起见)。

票数 6
EN

Stack Overflow用户

发布于 2011-08-21 20:38:45

任何数据都不应该在收集时进行转义,而应该在使用时进行转义,因为您可能会在不同的上下文(MySQL查询、preg模式、HTML输出)中使用相同的数据,并且每个上下文需要不同的转义。此外,如果您以这种方式转义数据,那么您正在对其他数据源执行什么操作,假设您正在从文件或远程XML服务中读取值?很容易忘记转义它,并且很容易忘记哪些值被转义,哪些值没有转义,这要么使您的应用程序易受攻击,要么以双重转义结束。正如@genesisφ所指出的,上面的方法也应该是递归的,以处理数组。并且您需要在查询中的每个值(包括数字)两边使用引号,否则您很容易受到这些参数中的sql注入攻击。

票数 4
EN

Stack Overflow用户

发布于 2011-08-21 18:53:43

只有当您希望为MySQL查询适当地格式化每个POST变量时,这种方法才有意义。

这与Magic Quotes背后的理论本质上是相同的,后者是有充分理由被弃用的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7137795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档