我认为黑客(或脚本小子)使用网站代码库的漏洞攻击了我的网站.数据库中的帖子已更改,以便它们包含此html:
<meta http-equiv="refresh" content="0;url=http://example.com"/>
Run Code Online (Sandbox Code Playgroud)
但我现在无法改写系统.有什么策略可以防止将来发生这种情况?
我正在考虑将管理脚本迁移到允许访问某些域的子域.或者使用mod_security SecFilterScanPOST并扫描包含http-equiv等的所有发布请求.或者只允许来自我的服务器或所有这些请求的帖子请求?
谢谢.
最近,我在一些客户的网站上进行了审计.他们回来的一件事是我可以更好地消毒输入数据,因为人们仍然可能对数据库造成潜在的伤害.
下面的功能是我目前正在使用的(旧开发人员的剩余部分),但我看不出潜在问题可能存在的地方.
传递给数据库的字符串将通过XML显示,而XML又由Flash应用程序读取.
谁能告诉我我可能会缺少什么?谢谢
function secure_string($string)
{
return (strip_tags(addslashes(mysql_real_escape_string(
stripslashes($string)))));
}
Run Code Online (Sandbox Code Playgroud) 我目前有一个相当强大的服务器端验证系统,但我正在寻找一些反馈,以确保我已涵盖所有角度.以下是我正在做的事情的简要概述:
确保输入不为空或太长
转义查询字符串以防止SQL注入
使用正则表达式来拒绝无效字符(这取决于提交的内容)
编码某些html标记,例如<script>(所有标记在存储在数据库中时都会被编码,有些标记在查询时会被解码以在页面中呈现)
有什么我想念的吗?代码示例或正则表达式欢迎.
假设我有一个数组并且我想检查一个元素是否是该数组的一部分,我可以继续使用in_array(needle,haystack)来确定结果.我试图看到PHP相当于我的目的.现在你可能有一个即时的答案,你可能会想说"使用IN".是的,我可以使用IN,但这并没有取得预期的结果.让我用一个例子来解释一下:
我在DB表中有一个名为"pets"的列.对于记录,它有一个值:Cat,dog,Camel (是的,列数据是逗号分隔值).请考虑此行的id为1.
现在我有一个表单,我可以在表单输入中输入值,并使用该值检查数据库中的值.所以说我在表单输入中输入以下逗号分隔值:CAT,camel (是的,CAT是大写和有意的,因为有些用户倾向于以这种方式输入).
现在当我在输入和提交表单中输入上述信息时,我可以收集POST信息并使用以下查询:
$search = $_POST['pets'];
$sql = "SELECT id FROM table WHERE pets IN ('$search') ";
Run Code Online (Sandbox Code Playgroud)
上面的查询没有提取DB中已经存在的行(还记得有cat,dog,Camel作为pets列的值的记录吗?).我试图让记录充当超集,并将表单输入的值作为子集.所以在这种情况下,我希望id值显示为列中存在的值,但这不会发生.
现在说如果我只输入CAT作为表单输入并执行搜索,它应该显示ID 1行.
现在说如果我输入camel,cAT作为表单输入并执行搜索,它应该显示ID 1行.
我怎样才能实现上述目标?
谢谢.
可能的重复:
PHP:最终的清洁/安全功能用PHP 清理
用户输入的最佳方法是什么?
我应该在我的函数中添加什么来确保传递它的每个字符串都是"服务器友好的"?我使用这个小函数来检查包含名称,电子邮件地址和ID的输入.
function checkInput($str) {
$str = @strip_tags($str);
$str = @stripslashes($str);
$str = mysql_real_escape_string($str);
return $str;
}
Run Code Online (Sandbox Code Playgroud) 我有一个表格,用户可以填写新闻文章.这包含标题和正文.对于每个具有唯一标题的页面,我在<title>-tags中使用用户输入(标题):
<title>$userinput</title>
Run Code Online (Sandbox Code Playgroud)
我想知道 - 用户是否可以通过这种方式执行XSS攻击?我应该使用htmlspecialchars?来逃避此用户输入吗?
这同样适用于<meta>-tags.我正在使用用户输入进行描述:
<meta name="description" content="$userinput" />
Run Code Online (Sandbox Code Playgroud)
用户可以执行跨站脚本攻击<title>和<meta>标签都有效?
我在这样的变量中有HTML内容.
$message ="<div>
<table align='center'>
<tr><td><h1>Reporte de Tipo de Documentos</h1></td></tr>
<tr><td><h2>Farmaceutica MDC</h2></td></tr>
</table>
</div>
<div>
<table style='width:960px; margin:0 auto;'>
<tr colspan='7'>
<td><?php echo 'Fecha: '".$time = date('d/m/Y h:i:s A')."; ?></td>
</tr>
<tr bgcolor='#CCCCCC' height='30'>
<td><b>Sr. No.</b></td>
<td><b>Tipo Documento</b></td>
<td><b>Cant. Pasos</b></td>
<td><b>Costo</b></td>
<td><b>Precio</b></td>
<td><b>Balance</b></td>
<td><b>Notifica Cliente</b></td>
</tr>
</table>";
Run Code Online (Sandbox Code Playgroud)
我想打印此HTML内容的打印输出页面.就像我们使用的网页一样
<script type="text/javascript">
function printpage()
{
window.print();
}
</script>.
Run Code Online (Sandbox Code Playgroud)
那么我用什么来打印上面的HTML内容呢?
我有以下表格供用户填写:
<form name="form" action="" method="POST">
<table width="100%" border="0" cellpadding="2" cellspacing="2">
<tr>
<td width="25%" ><div align="right"><strong>Name:</strong></div></td>
<td width="75%" ><span id="sprytextfield1">
<input id="Cname"name="Name" type="text" placeholder="Please fill in your name">
<span class="textfieldRequiredMsg">A value is required.</span></span></td>
</tr>
<tr>
<td><div align="right"><strong>Email:</strong></div></td>
<td><span id="sprytextfield2">
<input id="Cemail"name="email" type="text" placeholder="e.g sales@company.co.uk">
<span class="textfieldRequiredMsg">A value is required.</span><span class="textfieldInvalidFormatMsg">Invalid format.</span></span></td>
</tr>
<tr>
<td><div align="right"><strong>Phone Number:</strong></div></td>
<td>
<input id="Cphone" name="Phone" type="text"placeholder="e.g. 5555-6666666">
</td>
</tr>
<tr>
<td> </td>
<td><input name="Manufacturer" type="hidden" value="<?php echo $row_emailProduct['Manufacturer']; ?>">
<input name="Model" type="hidden" value="<?php echo $row_emailProduct['Model']; ?>">
<input …Run Code Online (Sandbox Code Playgroud) 我拥有一个你有状态框的在线游戏.您可以根据自己的感受更新它.我遇到的问题是用户将java脚本标记放入消息并进入状态.所以当另一个用户来到他们的页面时,会弹出一个弹出框,说哈哈或他们想要的任何东西.
然后我通过使用停止了
$status = mysql_real_escape_string($_POST['status']);
$foo = preg_replace('/[^a-z]/i', null, $status );
Run Code Online (Sandbox Code Playgroud)
这已经停止了任何JavaScript的运行,但现在当有人向某人发送消息时,它会占用空格,因此消息"你好吗"它将显示"howareyou".当然这是安全的,但用户无法读取消息.是否还有其他方法可以阻止脚本标签插入到可用但仍允许空格的情况下?
我也真的害怕有人用XSS攻击我.因为以前,我被告知用户可以在消息中输入内容然后当其他用户打开它时,它会向他们发送密码.....
我有函数,首先:JS:
$(document).ready(function() {
//dodavanje novog racuna
$(function() {
$('#addFieldForm').submit(function(e) {
e.preventDefault();
if ( $(this).parsley('validate') ) {
$.ajax({
url: "insertRacun.php",
type: "POST",
async: true,
data: { sifra:sifra,brojracuna:$("#brojracuna").val(),sufiks:$("#sufiks").val(),kupac:$("#kupac").val(),adresa:$("#adresa").val(),grad:$("#grad").val(),pib:$("#pib").val(),total:$("#total").text(),valuta:$("#valuta").val(),nacin:$("#nacin").val(),datum:$("#datum").val(),rok:$("#rok").val(),isporuka:$("#isporuka").val(),napomena:$("#napomena").val(),interna:$("#interna").val(),ponovi:$("#ponovi").val()},
dataType: "html",
etc...
Run Code Online (Sandbox Code Playgroud)
php:
try {
$STH = $db->prepare("INSERT INTO racuni (br, sufiks, kupac, adresa, grad, pib, total,valuta,nacin,datum,rok,isporuka,napomene,interne, user_id,sifra) VALUES (:0,:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15)");
$STH->bindParam(':0', $_POST['brojracuna']);
$sufiks=$_POST['sufiks'];
$STH->bindParam(':1', $sufiks);
$STH->bindParam(':2', $_POST['kupac']);
$STH->bindParam(':3', $_POST['adresa']);
etc....
Run Code Online (Sandbox Code Playgroud)
当我尝试添加时:
Luciansdasadsda"><script>alert(1)</script>
Run Code Online (Sandbox Code Playgroud)
然后我在数据库中获得相同的值。
那么如何在我的代码中防止 XSS 和 SQL 注入呢?还如何防止拒绝服务(导致创建过多的行)?
php ×10
mysql ×4
security ×4
xss ×3
html ×2
apache ×1
javascript ×1
pdo ×1
regex ×1
search ×1
server-side ×1
string ×1
validation ×1