数码资讯
防止PHP注入SQL的最佳方法是什么
如果用户输入一个直接插入SQL语句的查询,应用程序将很容易地注入SQL,如下面的示例: 复制代码代码如下所示: unsafe_variable美元美元'user_input_post { } =; mysql_query(插入表格(列)的值('),unsafe_variable美元。); 这是因为用
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
如果用户输入一个直接插入SQL语句的查询,应用程序将很容易地注入SQL,如下面的示例:
复制代码代码如下所示:
unsafe_variable美元美元'user_input_post { } =;
mysql_query(插入表格(列)的值('),unsafe_variable美元。);
这是因为用户可以输入类似的值);下拉表表:
复制代码代码如下所示:
插入表格(列)的值(币值的下降);表;
我们应该做些什么来防止这种情况呢
使用准备声明与任何参数的query.sql报表参数发送到数据库服务器和解析!攻击者不可能希望恶意注入SQL!
基本上有两种选择来实现这个目标:
1。使用PDO(PHP数据对象):
复制代码代码如下所示:
美元美元支撑= PDO ->准备('select *从员工那里姓名:名字);
支撑美元->执行(阵列($名称:名称= >));
foreach($为达行){
有$行/做某事
}
2。使用mysqli:
复制代码代码如下所示:
美元美元支撑=类->准备('select *从员工那里名称=);
支撑美元-> bind_param(是的,$的名字);
支撑美元->执行();
结果=美元美元支撑-> get_result();
而($行= $结果-> fetch_assoc()){
有$行/做某事
}
PDO(PHP数据对象)
注意,这不是默认使用PDO访问MySQL数据库的预定义报表。为了解决这个问题,您必须禁用的准备好的语句。
创建连接使用PDO的例子如下:
复制代码代码如下所示:
美元类=新PDO('mysql:北京测试;主机= 127.0.0.1;字符集= UTF8,用户,往);
美元类-> setAttribute(PDO::attr_emulate_prepares,假);
美元类-> setAttribute(PDO::::attr_errmode,PDO errmode_exception);
在上面的例子中,这个错误模式errmode不是必要的,但建议添加它。这种方法脚本时不停止运行误差产生一个致命的错误,捕捉任何错误的机会(当开发商抛出PDOException例外)。
setAttribute()线是强制性的,它讲述了PDO禁用模拟预备声明和使用一个真正的借口声明。这确保报表和值不解析PHP之前发送到MySQL数据库服务器(攻击者没有机会注入恶意SQL)。
当然,你可以设置字符集参数的构造函数选项,特别要注意'老'的PHP版本(5.3.6)将忽略字符在DSN设置参数。
解释(解释)
当您通过SQL初步语句时,数据库服务器解析和编译会发生什么情况告诉数据库引擎要通过指定字符过滤的内容(在上面的示例中,如A或名称):然后调用执行来执行准备好的前缀语句和指定的参数值。
这里最重要的是,参数值组合和预编译的语句,而不是SQL的工作原理和string.sql注射是通过欺骗SQL脚本包括恶意字符串发送到数据库的创建。因此,通过发送独立的SQL来发送实际参数,您将降低使用风险的准备。您发送的任何参数的声明只会被视为字符串(虽然优化,数据库引擎可能会做一些参数,当然可能最终是数字)。在上面的例子中,如果变量$name contains'sarah;删除员工,结果只会是一个搜索字符串'Sarah删除;*员工
使用就绪句的另一个优点是,如果在同一个会话中多次执行同一语句,它将只进行一次解析和编译,从而使您获得一些速度增长。
好吧,既然你问如何插入,这里有一个例子(使用PDO):
复制代码代码如下所示:
美元美元->准备PreparedStatement =分贝('insert为表(列)的值(:柱));
$ PreparedStatement ->执行(阵列($ unsafevalue:柱= >));
复制代码代码如下所示:
unsafe_variable美元美元'user_input_post { } =;
mysql_query(插入表格(列)的值('),unsafe_variable美元。);
这是因为用户可以输入类似的值);下拉表表:
复制代码代码如下所示:
插入表格(列)的值(币值的下降);表;
我们应该做些什么来防止这种情况呢
使用准备声明与任何参数的query.sql报表参数发送到数据库服务器和解析!攻击者不可能希望恶意注入SQL!
基本上有两种选择来实现这个目标:
1。使用PDO(PHP数据对象):
复制代码代码如下所示:
美元美元支撑= PDO ->准备('select *从员工那里姓名:名字);
支撑美元->执行(阵列($名称:名称= >));
foreach($为达行){
有$行/做某事
}
2。使用mysqli:
复制代码代码如下所示:
美元美元支撑=类->准备('select *从员工那里名称=);
支撑美元-> bind_param(是的,$的名字);
支撑美元->执行();
结果=美元美元支撑-> get_result();
而($行= $结果-> fetch_assoc()){
有$行/做某事
}
PDO(PHP数据对象)
注意,这不是默认使用PDO访问MySQL数据库的预定义报表。为了解决这个问题,您必须禁用的准备好的语句。
创建连接使用PDO的例子如下:
复制代码代码如下所示:
美元类=新PDO('mysql:北京测试;主机= 127.0.0.1;字符集= UTF8,用户,往);
美元类-> setAttribute(PDO::attr_emulate_prepares,假);
美元类-> setAttribute(PDO::::attr_errmode,PDO errmode_exception);
在上面的例子中,这个错误模式errmode不是必要的,但建议添加它。这种方法脚本时不停止运行误差产生一个致命的错误,捕捉任何错误的机会(当开发商抛出PDOException例外)。
setAttribute()线是强制性的,它讲述了PDO禁用模拟预备声明和使用一个真正的借口声明。这确保报表和值不解析PHP之前发送到MySQL数据库服务器(攻击者没有机会注入恶意SQL)。
当然,你可以设置字符集参数的构造函数选项,特别要注意'老'的PHP版本(5.3.6)将忽略字符在DSN设置参数。
解释(解释)
当您通过SQL初步语句时,数据库服务器解析和编译会发生什么情况告诉数据库引擎要通过指定字符过滤的内容(在上面的示例中,如A或名称):然后调用执行来执行准备好的前缀语句和指定的参数值。
这里最重要的是,参数值组合和预编译的语句,而不是SQL的工作原理和string.sql注射是通过欺骗SQL脚本包括恶意字符串发送到数据库的创建。因此,通过发送独立的SQL来发送实际参数,您将降低使用风险的准备。您发送的任何参数的声明只会被视为字符串(虽然优化,数据库引擎可能会做一些参数,当然可能最终是数字)。在上面的例子中,如果变量$name contains'sarah;删除员工,结果只会是一个搜索字符串'Sarah删除;*员工
使用就绪句的另一个优点是,如果在同一个会话中多次执行同一语句,它将只进行一次解析和编译,从而使您获得一些速度增长。
好吧,既然你问如何插入,这里有一个例子(使用PDO):
复制代码代码如下所示:
美元美元->准备PreparedStatement =分贝('insert为表(列)的值(:柱));
$ PreparedStatement ->执行(阵列($ unsafevalue:柱= >));
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。