我知道sql注入在stackoverflow上已经被讨论过很多很多次了。
使用这种方法的缺点是什么?
foreach($_POST as &$value)
$value = mysql_real_escape_string($value);它只有两行,看起来使用起来很方便,但我认为这不是一种很常用的方法。
请不要把讨论变成事先准备好的声明和PDO,即使这可能是最好的实践。
发布于 2011-08-21 21:47:20
使用此代码的主要缺点是修改POST数组中的数据。这可能会影响以后对POST数组的操作(比如输出到屏幕)。这也可能导致混淆,如果你与其他程序员一起工作,他们可以合理地期望POST数组保持不变。由于前面的原因,它还可能使代码维护变得更加困难。处理代码的任何人都需要知道您修改了POST数组。
我的建议是,如果你打算使用mysql_real_escape_string,而不是参数化查询,那就确保你将它与sprintf和正确的类型说明符结合使用,如下所示:
$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数据,而没有进行任何类型的验证,在实践中我不会这样做(只是为了简单起见)。
发布于 2011-08-21 20:38:45
任何数据都不应该在收集时进行转义,而应该在使用时进行转义,因为您可能会在不同的上下文(MySQL查询、preg模式、HTML输出)中使用相同的数据,并且每个上下文需要不同的转义。此外,如果您以这种方式转义数据,那么您正在对其他数据源执行什么操作,假设您正在从文件或远程XML服务中读取值?很容易忘记转义它,并且很容易忘记哪些值被转义,哪些值没有转义,这要么使您的应用程序易受攻击,要么以双重转义结束。正如@genesisφ所指出的,上面的方法也应该是递归的,以处理数组。并且您需要在查询中的每个值(包括数字)两边使用引号,否则您很容易受到这些参数中的sql注入攻击。
发布于 2011-08-21 18:53:43
只有当您希望为MySQL查询适当地格式化每个POST变量时,这种方法才有意义。
这与Magic Quotes背后的理论本质上是相同的,后者是有充分理由被弃用的。
https://stackoverflow.com/questions/7137795
复制相似问题