我正在处理一个表单,其中有可能让用户在要提交给数据库的字符串中使用非法/特殊字符.我想在字符串中转义/否定这些字符,并且一直在使用htmlspecialchars().但是,有更好/更快的方法吗?
我读过这个:
将帮助您不要注射.因为逃避只是一个字符串格式化设施,而不是任何方式的防喷射.去搞清楚.然而,转义与准备好的语句有一些共同之处:如果你只使用它来反对臭名昭着的"用户输入",它们都不能保证你注入,而不是作为建立任何查询的严格规则,尽管有数据源.如果你需要插入不是数据而是标识符或关键字.
在下面的帖子:使用sql转义的动态mysql查询是否与预准备语句一样安全?
所以我的问题是使用:
$Var = "UserInput Data Possible SQL Injection";
$mysqli->real_escape_string($Var);
Run Code Online (Sandbox Code Playgroud)
不提供针对SQL注入的保护?
我想使用$mysqli->query();所以我可以使用fetch_array(MYSQLI_ASSOC);因为坦率地说,我不知道如何在使用prepared语句后将结果作为数组获取.
所以如果我在我的数据库连接中有这个:
$STD = new mysqli('localhost', 'root', 'xx', 'xx');
$STD->set_charset('utf8');
if ($STD->connect_error) {
die("Standard Access Has Been Revoked. Please Contact Administration");
}elseif (!$STD){
die ("Other problem With Connecting To Database, Please Contact Administration");
}
Run Code Online (Sandbox Code Playgroud)
如手册中所述 real_escape_string
http://php.net/manual/en/mysqli.real-escape-string.php
以上列表:
注意安全性:默认字符集必须在服务器级别或使用API函数mysqli_set_charset()设置字符集,以使其影响mysqli_real_escape_string().有关更多信息,请参阅字符集的概念部分.
链接到:http://php.net/manual/en/mysqli.set-charset.php
我的整体问题可以分为三个选项,第一个是请求语句的fetch_array()equlivant prepared,这将提供完整的SQL注入预防,因为准备好的语句将数据作为原始数据发送.
这种格式的第一个问题如下:
我使用的查询为:
$GetCompletedQuery = $STD->query("SELECT Status FROM UserCompletion WHERE `UserID`=' …Run Code Online (Sandbox Code Playgroud) 问题1:我可以使用吗? $userid = mysql_real_escape_string($_GET['user_id']);
或者我需要使用下面的代码更好?
function mysql_prep( $value ){
$magic_quotes_active = get_magic_quotes_gpc();
$new_enough_php = function_exists( "mysql_real_escape_string" ); //example. php >= v4.3.0
if( $new_enough_php ) { //php v4.30 or higher, undo any magic quote effects so mysql_real_escape_string can do the work
if( $magic_quotes_active ) { $value = stripslashes( $value );}
$value = mysql_real_escape_string( $value );
} else { //before php v4.3.0.
if( !$magic_quotes_active ) { $value = addslashes( $value ); }
}
return $value;
}
$userid = trim(mysql_prep($_GET['user_id']));
Run Code Online (Sandbox Code Playgroud)
问题2:我们真的需要使用md5()或 …