Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 有人能解释一下准备好的陈述吗?_Php_Mysql_Sql Injection - Fatal编程技术网

Php 有人能解释一下准备好的陈述吗?

Php 有人能解释一下准备好的陈述吗?,php,mysql,sql-injection,Php,Mysql,Sql Injection,我目前使用的是mysql\u real\u escape\u string(),但听说有人使用“准备好的语句”。因此,我想知道这种方式mysql\u real\u escape\u string()是否仍然安全,但如果不安全,有人能解释一下我如何更改代码以允许准备语句吗 $conn=mysql_connect("localhost", "u611142741_list", "REDACTED"); mysql_select_db("u611142741_sugge", $conn); //

我目前使用的是
mysql\u real\u escape\u string()
,但听说有人使用“准备好的语句”。因此,我想知道这种方式
mysql\u real\u escape\u string()
是否仍然安全,但如果不安全,有人能解释一下我如何更改代码以允许准备语句吗

$conn=mysql_connect("localhost", "u611142741_list", "REDACTED"); 
 mysql_select_db("u611142741_sugge", $conn);

// If the form has been submitted
if (trim($_POST["suggestion543"]) == "") {
echo "Error";
echo '<script language="javascript">';
echo 'alert("Invalid entry! Try Again.")';
echo '</script>';
echo '<script>';
echo 'setTimeout(function(){ window.location="" }, 500)';
echo '</script>';
} else {
$suggestion = mysql_real_escape_string($_POST['suggestion543']);
$ip = $_SERVER['REMOTE_ADDR'];
echo "Thank you for submitting your suggestion!";
echo '<script>';
echo 'setTimeout(function(){ window.location="" }, 2000)';
echo '</script>';
};



    // Build an sql statment to add the student details
    $sql="INSERT INTO suggestions

(`Suggestion`, `IP Address`) VALUES

('$suggestion','$ip')";
    $result = mysql_query($sql,$conn);


// close connection 
mysql_close($conn);
$conn=mysql\u connect(“本地主机”、“u611142741\u列表”、“修订版”);
mysql_select_db(“u611142741_sugge”,$conn);
//如果表格已经提交
如果(修剪($_POST[“suggestion543”])=“”){
回声“错误”;
回声';
回显“警报”(“无效条目!重试”);
回声';
回声';
echo“setTimeout(function(){window.location=”“},500)”;
回声';
}否则{
$suggestion=mysql\u real\u escape\u字符串($\u POST['suggestion543']);
$ip=$\u服务器['REMOTE\u ADDR'];
echo“感谢您提交您的建议!”;
回声';
echo“setTimeout(function(){window.location=”“},2000)”;
回声';
};
//构建sql语句以添加学生详细信息
$sql=“插入到建议中”
(`Suggestion`、`IP Address`)值
("建议","建议","知识产权");;
$result=mysql\u查询($sql,$conn);
//密切联系
mysql_close($conn);

请在此处仔细阅读。准备好的语句不会转义字符,但会将它们与附加到的SQL查询分开。在输出时,您仍然希望转义任何用户提交的数据。然而,在进行SQL查询时,预先准备好的语句是避免SQL注入的更有效的方法。不管你多么小心,逃避总是会留下出错的余地。

互联网上有1600万本教程,其中很多都在StackOverflow上。请在询问之前做一些研究。但是它们都没有任何帮助。
mysql\u real\u escape\u string()
本身并不是不安全的(尽管该API已被弃用,无论如何也不应该再使用),而是不安全的,因为您有责任不忘记使用它。如果你忘记了哪怕一次,你就留下了一个漏洞。习惯性地使用预先准备好的语句并且从不将变量直接传递给SQL字符串可以消除这个问题。mysql_*函数是不推荐使用的,不应该首先使用。准备好的语句是一个有很好文档记录的特性,所以这也不会是一个问题。基本的例子在中,这是在您已经熟悉的
mysql_*()
扩展的上下文中使用PDO扩展的框架。但是最重要的部分是
prepare()/bindParam()/execute()
,它通过
mysql\u query()
没有等效的功能。您必须切换到不同的API(PDO或MySQLi)才能使用准备好的语句。。。。