应使用预处理语句(PDO/MySQLi)、白名单验证动态SQL片段、输出时上下文编码、禁用危险函数并限制数据库权限来防止SQL注入。

如果您的PHP网站直接将用户输入拼接到SQL查询语句中,攻击者可能通过构造恶意输入篡改数据库操作逻辑,从而读取、修改或删除敏感数据。以下是防止SQL注入攻击的多种有效方法:
一、使用预处理语句(PDO)
预处理语句将SQL结构与参数分离,数据库驱动自动对参数进行转义和类型校验,从根本上阻断注入路径。
1、通过PDO连接数据库时设置错误模式为异常模式,便于及时捕获错误。
2、使用prepare()方法定义含占位符的SQL语句,例如"SELECT * FROM users WHERE id = ?"或"SELECT * FROM users WHERE username = :name"。
立即学习“PHP免费学习笔记(深入)”;
3、调用execute()方法传入参数数组,参数值由PDO底层安全绑定,不参与SQL语法解析。
4、避免在prepare()中拼接任何用户可控字符串,包括表名、字段名和ORDER BY子句。
二、使用预处理语句(MySQLi)
MySQLi扩展同样支持面向对象和过程式两种预处理方式,其参数绑定机制与PDO一致,确保用户输入仅作为数据而非代码执行。
1、创建MySQLi连接后,调用prepare()方法传入参数化SQL语句。
2、使用bind_param()方法指定参数类型(如"s"表示字符串、"i"表示整型)并绑定变量。
3、调用execute()执行预处理语句,此时用户输入不会影响SQL语法结构。
4、对多参数语句需严格按顺序和类型匹配bind_param()中的参数声明。
三、对输入数据进行白名单验证
针对无法使用预处理的动态SQL片段(如表名、排序字段、WHERE条件字段),必须采用严格白名单校验,拒绝一切未明确允许的输入值。
1、将合法字段名、表名、排序方向等预先定义为常量数组,例如$allowed_tables = ['users', 'orders', 'products']。
NetShop软件特点介绍: 1、使用ASP.Net(c#)2.0、多层结构开发 2、前台设计不采用任何.NET内置控件读取数据,完全标签化模板处理,加快读取速度3、安全的数据添加删除读取操作,利用存储过程模式彻底防制SQL注入式攻击4、前台架构DIV+CSS兼容IE6,IE7,FF等,有利于搜索引挚收录5、后台内置强大的功能,整合多家网店系统的功能,加以优化。6、支持三种类型的数据库:Acces
2、接收用户输入后,使用in_array()函数判断其是否存在于白名单中。
3、若校验失败,立即终止请求并返回HTTP 400错误,不执行任何数据库操作。
4、禁止使用filter_var()、intval()等通用过滤函数替代白名单判断关键结构标识符。
四、对输出内容进行上下文编码
当从数据库读取的数据需嵌入HTML、JavaScript或URL等不同上下文时,未正确编码可能导致二次注入或XSS,间接削弱SQL防护效果。
1、嵌入HTML正文时,使用htmlspecialchars($data, ENT_QUOTES, 'UTF-8')转义特殊字符。
2、嵌入JavaScript字符串时,使用json_encode($data, JSON_UNESCAPED_UNICODE)生成安全JSON值。
3、嵌入URL参数时,使用rawurlencode()对值进行编码,而非urlencode()。
4、禁止将未经编码的数据库字段直接拼接进HTML属性、事件处理器或script标签内。
五、禁用危险函数并限制数据库权限
消除潜在攻击面并遵循最小权限原则,可显著降低SQL注入成功后的危害程度。
1、在php.ini中禁用mysql_query()、mysql_real_escape_string()等已废弃且易误用的函数。
2、为Web应用分配专用数据库账户,仅授予SELECT、INSERT、UPDATE、DELETE等必要权限,严禁授予DROP、ALTER、CREATE、EXECUTE、FILE等高危权限。
3、关闭数据库错误信息的外部暴露,将display_errors设为Off,记录错误至服务器日志而非页面输出。
4、对phpinfo()页面、数据库配置文件、备份文件等敏感资源设置Web服务器访问限制。










