gpt4 book ai didi

mysql - magic_quotes_gpc 开启时是否需要使用 mysql_real_escape_string()?

转载 作者:行者123 更新时间:2023-12-01 00:33:15 25 4
gpt4 key购买 nike

要防止SQL注入(inject),是否有必要在magic_quotes_gpc打开时使用mysql_real_escape_string()

最佳答案

对于一些罕见的编码,such as GBk - 是的。
但是您不应出于这个原因将其还原。无论如何都应该关闭魔术引号(并将在下一个 PHP 版本中)。所以,mysql_real_escape_string() 是唯一剩下的转义函数。注意不是sql注入(inject)预防功能。很多人不明白这一点:它只是语法的一部分。它不能用于“保护”任何东西,而是用于组装语法正确的 SQL 查询。并且无论数据来自何处,每次构建查询时都必须使用。当然,作为副作用,它也会保护您免受 SQL 注入(inject)。
当然,mysql_real_escape_string() 仅适用于带引号的字符串。所以,如果你这样做

$num=mysql_real_escape_string($num);
$sql="SELECT INTO table SET data=$num"; /BAD!!!

它不会保护任何东西。如果您要使用不带引号的数字,则必须将其强制转换为正确的类型,如下所示:

$num=intval($num);
$sql="SELECT INTO table SET data=$num"; /GOOD
  • 请记住,mo make mysql_real_escape_string() 按预期工作,应设置正确的客户端编码, mysql_set_charset() 函数,SET NAMES 查询不会设置它。

如果你想摆脱所有这些复杂性,你可以使用 prepared statements ,尽管您需要将 mysql 驱动程序切换为 mysqli 或 PDO。

请注意,任何正确的语法或准备好的语句都不会帮助您处理文字以外的查询部分。您无法转义标识符或运算符。如果您碰巧动态使用这些部分,则必须在您的脚本中对它们进行硬编码,如下所示(对于 ORDER BY 子句):

$orders=array("name","price","qty");
$key=array_search($_GET['sort'],$orders));
$orderby=$orders[$key];
$query="SELECT * FROM `table` ORDER BY $orderby";

或这个(WHERE 子句)

$w=array();
if (!empty($_GET['rooms'])) $w[]="rooms='".mysql_real_escape_string($_GET['rooms'])."'";
if (!empty($_GET['space'])) $w[]="space='".mysql_real_escape_string($_GET['space'])."'";
if (!empty($_GET['max_price'])) $w[]="price < '".mysql_real_escape_string($_GET['max_price'])."'";

if (count($w)) $where="WHERE ".implode(' AND ',$w); else $where='';
$query="select * from table $where";

关于mysql - magic_quotes_gpc 开启时是否需要使用 mysql_real_escape_string()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2589820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com