有趣的html获取用户输入
形成
处理中
使用php处理表格
我使用Mysqli连接方法的形式连接
使用$_POST[value]从用户获取价值警告do not access super Global array Directly
我如何使用SQL注入方法检查此方法,并且在查看此链接后需要困惑的帮助如何防止PHP中的SQL注入?
表格处理
$db_username ="sanoj";
$db_password ="123456";
try {
#connection$conn = new PDO('mysql:host=localhost;dbname=localtest', $db_username, $db_password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$data = $conn->prepare('INSERT INTO test (first, last) VALUES (:first, :last)');
$first = mysql_real_escape_string($_POST['first']);
$last = mysql_real_escape_string($_POST['last']);
$data->execute(array(':first' => $first, ':last' => $last));
#exception handiling} catch (PDOException $e) {
echo $e->getMessage();
}
?>
错误
当我运行上述代码时,出现此错误Deprecated: mysql_real_escape_string(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in C:\Users\logon\Documents
etBeansProjects\teste local\for.php on line 11
这是唯一的提示,因为您正在使用mysql_real_escape_string(),而wici是deprecated,是否可以将任何东西插入数据库
@ Arif_suhail_123数据已插入,但出现如上所述的错误
只需使用此php.net/manual/en/mysqli.real-escape-string.php
检查答案。 希望它能解释一些事情
试试这个你不会得到任何错误或警告
$db_username ="sanoj";
$db_password ="123456";
try {
#connection$conn = new PDO('mysql:host=localhost;dbname=localtest', $db_username, $db_password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$data = $conn->prepare('INSERT INTO test (first, last) VALUES (:first, :last)');
$first = filter_input(INPUT_POST, 'first');
$last = filter_input(INPUT_POST, 'last');
$data->execute(array(':first' => $first, ':last' => $last));
#exception handiling} catch (PDOException $e) {
echo $e->getMessage();
}
?>
注意:还有一件事。您不必在这里使用mysqli_real_escape_string,因为PDO会处理它。因此您只需设置您的值即可。并在您的query中使用它们
尝试这个
$db_username ="sanoj";
$db_password ="123456";
**Move your value outside of query**
try {
#connection$conn = new PDO('mysql:host=localhost;dbname=localtest', $db_username, $db_password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$first = mysqli_real_escape_string($conn,$_POST['first']);//Like this
$data = $conn->prepare('INSERT INTO test (first, last) VALUES (:first, :last)');
$data->execute(array(':first' => $first, ':last' => $last));
#exception handiling} catch (PDOException $e) {
echo $e->getMessage();
}
?>
您收到的错误通知您知道mysql_real_escape_string已贬值。
检查此链接php.net/manual/en/mysqli.real-escape-string.php
stackoverflow.com/questions/14012642/这是一种不好的做法,只是临时解决方法,可以摆脱通知。
数据未插入表中坏主意
它的无用没有发生仍然是负面结果
即使我添加了最后输入也没有任何反应
由于您使用的是PDO准备好的语句来执行SQL查询,因此无需手动转义SQL Injection的输入。
您可以在提交参数时传递它们:
$first = $_POST['first'];
$last = $_POST['last'];
$data->execute(array(':first' => $first, ':last' => $last));
扩展程序将负责其余的工作。
注意:这仅是警告,当您尝试在新版本的PHP中使用mysql_*扩展功能时,都会得到警告。
注意2:这仅能保护您免受SQL Injection攻击,因此请记住,恶意用户还可以通过多种其他方式使用XSS和无数其他攻击来利用您的代码。
**更新**
如果谨慎处理该变量,则不必担心警告。要摆脱它,您可以使用:
$first = filter_input(INPUT_SERVER, 'first', FILTER_SANITIZE_STRING)
$last = filter_input(INPUT_SERVER, 'last', FILTER_SANITIZE_STRING)
NetBeans 7.4 for PHP上警告"不要直接访问Superglobal $ _POST阵列"
什么是最好的方法来保护免受这种或我可以使用什么方法
正如我在回答中所说,由于您正在使用准备好的语句,因此您已经受到MySQL注入的保护,而mysqli真正的转义字符串可以保护您免受这种类型的攻击。
无论如何,但是我如何添加mysql_real_escape_string ???
您不必,那就是重点。 因为您正在使用PDO,所以只需按照我的答案使用代码即可。
收到警告时不要直接访问超级全局$ _POST