PHP中如何防止sql注入网络安全

下面是OMG的小编辑器,用于收集和整理文章,希望对你有所帮助。


如果用户输入一个直接插入SQL语句的查询,应用程序将很容易地注入SQL,如下面的示例:


unsafe_variable美元美元'user_input_post { } =;


mysql_query(插入表格(列)的值('),unsafe_variable美元。);


这是因为用户可以输入一个类似的value);滴表;-使查询:


插入表格(列)的值(币值的下降);表;


我们应该做些什么来防止这种情况呢


使用准备声明与任何参数的query.sql报表参数发送到数据库服务器和解析!攻击者不可能向数据库中注入恶意SQL!


基本上有两种选择来实现这个目标:


1。使用PDO(PHP数据对象):


美元美元支撑= PDO ->准备('select *从员工那里姓名:名字);


支撑美元->执行(阵列($名称:名称= >));


foreach($为达行){


有$行/做某事


}


2。使用mysqli:


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


支撑美元-> bind_param(是的,$的名字);


支撑美元->执行();


$result = $stmt->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;删除员工,结果只会是搜索string'sarah;删除员工


使用就绪句的另一个优点是,如果在同一个会话中多次执行同一语句,它将只进行一次解析和编译,从而使您获得一些速度增长。


好吧,既然你问如何插入,这里有一个例子(使用PDO):


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


$ PreparedStatement ->执行(阵列($ unsafevalue:柱= >));