为了防注入,对sql查询语句加转义addslashes后,语句语法出现问题
【php mysql的一个项目】
有一个用户,用户名是admin,密码是admin。
查询语句是:
<code>$sql="select * from table_project where a_username='{$username}' and a_password='{$password}';"; </code>
然后查询:
<code>$res=mysql_query($sql); ……省略 </code>
因为防止sql注入,所以想在sql语句查询之前都进行一下转义,所以用addslashes对$sql语句转义了一下,但是就出错了。
<code>$sql=addslashes($sql); $res=mysql_query($sql); </code>
在没有加转义的那一行代码前,用admin,admin可以顺利登录。
加了之后,用admin,admin登录后,捕捉了如下错误,请教大牛们怎么破?
<code>错误编号:1064 错误内容:You have an error in your SQL syntax;check the manual that corresponds to your MySQL server version for the right syntax to use near '\'admin\' and a_password=\'21232f297a57a5a743894a0e4a801fc3\'' at line 1 </code>
多谢!
回复内容:
【php mysql的一个项目】
有一个用户,用户名是admin,密码是admin。
查询语句是:
<code>$sql="select * from table_project where a_username='{$username}' and a_password='{$password}';"; </code>
然后查询:
<code>$res=mysql_query($sql); ……省略 </code>
因为防止sql注入,所以想在sql语句查询之前都进行一下转义,所以用addslashes对$sql语句转义了一下,但是就出错了。
<code>$sql=addslashes($sql); $res=mysql_query($sql); </code>
在没有加转义的那一行代码前,用admin,admin可以顺利登录。
加了之后,用admin,admin登录后,捕捉了如下错误,请教大牛们怎么破?
<code>错误编号:1064 错误内容:You have an error in your SQL syntax;check the manual that corresponds to your MySQL server version for the right syntax to use near '\'admin\' and a_password=\'21232f297a57a5a743894a0e4a801fc3\'' at line 1 </code>
多谢!
少年,PDO才是王道.mysqli也行。
<code>php</code><code>$db = new PDO('mysql:host=127.0.0.1;dbname=test;charset=utf8','root','rootpass'); $stm = $db->prepare("select * from test where field = :value"); $stm->bindValue(':value',$_GET['field'],PDO::PARAM_STR); $stm->execute(); $rows = $stm->fetchAll(PDO::FETCH_ASSOC); var_dump($rows); </code>
再不济mysqli也可以。
<code>php</code><code>$db = new mysqli('127.0.0.1','root','rootpass','database_name'); $stmt = $db->prepare("select * from test where field = ?"); $stmt->bind_param('s',$_GET['field']); $stmt->execute(); $rows = array(); while ($row = $stmt->fetch()) array_push($rows,$row); var_dump($rows); </code>
如果应用程序只使用预处理语句,可以确保不会发生SQL 注入。
------ php 手册 预处理语句
放弃mysql_query的写法吧,用pdo,另外建议不要使用addslashes,mysqli或者pdo有现成的转义方法
<code>$username = 'aaa'; $password = 'bbb'; $sql="select * from table_project where a_username='{$username}' and a_password='{$password}';"; echo addslashes($sql); select * from table_project where a_username=\'aaa\' and a_password=\'bbb\'; </code>
用来包裹字符串的单引号被转义了当然报错了。
另外还是建议使用PDO
好吧,我小白了。
我在用户名变量那个地方做了转义,没有对整个sql语句做转义,然后就好了。
<code>$username=addslashes($username); $password=md5($password); $sql="select * from table_project where...;"; </code>
密码是md5转换后的,用户名用addslashes转义后,然后放到sql语句中查询,貌似这样就行了。
不知道一般的项目中是不是也是这样处理的啊?
<code>php</code><code>$username=mysql_real_escape_string($username); $password=mysql_real_escape_string($password); $sql="select * from table_project where a_username='{$username}' and a_password='{$password}';"; </code>
使用PDO,参数化查询,不要使用拼接字符串的方式。注意使用PDO需要先在php.ini里面开启该功能
你不能对整个SQL语句转义,需要转义的仅仅是变量而已。
<code> $username=addslashes($username); $sql="select * from table_project where a_username='{$username}' and a_password='{$password}';"; </code>
addslashes() 函数在指定的预定义字符前添加反斜杠。
这些预定义字符是:
单引号 (')
双引号 (")
反斜杠 ()
NULL
而加上的意义在于mysql把它当作字符串来对待。
你不可以对$sql进行。如果你对整个$sql进行addslashes ,你可以打印一下你的sql语句,肯定是不正确的。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

MySQL和phpMyAdmin是强大的数据库管理工具。1)MySQL用于创建数据库和表、执行DML和SQL查询。2)phpMyAdmin提供直观界面进行数据库管理、表结构管理、数据操作和用户权限管理。

IIS和PHP可以兼容,通过FastCGI实现。1.IIS通过配置文件将.php文件请求转发给FastCGI模块。2.FastCGI模块启动PHP进程处理请求,提高性能和稳定性。3.实际应用中需注意配置细节、错误调试和性能优化。

在MySQL中,外键的作用是建立表与表之间的关系,确保数据的一致性和完整性。外键通过引用完整性检查和级联操作维护数据的有效性,使用时需注意性能优化和避免常见错误。

MySQL和MariaDB的主要区别在于性能、功能和许可证:1.MySQL由Oracle开发,MariaDB是其分支。2.MariaDB在高负载环境中性能可能更好。3.MariaDB提供了更多的存储引擎和功能。4.MySQL采用双重许可证,MariaDB完全开源。选择时应考虑现有基础设施、性能需求、功能需求和许可证成本。

SQL是一种用于管理关系数据库的标准语言,而MySQL是一个使用SQL的数据库管理系统。SQL定义了与数据库交互的方式,包括CRUD操作,而MySQL实现了SQL标准并提供了额外的功能,如存储过程和触发器。

多次调用session_start()会导致警告信息和可能的数据覆盖。1)PHP会发出警告,提示session已启动。2)可能导致session数据意外覆盖。3)使用session_status()检查session状态,避免重复调用。

MySQL适合快速开发和中小型应用,Oracle适合大型企业和高可用性需求。1)MySQL开源、易用,适用于Web应用和中小型企业。2)Oracle功能强大,适合大型企业和政府机构。3)MySQL支持多种存储引擎,Oracle提供丰富的企业级功能。

AI可以帮助优化Composer的使用,具体方法包括:1.依赖管理优化:AI分析依赖关系,建议最佳版本组合,减少冲突。2.自动化代码生成:AI生成符合最佳实践的composer.json文件。3.代码质量提升:AI检测潜在问题,提供优化建议,提高代码质量。这些方法通过机器学习和自然语言处理技术实现,帮助开发者提高效率和代码质量。
