我刚刚开始使用 PDO 方法,现在我被一个小问题困住了。如果我创建一个表单来将名字和姓氏插入数据库,我可以使用以下代码插入所有类型的特殊字符:
try {
$db = new PDO('mysql:dbhost=' . $dbhost . ';dbname=' . $dbname, $dbuser, $dbpass);
$db -> exec("SET CHARACTER SET utf8");
} catch(PDOException $e) {
echo $e->getMessage();
}
$query = $db->prepare("INSERT INTO users(fname, lname) VALUES(:fname, :lname)");
$insert_array = array(
":fname" => $fname,
":lname" => $lname
);
$query->execute($insert_array);
$db = NULL;
我可以插入 ":;,-!"#¤%&&(%)?{][]}£$€{{{$@@_--" 没有任何问题,甚至插入 SQL 注入(inject)。但是当我尝试使用类似的代码更新数据库时,它确实接受所有类型的特殊字符,引号除外。这是为什么?我用来更新的代码是:
try {
$db = new PDO('mysql:dbhost=' . $dbhost . ';dbname=' . $dbname, $dbuser, $dbpass);
$db -> exec("SET CHARACTER SET utf8");
} catch(PDOException $e) {
echo $e->getMessage();
}
$query = $db->prepare("UPDATE users SET fname=:fname, lname=:lname WHERE userid=:userid");
$update_array = array(
":fname" => $fname,
":lname" => $lname,
":userid" => $_GET['userid']
);
$query->execute($update_array);
$db = NULL;
我很感激能得到的所有帮助。
-=SOLUTION=-
我必须使用 htmlspecialchars() 来“解码”字符串。像这样:
<form action="" method="post">
First name<br><input type="text" name="fname" value="'.htmlspecialchars($user['fname']).'">
Last name: <br><input type="text" name="lname" value="'.htmlspecialchars($user['lname']).'">
<input type="submit">
</form>
现在各种特殊字符完美运行。 感谢大家的帮助,真的很感激! :D
最佳答案
我相信 Waleed Khan 是正确的。在这种情况下不一定 xssing 自己(虽然这是一个明显的漏洞,你在这里展示并为此类攻击敞开大门),但据我所知只是破坏你的 html。
通过仅回显 $user['fname'] 和 $user['lname'] 原始值 - 其中包含来自先前提交的双引号 - 你无意中允许在绘制时过早关闭 html 元素属性值,从而破坏 HTML 表单。很惊讶它仍然提交。在您的浏览器中,检查 Firebug 之类的东西并检查表单 - 您应该看到输入的格式很奇怪,并且可能在它之后绘制了一些额外的字符。
始终使用 htmlentities()或其他类似的 PHP 值转义辅助函数,然后直接在 HTML 中回显它们。总是。
示例:
<form action="" method="post">
First name<br><input type="text" name="fname" value="<?php echo htmlentities( $user['fname'], ENT_COMPAT, 'UTF-8' ); ?>">
Last name: <br><input type="text" name="lname" value="<?php echo htmlentities( $user['lname'], ENT_COMPAT ); ?>">
<input type="submit">
</form>
编辑:关于你的说法“如果我删除表单值中的引号,它会用引号更新”,我认为这意味着你使用单引号而不是双引号设置你的 HTML 元素属性值 -引号,它真的根本不起作用。
如果用户提交的值带有单引号,它同样会破坏您的固定示例,因为值中的单引号会过早地关闭您的 HTML 元素属性值声明。使用双引号声明 HTML 元素属性值是最好的,但如果您在构建 HTML 元素时选择使用单引号,那么在 PHP 中,请使用 htmlentities($string, ENT_QUOTES)。
请务必研究 htmlentities 手册页,以确保您正确使用它。
关于php - PDO UPDATE 似乎不存储引号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18805685/
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我正在使用ruby1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\
我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.
Heroku支持人员告诉我,为了在我的Web应用程序中使用自定义字体(未安装在系统中,您可以在bash控制台中使用fc-list查看已安装的字体)我必须部署一个包含所有字体的.fonts文件夹里面的字体。问题是我不知道该怎么做。我的意思是,我不知道文件名是否必须遵循heroku的任何特殊模式,或者我必须在我的代码中做一些事情来考虑这种字体,或者如果我将它包含在文件夹中它是自动的......事实是,我尝试以不同的方式更改字体的文件名,但根本没有使用该字体。为了提供更多详细信息,我们使用字体的过程是将PDF转换为图像,更具体地说,使用rghostgem。并且最终图像根本不使用自定义字体。在
我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于
我正在使用Ruby1.8.7,试图生成一个带有\'字符的字符串,以便创建一个在MySQL中运行的脚本。结果应该是这样的:INSERTINTOtable(name,description)values('Joanad\'Arc','')但我不能在ruby字符串中只得到一个反斜杠。使用以下代码:string="INSERTINTOtable(name,description)values('Joanad\\'Arc','')"我得到了以下字符串:INSERTINTOtable(name,description)values('Joanad\\'Arc','')还有:string="IN
我正在关注Hartl的railstutorial.org并已到达11.4.4:Imageuploadinproduction.我做了什么:注册亚马逊网络服务在AmazonIdentityandAccessManagement中,我创建了一个用户。用户创建成功。在AmazonS3中,我创建了一个新存储桶。设置新存储桶的权限:权限:本教程指示“授予上一步创建的用户读写权限”。但是,在存储桶的“权限”下,未提及新用户名。我只能在每个人、经过身份验证的用户、日志传送、我和亚马逊似乎根据我的名字+数字创建的用户名之间进行选择。我已经通过选择经过身份验证的用户并选中了上传/删除和查看权限的框(而不
我正在使用mechanize登录网站,然后检索页面。我遇到了一些问题,我怀疑这是由于cookie中的某些值造成的。当Mechanize登录网站时,我假设它存储了cookie。如何通过Mechanize打印出存储在cookie中的所有数据? 最佳答案 代理有一个cookie方法。agent=Mechanize.newpage=agent.get("http://www.google.com/")agent.cookiesagent.cookies.to_scookie返回一个Mechanize::Cookiesobject
我以为它们存储在cookie中-但不,检查cookie没有任何结果。session也不存储它们。那么,我在哪里可以找到它们?我需要这个来直接设置它们(而不是通过flashhash)。 最佳答案 它们存储在inyoursessionstore.自rails2.0以来的默认设置是cookie存储,但请检查config/initializers/session_store.rb以检查您是否使用默认设置以外的东西。 关于ruby-on-rails-闪存消息存储在哪里?,我们在StackOverf
运行:ruby1.9.3p0和Rails3.2.1尝试使用rspec但当我尝试将其安装到我的应用程序中时出现以下错误:/Users/Si/.rvm/gems/ruby-1.9.3-p0/gems/railties-3.2.1/lib/rails/railtie/configuration.rb:85:in`method_missing':undefinedmethod`generators'for#(NoMethodError)from/Users/Si/.rvm/gems/ruby-1.9.3-p0/gems/rspec-rails-2.0.0.beta.18/lib/rspec-r