我希望有一个函数表现为mysql_real_escape_string而不连接数据库,因为有时我需要在没有数据库连接的情况下进行干测试.不推荐使用mysql_escape_string,因此不合需要.我的一些发现:
http://www.gamedev.net/community/forums/topic.asp?topic_id=448909
所以这是我们都应该知道的事情,并且在我第一次看到它时就在我的脑海中浮现.
我知道这mysql_escape_string是从5.3推荐的,但实际的差异是什么mysql_real_escape_string.
我认为这mysql_real_escape_string是完全相同的mysql_escape_string除了mysql_real_escape_string为mysql资源采取第二个参数.
所以我认为,如何处理字符串必须有一些区别,因为不需要2个函数.
所以我认为差异完全取决于语言环境和字符编码.?
任何人都可以为我清除这个吗?
我被告知我会更好地使用PDOMySQL转义,而不是mysql_real_escape_string.
也许我有一个脑死亡的日子(或者可能是因为我没有想象力是一个天生的程序员,而且我仍然处于PHP的新手阶段),但是检查了PHP手册并阅读了关于PDO的条目,我仍然不清楚PDO究竟是什么以及为什么它比使用更好mysql_real_escape_string.这可能是因为我还没有真正掌握OOP的复杂性(我假设它与OOP有关),但除了变量和数组值似乎在其前面有冒号之外,我仍然不确定它到底是什么以及你如何使用它(以及为什么它比它好mysql_real_escape_string.(它也可能与我没有真正理解'类'是什么的事实有关,所以,当我读到"PDO课程"时,我真的不是更聪明的.
在MySQL网站的"开发者专区"中读过一两篇文章后,我仍然不清楚.由于我现在甚至无法弄清楚它到底是什么,我认为现在可能使用它有点超出我的范围,但我仍然有兴趣扩大我的教育并找出如何改进的方法.
任何人都可以用"简单的英语"向我解释PDO是什么(或指向我用简单英语写的主题的方向),以及你如何使用它?
我有问题使用PHP/MySQL转义/剥离字符串 - 似乎总是有多余的斜杠.
我们以下面的字符串为例:
<span style="text-decoration:underline;">underline</span>
Run Code Online (Sandbox Code Playgroud)
在向数据库添加字符串时,我将其转义mysql_real_escape_string()并将以下内容存储在数据库中(编辑:通过使用mysql app直接查询数据库来检查):
<span style=\\\"text-decoration:underline;\\\">underline</span>
Run Code Online (Sandbox Code Playgroud)
从数据库中读回来时,我正在传递字符串,stripslashes()并返回以下内容:
<span style=\"text-decoration:underline;\">underline</span>
Run Code Online (Sandbox Code Playgroud)
由于引号仍然被转义,它会破坏html并且文本没有加下划线.
mysql_real_escape_string()添加三个斜杠,并stripslashes()删除两个斜杠?我希望他们都添加/删除一个斜杠.我有以下代码:
function dbPublish($status)
{
global $dbcon, $dbtable;
if(isset($_GET['itemId']))
{
$sqlQuery = 'UPDATE ' . $dbtable . ' SET active = ? WHERE id = ?';
$stmt = $dbcon->prepare($sqlQuery);
$stmt->bind_param('ii', $status, $_GET['itemId']);
$stmt->execute();
$stmt->close();
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下我需要mysql_real_escape_string还是我还好吗?
我刚搬到一家新的托管公司,现在每当一个字符串被转义时使用:
mysql_real_escape_string($str);
Run Code Online (Sandbox Code Playgroud)
斜杠仍保留在数据库中.这是我第一次看到这种情况发生,因此我的脚本都没有使用
stripslashes()
Run Code Online (Sandbox Code Playgroud)
了.
这是在一个运行php 5.2.6的CentOS 4.5 64bit作为lighttpd 1.4服务器上的fastcgi.我确保所有magic_quotes选项都关闭,mysql客户端api是5.0.51a.
我在所有6个网络服务器上都遇到了同样的问题.
任何帮助,将不胜感激.
谢谢.
我在这里看到一些人说使用连接查询mysql_real_escape_string不会保护你(完全)免受SQL注入攻击.
但是,我还没有看到一个输入示例,它说明了一种mysql_real_escape_string无法保护你的攻击.大多数示例忘记了mysql_query仅限于一个查询并且使用mysql_real_escape_string不正确.
我能想到的唯一例子如下:
mysql_query('DELETE FROM users WHERE user_id = '.mysql_real_escape_string($input));
Run Code Online (Sandbox Code Playgroud)
这不会保护您免受以下输入:
5 OR 1=1
Run Code Online (Sandbox Code Playgroud)
我认为这是错误的使用mysql_real_escape_string而不是缺点,它是为字符串而不是数值设计的.您应该转换为数字类型,或者如果要在清理时将输入视为字符串,则应在查询中执行相同操作并在其周围加上引号.
任何人都可以提供一个可以绕过的输入示例mysql_real_escape_string,它不依赖于对数值的错误处理或忘记mysql_query只能执行一个查询吗?
编辑:我对它的局限性感兴趣,mysql_real_escape_string而不是将它与替代品进行比较,我意识到新项目有更好的选择,我并不反对.
我试图保护自己免受sql注入并使用:
mysql_real_escape_string($string);
Run Code Online (Sandbox Code Playgroud)
发布HTML时,它看起来像这样:
<span class="\"className\"">
<p class="\"pClass\"" id="\"pId\""></p>
</span>
Run Code Online (Sandbox Code Playgroud)
我不确定real_escape_string添加了多少其他变体,所以不想只替换一些并错过其他...我如何将其"解码"回到格式正确的HTML中,例如:
html_entity_decode(stripslashes($string));
Run Code Online (Sandbox Code Playgroud) 我需要在我的mysql数据库中输入company_name(由用户通过表单给出).我用的时候
$company = mysqli_real_escape_string($_POST['company_name'])
Run Code Online (Sandbox Code Playgroud)
我收到一个错误
Warning: mysqli_real_escape_string() expects exactly 2 parameters, 1 given in /opt/lampp/htdocs/Abacus-Version-2/admin/Company/insert_company.php on line 58
Run Code Online (Sandbox Code Playgroud)
但是使用时一切似乎都很好
$company = mysql_real_escape_string($_POST['company_name'])
Run Code Online (Sandbox Code Playgroud)
在这种情况下我该怎么办?
假设我的数据库设置如下,使用utf-8(mysql中的完整4mb版本)
mysql_query("SET CHARACTER SET utf8mb4");
mysql_query("SET NAMES utf8mb4");
Run Code Online (Sandbox Code Playgroud)
在将字符串放入sql之前,我使用mysql_real_escape_string来逃避不需要的字符(注意 - 我不是在寻找切换到PDO的建议,我想确定mysql_real_escape_string是否可以安全地防止超长的utf8等).
$input = mysql_real_escape_string($_POST['field']);
$sql = "SELECT * FROM `table` WHERE `header`='$input'";
Run Code Online (Sandbox Code Playgroud)
在执行我的mysql_real_escape_string之前,是否需要对$ _POST ['field']进行验证(例如检查字符串是否有效且不会过长并且不包含无效序列等)?