PHP防止SQL注入方法的详细解决方案

PHP防止SQL注入方法的详细解决方案
对问题的描述:

如果用户输入数据未经处理插入SQL查询语句,那么应用程序可能会遭受SQL注入攻击,如下示例:

复制代码代码如下所示:

unsafe_variable美元美元'user_input_post { } =;

mysql_query(插入`表`(`柱`)值('),unsafe_variable美元。);
因为用户的输入可能是这样的:

复制代码代码如下所示:

值;下拉表;—
然后SQL查询如下:

复制代码代码如下所示:

插入`表`(`柱`)值(币值的下降);表;中国)
应该采取什么有效的方法来防止SQL注入

最佳答案(来自西奥):

使用预处理语句和参数化查询,预处理语句和参数被发送到数据库服务器进行解析,这些参数将被视为普通字符,这样攻击者就不可能插入恶意SQL:

1。使用PDO:

复制代码代码如下所示:

美元美元支撑= PDO ->准备('select *从员工那里姓名:名字);
支撑美元->执行(阵列('name' = $名));
foreach($为达行){

有$行/做某事

}
2。使用mysqli:

复制代码代码如下所示:

美元美元支撑=类->准备('select *从员工那里名称=);

支撑美元-> bind_param(是的,$的名字);
支撑美元->执行();
结果=美元美元支撑-> get_result();

而($行= $结果-> fetch_assoc()){

有$行/做某事

}
PDO

注意,默认使用PDO不允许MySQL数据库进行实时预处理语句(原因如下)。为了解决这个问题,你应该禁止PDO模拟预处理语句,PDO创建数据库连接正确的使用的一个例子如下:

复制代码代码如下所示:

美元类=新PDO('mysql:北京测试;主机= 127.0.0.1;字符集= UTF8,用户,往);

美元类-> setAttribute(PDO::attr_emulate_prepares,假);

美元类-> setAttribute(PDO::::attr_errmode,PDO errmode_exception);
在上面的例子中,该attr_errmode是没有必要的,但建议添加它。这样,当一个致命的错误(错误)时,该脚本不停止运行,但给程序员一个机会捕捉pdoexceptions,以便作出适当的处理的错误。但是,第一setAttribute()调用是必要的。它禁止PDO模拟预处理语句,并使用真实的预处理语句,即MySQL执行预处理语句。这保证了报表和参数不在发送到MySQL PHP处理,这将使它不可能为攻击者注入恶意的SQL语句。理解的原因,我们可以参考这个博客:的PDO注射预防原理分析和注意使用PDO。注意在PHP的旧版本(< 5.3.6),你不能设置字符集对PDO构造函数,DSN是指:忽略字符集参数。

解析
将SQL语句发送到数据库服务器进行预处理和解析时会发生什么情况通过指定一个占位符(一个或一个以上的例子:名字),告诉数据库引擎你想过滤的地方。当你调用执行预处理语句将结合参数值指定。关键的一点是:参数的值是结合解析SQL语句,不SQL strings.sql注射液是一种恶意的字符串,包含在由触发脚本,SQL语句的建设。因此,通过分离参数的SQL语句,你防止SQL注入的风险。你所发送的任何参数的值将被视为普通的字符串不会被数据库服务器解析回到上面的例子,如果名字变is'sarah美元的价值,删除从员工,那么实际的查询将在员工寻找名称字段value'sarah ',从员工的记录删除,使用预处理语句的另一个优点是,如果执行同一句话在同一个数据库连接会话很多次,它会解决的只有一次,这可以提高执行速度。如果你想问做什么用的插入,看看下面的例子(使用PDO):

复制代码代码如下所示:

美元美元->准备PreparedStatement =分贝('insert为表(列)的值(:柱));

$ PreparedStatement ->执行(阵列('column ' = $ unsafevalue));

tag:解决方案方法详细电脑软件php

相关内容