我的一些编码遇到了一些问题,我不情愿地在我的脚本中发现了可能的sql注入,我似乎无法解决这个问题,所以我想知道周围的人是否可以提供帮助它
我可以说我编写脚本很好吗,我只是完全不知道数据库注入是如何发生的,它们是如何工作的或者如何防止它们,但很明显我的清理功能不能按预期工作。 / p>
以下是令人讨厌的代码块,当我在 id 之后添加以下内容时,它会吐出一个MySQL错误,我已经读过很多关于这意味着我的代码易受攻击的错误。
&id=369';
因此,只需添加逗号和分号就可以打破MySQL查询,这是不可取的。以下是处理查询并显示数据的代码;
$id = $this->clean($_GET['id']);
#$id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_STRING);
$pm_query = mysql_query("SELECT * FROM `staff_pm` WHERE `id` = '{$id}' AND `status` IN(0, 1)") or die(''.mysql_error());
所以我尝试了PHP中的一个集成函数,但是吐出了相同的sql错误,这是我之前被告知的清理功能很好:
function clean( $str )
{
return mysql_real_escape_string( htmlspecialchars( trim( $str ) ) );
}
真的很想知道你对此事的看法,我一直担心我的编码会被寻找这类漏洞的人利用,我真的想确保它是由划伤并学习一些技巧来更好地保护它。
我被告知要转换为PDO,但这似乎是一个很大的转换工作,我会等到我重新创建应用程序之前,我会去做更多的对象 - 定向的方法。
我收到的SQL错误是:
您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在'\'附近使用正确的语法;第1行的
status
IN(0,1)'
感谢您的帮助,我真的很感激。
此致
答案 0 :(得分:2)
这家伙说的是:使用预准备语句和参数化查询。
答案 1 :(得分:1)
我还建议不要使用过时的mysql_*
函数,而是使用PDO。
但要修复现有代码,请使用intval
。
$id = intval($_GET['id']);
答案 2 :(得分:1)
对我来说,您的id
列似乎是整数类型,并且您尝试将其与'369\''
进行比较?
将id
列与'369'
进行比较是有效的(至少在mysql中),但不是将整数与非整数字符串进行比较。